我们已经介绍了如何使用 CSS 媒体查询来分配 根据浏览器窗口大小的不同样式表。 在那个例子中,我们根据可用空间改变了整个页面的布局。 但是,我们并不需要用这种技术进行如此大的改变,因此在本教程中,我们将介绍一个范围较小的设计调整。 我们还将介绍在单个样式表中使用媒体查询的语法以及更多示例。
用于调用外部样式表的 CSS 媒体查询语法如下
<link rel='stylesheet' media='screen and (min-width: 701px) and (max-width: 900px)' href='css/medium.css' />
您可能熟悉 media 属性,通常为“screen”或“print”,甚至可以是逗号分隔的列表,例如“screen, projection”。 media 属性可以像这样直接放在 CSS 文件中
@media screen {
body {
width: 75%;
}
}
@media print {
body {
width: 100%;
}
}
同样,您可以使用更高级的 CSS 媒体查询,例如
@media all and (max-width: 699px) and (min-width: 520px), (min-width: 1151px) {
body {
background: #ccc;
}
}
您可以在 CSS 文件中使用任意数量的媒体查询。 请注意,您可以使用 and 运算符来要求多个查询为真,但您必须使用逗号 (,) 作为 or 运算符来分隔多个查询的组。 not 关键字也可以用于更改逻辑。
示例
假设我们有一个流体宽度设计,其中侧边栏占页面宽度的 35%。 这意味着根据浏览器窗口的宽度,侧边栏可能非常窄或非常宽,这只是流体宽度设计的性质。 通过 CSS 媒体查询,我们可以说“如果浏览器真的很窄,就执行此操作,如果它更宽,就执行此操作,如果它真的很宽,就执行此操作。” 请注意,测量宽度并不是媒体查询可以执行的唯一操作,它只是一个特别实用的例子。
在我们的示例侧边栏中,我们将有一个超级团队名称列表,这些名称充当电子邮件链接。 HTML 相当简单
<ul id="nav">
<li><a data-email="[email protected]" href="mailto:[email protected]">Chris Coyier</a></li>
<li><a data-email="[email protected]" href="mailto:[email protected]">Elisabeth Moss</a></li>
<li><a data-email="[email protected]" href="mailto:[email protected]">Amanda Righetti</a></li>
</ul>
它只是一个链接列表。 href
属性是 mailto:
链接。 您可能发现唯一不寻常的是 data-email
属性。 在 HTML5 中,您可以 使用以 data-
为前缀的属性 来存储信息,这是完全有效的。 我们将希望稍后使用这些数据,但 href
值并不完全是我们想要的,因为它包含 mailto:
链接,因此使用了数据属性。
列表的默认样式如下
#sidebar ul li a {
color: #900;
text-decoration: none;
padding: 3px 0;
display: block;
}

当浏览器变得更宽时,在我们的例子中,在 520 到 699 像素之间,我们将使用侧边栏中打开的额外空间,为每个列表项应用电子邮件图标。
@media all and (max-width: 699px) and (min-width: 520px) {
#sidebar ul li a {
padding-left: 21px;
background: url(../images/email.png) left center no-repeat;
}
}

随着我们变得更宽,从 700 到 1000 像素,我们将再次使用额外空间,在链接前加上文本“电子邮件:”(使用 CSS 内容),而不是只使用图标。
@media all and (max-width: 1000px) and (min-width: 700px) {
#sidebar ul li a:before {
content: "Email: ";
font-style: italic;
color: #666;
}
}

更宽,在浏览器窗口宽度超过 1001 像素时,我们将直接将电子邮件地址附加到链接。 这就是 HTML5 数据属性的用武之地。
@media all and (min-width: 1001px) {
#sidebar ul li a:after {
content: " (" attr(data-email) ")";
font-size: 11px;
font-style: italic;
color: #666;
}
}

在非常宽的宽度,超过 1151 像素时,我们将再次添加我们之前使用的图标。 这里很酷的一点是,我们不需要编写额外的媒体查询段,而是在我们已经编写的中等宽度媒体查询上附加一个额外的媒体查询,使用逗号(行为类似于 OR 运算符)。
@media all and (max-width: 699px) and (min-width: 520px), (min-width: 1151px) {
#sidebar ul li a {
padding-left: 21px;
background: url(../images/email.png) left center no-repeat;
}
}

现在一起
#sidebar ul li a {
color: #900;
text-decoration: none;
padding: 3px 0;
display: block;
}
@media all and (min-width: 1001px) {
#sidebar ul li a:after {
content: " (" attr(data-email) ")";
font-size: 11px;
font-style: italic;
color: #666;
}
}
@media all and (max-width: 1000px) and (min-width: 700px) {
#sidebar ul li a:before {
content: "Email: ";
font-style: italic;
color: #666;
}
}
@media all and (max-width: 699px) and (min-width: 520px), (min-width: 1151px) {
#sidebar ul li a {
padding-left: 21px;
background: url(../images/email.png) left center no-repeat;
}
}
视频演示
实时演示/下载
浏览器支持
媒体查询的浏览器支持出奇地好。 对于此特定演示中的查询(使用最小和最大宽度),Firefox、Safari(包括 Mobile)、Chrome 和 Opera 的当前版本都支持它。 Internet Explorer 9 将支持它,但 8 及更低版本不支持。 如果我想在 IE 8 及更低版本中提供最佳体验,我将像在 这篇文章 中一样使用 JavaScript 来伪造它,或者使用 IE 专用样式表 并根据分析来使用与最常见浏览器宽度相同的样式。
请注意,不同类型的查询的里程数可能会有所不同。 例如,iPhone 支持宽度查询,但不支持 方向查询。 iPad 支持两者。
更多关于媒体查询的信息
测量宽度是媒体查询的一个很好的实际例子,但它不是唯一可用的选项。 以下是一些其他的(并非全面列表)。 规范 列出了更多内容。
类型
HTML4 有这些媒体类型,它们仍然有效aural, braille, handheld, print, projection, screen, tty和tv。 HTML5 可能会根据需要包含更多内容。 规范包括“3d-glasses”,非常棒。 这all关键字将针对所有类型。
@media screen, projection { ... }
尺寸
您可以获得height和width,它们会针对当前浏览器窗口的高度和宽度进行查询。 您可以直接使用它们,但这可能很少见。 它们都接受 min/max 前缀,因此更常见的是使用它们作为min-width, max-width, min-height, max-height.
还有device-width和device-height,它们也提供min-device-width, max-device-width, min-device-height和max-device-height.
@media (min-device-width: 640px) { ... }
方向/纵横比
您也可以使用以下命令针对屏幕的纵横比进行查询device-aspect-ratio.
@media screen and (device-aspect-ratio: 16/9) { ... }
或者如果屏幕处于纵向(高度大于宽度)或横向(宽度大于高度)模式。
@media (orientation:portrait) { ... }
颜色
你可以查询屏幕是否为彩色以及相关详细信息。
@media (color) { /* Screen is in color */ }
@media (min-color-index: 256) { /* Screen has at least 256 colors */ }
@media (monochrome) { /* Screen is monochrome */ }
其他地方
这最近一直是个热门话题。 你可以听到一些聪明人谈论它 在 The Big Web Show 上。 这里有一些其他最近流行的酷炫用法
- Andy Clarke 展示了如何 行长越长,文本的可读性越好,行高越高。
- Jon Hick 的网站 根据可用空间重新排列,可以具有双边栏、单边栏或无边栏。 它甚至可以很好地缩放到移动尺寸。
- Ethan Marcotte 的 A List Apart 演示没有使用媒体查询,但展示了其他设计可以有效地灵活 的方式。
- Simon Collison 的网站 重新排列它的网格以适应不同的浏览器大小。
- Panic 使用@media 在他们的 HTML 电子邮件中 使它们在桌面或移动电子邮件客户端中看起来很棒。
很棒的实现,我一定会为未来的开发记录下来。
我今天实际上使用 @media 查询重新启动了我的网站。 随意查看。 所有 CSS 都在页面中,因为它是一个 tumblr 主题。
http://stream.andycroll.com
这是一个非常酷的技术。 我必须承认 Chris,你文章的质量最近确实提高了。 保持这种良好的工作状态!
挖掘新的“视频演示”(不确定这是否是新的,但我刚刚注意到它)。
谢谢你的精彩提示!
你可能想指出 CSS 媒体查询在 IE8 及以下版本中不起作用,并且是 W3C 的当前 CSS3 建议的一部分 (http://www.w3.org/TR/css3-mediaqueries/)。
我在“浏览器支持”部分提到了。
…以及其他浏览器支持信息。 =)
在评论之前,你可能想阅读整篇文章。 ;)
Tony,你可能不想表现得像个工具。 哎呀,太迟了!
哈哈,金子!
这个 jq 插件可用于 IE
http://protofunc.com/scripts/jquery/mediaqueries/
非常酷的技术,感谢你将这一切整合在一起。
虽然我已经知道这个漂亮的小技巧一段时间了,但我必须承认,我从来没有真正想到过我可以(应该)使用它。
使用这种技术查看网格布局(例如,Blueprint)可能很有趣。 想象一下; 950px 及以上获得全部内容,所有低于它的内容都获得一个较小的版本。
我绝对把它列入了我的尝试清单!
我喜欢使用图标; 它们在这么小的空间里说了很多。
很棒的写作。 有一些是我以前没有考虑过的事情。
很棒的技术。 谢谢 Chris!
不错的技术,但在现实世界项目中,只有极少数访问者能从中受益? 也许在 4-5 年后?
http://cg.tutsplus.com/ 是我见过的唯一一个使用它(但使用了脚本)的网站。
我会说它比流体布局更好,因为对元素的放置和调整大小有更多控制。
很棒的文章! 谢谢 Chris:)
很棒的文章! 我很喜欢,Chris!
@ Panic 示例
我没有紧密关注 Mozilla 的工作,我对大多数电子邮件客户端中的渲染引擎并不太了解
我知道 Thunderbird 使用 Gecko,但我不确定它是什么版本,或者有人是否有关于野外哪些版本在使用的分析数据? Apple Mail 使用 webkit 吗?
这将非常有用,但网络上是否有任何资源谈论哪些电子邮件客户端能够达到我们为主要浏览器供应商提供的详细程度?
基本上,它们使用与它们对应物(呃……网络浏览器)相同的浏览引擎。
IE 和 Outlook = Trident,
Apple Mail = Webkit,
Thunderbird = Gecko。
更多信息请查看The Dot Product。 ;)
我不想唠叨,但 Outlook 绝对不使用 IE/Trident 进行 HTML 渲染。 Outlook 使用(等等……)Microsoft Word 来渲染电子邮件中的 HTML,这正是它像 1996 年那样渲染 HTML 的原因!
干杯!
是的,我忘记提到它曾经使用过那个引擎。
如果你查看我包含的网站(The Dot Product),即使在该网站上也说明他们现在使用 Word 的渲染引擎。 ;)
有一个 jQuery 插件,它可以在 IE/旧浏览器中启用基本的媒体查询支持
http://protofunc.com/scripts/jquery/mediaqueries/
你不需要为此编写一行额外的 JavaScript 代码或添加一些奇怪的标记。 该插件只是解析链接样式表中的媒体属性,并动态地附加正确的样式表。
这些都是非常棒的技巧,为流体设计打开了非常多的可能性。
我向你致敬!
精彩的教程!!! 非常棒的工作!!
我希望 Amanda 也嫁给我:D
不错的教程! 保持这种良好的工作状态!!
!惊人的帖子!
感谢分享!!!
Chris,
很棒的文章! 我最近一直在思考媒体查询,所以在这里看到所有内容都清晰简洁地列出来真是太好了。 我也很高兴你提到了“CSS 内容”的想法。 关于“CSS 内容”功能,我认为另一个酷炫(可能更有用)的想法是在图像被关闭的情况下将电子邮件图标更改为文本。 仅供参考。
不错的文章,我唯一的批评是它没有提到媒体查询是 CSS3 的新功能,因此只有支持 CSS3 的浏览器才能正确解释它们,除非你使用其他人已经提到的 JS shim 将支持扩展到旧浏览器。
谢谢,我会尝试一下Iphone/Ipad的网页视图。
和往常一样,教程恰好是我当前项目进展的下一步!时间真是太棒了!
非常酷,感谢分享,你花了多少时间在上面?仅仅为了一个元素!
如果你在一个多页面的项目中使用这种技术,你很可能需要对许多元素进行同样的操作。
这真的值得吗?
答案是,当然:**取决于**
如果这能让你免去为移动设备创建一个完全不同的网站版本的工作,那么绝对是**YES**,如果不是,谁在乎呢?
太棒了,我会试试,谢谢。
太棒了,真的。我在接口中尝试过使用溢出属性来实现类似的效果。
…但是要说这在当前没有IE支持的情况下得到很好的支持,嗯…好吧,如果你的网站只针对设计师,也许是对的。
IE 悲哀地拥有巨大的市场份额,并且看起来它只会逐渐下降 http://netmarketshare.com/browser-market-share.aspx?qprid=2
很棒的帖子,谢谢,非常有用。再次感谢。
关于文章最后部分“其他地方”的说明
Ethan Marcotte 的演示 **确实使用了** 媒体查询:在布局的最终版本中
http://www.alistapart.com/d/responsive-web-design/ex/ex-site-FINAL.html
感谢 Chris 的精彩帖子!当我阅读你的帖子时,我感觉需要继续练习。=) 祝你一切顺利!
您好,感谢您的帖子,它非常有用!但是 http://www.opera.com 使用的是相同的概念吗?还是使用网格?
你使用
@media all and (max-width:...)
的原因是什么,而all
已经隐含了?我几天前注意到,我在每个
@media
规则中都使用all
,我想不出为什么我会这样做。这似乎是每个人的普遍做法,也许有人知道原因?你救了我的命。你是我的英雄。很棒的文章!!!!
嗨,我想问一下 css media print 是做什么用的?
我喜欢 Chris 的 CSS-Tric,Chris 是 CSS 的英雄。继续努力,谢谢您,先生。
嗨,Chris,
我知道这是一篇很旧的文章,但我必须问一下。你提到我们可以针对设备高度。所以我可以根据设备的高度进行设计?它有缺陷吗?我已经使用设备宽度取得了不错的效果,但是我想知道设备高度是否是一个好的选择。我想针对那些尺寸很小的手机,尤其是长度方向。在我的地区,这类设备很常见,我不得不根据高度调整布局。期待你的回复。
谢谢
Roy M J
我很高兴我找到了这篇文章。它彻底改变了我的知识基础。你真棒。
您好!我只是想为你竖起大拇指,
你在这篇文章中提供了非常棒的信息。
我很快就会回到你的网站上查看更多内容。
嗨,Chris,
我已经无数次使用过 CSS-Tricks,最近我看了你那令人振奋的演讲(滚石带来的作家障碍、努力工作、sass 等)。我一直都知道响应式设计,但我通常使用 max-width 属性(我知道,我知道)。你在本文中解释了媒体查询,就像一个老板一样,如果你有机会来到西弗吉尼亚州的狭长地带,我相信我欠你几箱滚石!
很棒的帖子!有点令人毛骨悚然的示例电子邮件地址。