也称为“分辨率相关布局”。单个网站,针对不同分辨率使用不同的 CSS 文件来重新排列网站,以充分利用可用空间。
有一种 W3C 标准 方法来声明它们。一种方法是测试“device-width”,如下所示
<link rel="stylesheet" media="screen and (min-device-width: 800px)" href="800.css" />
上面的代码仅当查看它的设备宽度为 800px 或更宽时,才会将 800.css 样式应用于文档。并且…以这种方式支持“媒体查询”。
请记住,这是设备宽度,而不是浏览器窗口的当前宽度。在 iPhone(3G(s))上,这意味着 480px。我的新款 MacBook Pro 将为设备宽度返回 1920px。但此时我的实际浏览器窗口只有它的一半。在使用浏览器时,设备宽度可能始终占手机屏幕的 100%,因此在处理移动设备时非常有用,但在笔记本电脑/台式机浏览器中则不太有用。
在我看来,浏览器窗口的当前宽度(“视口”)更有用。我们甚至可以指定仅在视口宽度在两个不同的像素大小之间时才使用的样式表
<link rel='stylesheet' media='screen and (min-width: 701px) and (max-width: 900px)' href='css/medium.css' />
该样式表仅当当前浏览器窗口宽度在 701 到 900 像素之间时才会生效。
浏览器支持
IE 9+、Firefox 3.6+、Safari 3+、任何 Chrome、Opera 10+。 Mozilla 建议 在 <link /> 的 media 属性的开头使用“only”,这将隐藏不支持媒体查询的旧版浏览器中的样式表。这可能就是您想要做的,也可能不是…当然,具体情况视具体情况而定。
<link rel="stylesheet" media="only screen and (color)" href="example.css" />
通常,布局是很难推行“渐进增强”的事情之一。圆角变成方形,没什么大不了的。布局混乱,那是个大问题。像 iPhone 这样的设备现在非常好用,因为浏览器选择非常有限(过去只有 Mobile Safari,现在还有 Opera),而且它们都是非常好的浏览器,您可以依靠此类技术来发挥作用。
如果 IE 支持至关重要,我们始终可以使用 JavaScript!
使用 jQuery 实现
使用 JavaScript,我们可以测试窗口宽度并相应地更改活动 CSS 文件。这将在所有浏览器中都能正常工作。您可以像任何其他元素一样为 <link /> 元素添加 ID,因此让我们添加它
<link rel="stylesheet" type="text/css" href="main.css" />
<link id="size-stylesheet" rel="stylesheet" type="text/css" href="narrow.css" />
然后,我们可以将其用作挂钩并更改样式表的 href 值。浏览器将看到该更改,并取消应用旧的 CSS 并重新应用新链接的 CSS。我们将立即运行一次我们的微调测试,然后在每次窗口大小调整后运行。
function adjustStyle(width) {
width = parseInt(width);
if (width < 701) {
$("#size-stylesheet").attr("href", "css/narrow.css");
} else if (width < 900) {
$("#size-stylesheet").attr("href", "css/medium.css");
} else {
$("#size-stylesheet").attr("href", "css/wide.css");
}
}
$(function() {
adjustStyle($(this).width());
$(window).resize(function() {
adjustStyle($(this).width());
});
});
仅仅为了这个功能,jQuery 真的有必要吗?
不,但我相信您知道这只是我通常的做法,而且它使事情变得更容易。Kevin Hale 在 五年前 就写过关于动态分辨率布局的文章。它是“原生”JavaScript,并且至今仍然运行良好。
此外,还有一个很棒的 polyfill:Respond.js
视频
使用 CSS 实现分辨率相关布局,来自 Chris Coyier 在 Vimeo 上发布。
示例一
此示例具有一个针对窄(小于 700px)、中等(701 – 900px)和宽(大于 901px)浏览器窗口的特殊样式表。
示例二
此示例与示例一执行完全相同的功能,只是通过 jQuery/JavaScript 而不是 CSS 媒体查询来实现。
示例三
此示例演示了我们可以通过测试最大设备宽度来定位移动设备。
下载
将所有这些内容在一个地方保存以供参考。
太棒了。非常感谢。
展望未来,网页设计师是否需要开始制作一些最大和最小的网站来适应?提出这个问题。:-P
不错!感谢 Chris :)
很棒的技巧!我将尝试一下。谢谢!
非常酷!让我想起了 http://lessframework.com/
有趣的一点:DreamweaverCS5 在其所拥有的所有所见即所得功能中支持此功能……不过不支持 jQuery 部分。当我沉迷于所有 CS5 预览时,我看到了一段关于它的视频。
很棒的文章!感谢您的详细讲解。
超过九百!
哈哈,忍不住。
失败
哇,这真是太棒了!
很棒……Opera 怎么样?
它怎么样?
我认为 Dim 想知道 Opera 是否支持此功能。
Daniel 明白了。
不,我认为 Chris 明白了。
砰——哒
我的意思是,我在文章和小屏幕截图中专门介绍了它。它有效=)
哇,这太方便了!谢谢!
太棒了!我一直在找这个。
很棒的想法和很棒的例子,克里斯,但我虽然很喜欢它,但也让我感到害怕。如果落入坏人之手,这种力量会被用于善意还是恶意呢?
很棒的文章..
谢谢克里斯..
干得漂亮。喜欢针对IE的解决方法。(即使我不使用它)
我为此写了一个jQuery插件,因此它可以在浏览器之间互操作(甚至包括IE系列):jQuery browserSizr。
http://www.csslab.cl/2009/07/22/jquery-browsersizr/
很棒的文章,谢谢。
构建流体布局不需要JavaScript。当然,显示其他内容很酷,但如果您最初没有它,您不妨坚持使用您现有的内容。使您的整个网站都具有流体性,您也会获得这种效果。
但这并不是严格意义上的流体布局。它根据窗口宽度完全采用不同的布局。
真正的流体布局只会按百分比缩放宽度。
不错,谢谢!
顺便问一下,iPhone模拟器的名称是什么?
iPhone模拟器
大写P。
我非常喜欢使用最大宽度的备用CSS样式表。这解决了我在为移动设备开发时遇到的很多问题,如果浏览器不支持JavaScript,则无需使用jQuery。
在为移动设备设计时,我实际上喜欢同时使用“width”和“device-width”媒体查询。
为什么不涵盖这两种可能性呢?:)
我已将实现细节放在此处,
http://protofluid.com/?c=mediaQueries
最大设备宽度在IE浏览器设备上是否有效?黑莓、Android,我知道iPhone肯定有效。
或者是否需要使用JavaScript来实现这些。我讨厌为IE或任何使用IE的设备进行开发,但必须这样做。我认为许多IE移动设备甚至在其浏览器上都没有启用JavaScript。不知道Mobile7 MS设备的情况。
非常酷的文章。
提前感谢。
这是否适用于@media?
例如。
@media screen and (min-width: 490px) and (max-width: 1600px) {
}
是的,这就是我喜欢的方式!
您有很多选项可以指定媒体查询,但我必须承认,在我看来,这似乎是最简洁的。
这太棒了!!!非常感谢您分享。我很久以前就应该用到这个了。:)
我想看看这个的液体布局版本,其中三个布局中的每一个都扩展以填充浏览器视口的整个宽度。然后它将真正成为一个与分辨率无关的布局。
不错的文章,克里斯。
我尝试在IE 9平台预览版中使用media="only screen and (color)",但到目前为止它不支持。
有趣的文章,克里斯。我认为使用它来增加大屏幕用户的正文区域宽度会很酷。
仅供参考:您称之为Vanilla,而不是“raw”JavaScript。
我们可以称之为“裸背”JavaScript吗?
我可以称它为甜心吗?
很棒的技巧。这可能更难以实现,但它让我有一种温暖的感觉,那就是这是正确的做法。设计在任何地方都能完美运行的网站。:)
关于在包含图像的布局中实现此方法的最佳方式有什么想法吗?它可能需要使用机器人忍者在http://unstoppablerobotninja.com/entry/fluid-images/中描述的一些技术。
很棒的信息!!!感谢分享,克里斯
我知道如何使用JavaScript来实现这一点,但不知道“device-width”的功能。它非常酷~
非常好,我一直在寻找一种干净的方式来定位移动设备。
不过有一点:第二个示例在Windows上的Chrome中无法正常工作;Content和Extra div未正确对齐。这是由于演示问题还是JavaScript的问题?(据我所见,它使用的是相同的样式表)。
对设计师/开发者来说很酷。但是,读者会发现内容的切换/移动有用吗?
他们为什么要喜欢不断变化的窗口大小?
哇!谢谢!
正在开发类似的东西。它很有帮助
好的,这太棒了!无限的可能性。
您有点草草结束了,发生了什么事?:)
阅读完这篇文章后,我一直在思考我是否应该开始设计对iPhone等设备友好的网站。
我查看了在iPhone和其他便携式媒体设备上完成的网站,它们看起来还不错,唯一的问题是横向滚动等。但我认为未来似乎正朝着小型屏幕设备发展,因此网站应该迎合不断增长的市场。
我曾在某处读到Dreamweaver CS5将具有一些功能,允许您创建网站,然后Dreamweaver会自动为iPhone等设备创建样式表。
使用Elastic CSS框架可以轻松完成此操作以及更多操作,请查看演示部分中的自适应列。
非常巧妙,我不知道仅使用CSS就能做到这一点——当然,IE必须像往常一样来破坏它,但感谢您也提供了jQ示例。我想知道您是否也可以发布一个MooTools示例,或者这可能是向David Walsh请教的问题xD
我在Nettut+博客中看到了此功能,并想编写一些脚本来实现它。但您已经完成了所有这些,甚至只使用CSS就做得更好。感谢分享。
我完全同意这种方法,尤其是在为各种移动设备开发不同的样式表时。
查看ProtoFluid,它利用了此技术(我们最近刚刚发布了它!)。http://protofluid.com
它让您可以非常轻松地在指定的分辨率(即手机宽度)下测试CSS3媒体查询。
感谢这篇文章,时机很棒;)
感谢有用的文章。最好的问候
这是一篇不错的文章……我第一次了解到在头部定义不同的CSS来根据设备控制布局。
我习惯于使用单个CSS,并定义100%的宽度,当我使用%时,它会根据浏览器宽度自动调整。
Jquery很好,我也会尝试一下
蓝衣人首创的想法:http://themaninblue.com/writing/perspective/2004/09/21/
你好,
如果这能支持IE,那就太好了!
不过,很棒的技术,感谢分享。
精彩的文章。谢谢泰德
也许你会喜欢我们的小型jQuery实验的自动调整大小功能:http://centratissimo.musings.it
看看,让我们知道你是否喜欢它!
文章在23日发布,对这一功能的需求在27日出现。你帮我省去了巨大的麻烦。谢谢!
非常棒的文章,克里斯!这可能是一个巧妙的技巧来支持所有的手机。但我有点怀疑。我的意思是他们不支持jQuerry,对吧?
一个伟大的概念,但我并不认为它是可行的。根据浏览器宽度切换内容可能非常危险。用户不喜欢东西随机切换。他们往往会想,“这个网站怎么了?它显然坏了。我去其他地方吧。”
然而,设备宽度的利用,特别是对于移动设备,我认为更有用。但是,除非你已经拥有一个完善的网络形象或一个非常精通技术的用户群,否则我建议不要使用媒体宽度。
棒极了!太棒了…………………………
好主意,但我认为它在实践中不起作用。原因例如,图像必须为不同的尺寸调整大小。如果你将其用于移动设计,你可能会加载最终未显示的内容。
我想这也可以用来,例如,在 iPhone 上查看时切换布局并更改旋转方向(纵向/横向):)
我一直在寻找关于这方面的帖子……我的朋友说你可以用一种 W3C 标准的方式拥有不同的样式表,这里就是。感谢这个资源,非常感谢。
我想看看一些流行的网站是否会通过css来适配@media。
Nettuts+——我所知的唯一真正使用这种技术的网站,——使用javascript。
我在一些随机的小项目中使用了@media查询,因为我无聊了(也为了尝试一下)。
你好,
我遇到了一个大问题
我使用1180px的宽度进行布局
在样式表中,我将容器宽度设置为1180px;
在台式电脑上,我的布局没有问题,但是
是否可以拥有一个主要的css文件,其中包含相关分辨率的样式表,而不是在html中使用3个链接标签?
致意,感谢您的提示
真的吗?50KB+ 的模块化到地狱,缓慢的 JavaScript 仅仅是为了更改样式表?我称之为“原始”解决方案或真正解决方案,大约 2KB,并且不使用 20,000 个函数和 20,000 个对象来获取元素。
这些都不起作用。浪费时间……
谢谢,这非常非常有帮助。如果原始菜单有一些css下拉菜单,例如,是否有方法使用jquery方法创建动态下拉菜单
如您所见,菜单中有一个第二个< ul >。
哦,太棒了!我原以为可能需要太多脚本才能实现。但事实并非如此。感谢精彩的教程。现在我的网站与移动设备的兼容性非常好。
多么棒的文章。创建出色的流体布局的超级简单的修复。谢谢兄弟!
哇,非常感谢
这确实是一个很棒的学习经历。max-width 和 max-device width 之间的区别。这就是技巧,每个人都应该学习。
我主要担心的是:即使超出当前设备的范围,是否也会加载不同的链接样式表?
换句话说,链接的样式表是根据设备宽度“选择”还是“加载”的?
我希望它们根本不会加载,如果当前设备超出指定的限制,或者如果设备或你的html禁用了横向选项(当您旋转设备时,我不知道它叫什么)。
我尝试编写这段代码,但在测试时没有任何反应。我使用了 jquery 和 css media 方法(一起和单独使用)。我的主要目标是针对浏览器窗口大小调整。