CSS3 媒体查询
媒体查询(Media Queries)可以让我们根据设备显示器的特性(如视口宽度、屏幕比例、设备方向:横向或纵向)为其设定CSS 样式。
媒体查询非常实用,尤其是当你想要根据设备的大致类型(如打印设备与带屏幕的设备)或者特定的特征和设备参数(例如屏幕分辨率和浏览器视窗宽度)来修改网站或应用程序时。
CSS2 引入了媒体类型
CSS2 中引入了 @media 规则,它让为不同媒体类型定义不同样式规则成为可能。
例如:您可能有一组用于计算机屏幕的样式规则、一组用于打印机、一组用于手持设备,甚至还有一组用于电视,等等。不幸的是,除了打印媒体类型之外,这些媒体类型从未得到过设备的大规模支持。
CSS3 引入了媒体查询
CSS3 中的媒体查询扩展了 CSS2 媒体类型的概念:它们并不查找设备类型,而是关注设备的能力。
媒体查询可用于检查许多事情,例如:
- 视口的宽度和高度
- 设备的宽度和高度
- 方向(平板电脑/手机处于横向还是纵向模式)
- 分辨率
使用媒体查询是一种流行的技术,可以向台式机、笔记本电脑、平板电脑和手机(例如 iPhone 和 Android 手机)提供定制的样式表。
浏览器支持
表格中的数字注明了完全支持 @media 规则的首个浏览器版本。
| 属性 | |||||
| @media | 21.0 | 9.0 | 3.5 | 4.0 | 9.0 |
媒体查询语法
媒体查询由一种媒体类型组成,并可包含一个或多个表达式,这些表达式可以解析为 true 或 false。
@media not|only mediatype and (expressions) {CSS-Code;}
如果指定的媒体类型与正在显示文档的设备类型匹配,并且媒体查询中的所有表达式均为 true,则查询结果为 true。当媒体查询为 true 时,将应用相应的样式表或样式规则,并遵循正常的级联规则。
除非您使用 not 或 only 运算符,否则媒体类型是可选的,且隐含 all 类型。您还可以针对不同的媒体使用不同的样式表:
<link rel="stylesheet" media="mediatype and|not|only (expressions)" href="print.css">
CSS3 媒体类型
| 值 | 描述 |
|---|---|
| all | 用于所有媒体类型设备。 |
| 用于打印机。 | |
| screen | 用于计算机屏幕、平板电脑、智能手机等等。 |
| speech | 用于大声“读出”页面的屏幕阅读器。 |
媒体查询的简单实例
使用媒体查询的一种方法是在样式表内有一个备用的 CSS 部分。
下面的例子在视口宽度为 480 像素或更宽时将背景颜色更改为浅绿色(如果视口小于 480 像素,则背景颜色会是粉色):
<!DOCTYPE html><html><head><style>body {background-color: pink;}@media screen and (min-width: 480px) {body {background-color: lightgreen;}}</style></head><body><h1>请调整浏览器窗口大小来查看效果!</h1><p>此媒体查询值应用于:媒体类型为 screen,且视口为 480px 或更宽。</p></body></html>
下例显示了一个菜单,如果视口的宽度为 480 像素或更宽,则该菜单会浮动到页面的左侧(如果视口小于 480 像素,则该菜单将位于内容的顶部):
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1.0"><style>.wrapper {overflow: auto;}#main {margin-left: 4px;}#leftsidebar {float: none;width: auto;}#menulist {margin: 0;padding: 0;}.menuitem {background: #CDF0F6;border: 1px solid #d4d4d4;border-radius: 4px;list-style-type: none;margin: 4px;padding: 2px;}@media screen and (min-width: 480px) {#leftsidebar {width: 200px; float: left;}#main {margin-left: 216px;}}</style></head><body><div class="wrapper"><div id="leftsidebar"><ul id="menulist"><li class="menuitem">Menu-item 1</li><li class="menuitem">Menu-item 2</li><li class="menuitem">Menu-item 3</li><li class="menuitem">Menu-item 4</li><li class="menuitem">Menu-item 5</li></ul></div><div id="main"><h1>请调整浏览器窗口大小来查看效果!</h1><p>本例显示了一个菜单,如果视口为 480 像素或更宽,它将向页面左侧浮动。如果视口小于 480 像素,则菜单将位于内容的顶部。</p></div></div></body></html>
更多媒体查询实例
下面演示一个简单的例子,让我们来更改不同设备的背景色:
实例
<!DOCTYPE html><html><head><style>body {background-color: tan;color: black;}/* 在宽度为 992px 或更小的屏幕上,背景颜色为蓝色 */@media screen and (max-width: 992px) {body {background-color: blue;color: white;}}/* 在宽度为 600px 或更小的屏幕上,背景色为橄榄色 */@media screen and (max-width: 600px) {body {background-color: olive;color: white;}}</style></head><body><h2>请调整浏览器窗口大小以查看效果!</h2><p>默认情况下,文档的背景色为棕褐色。如果屏幕尺寸为 992px 或更小,则颜色将变为蓝色。如果小于或等于 600px,它将变为橄榄色。</p></body></html>
菜单的媒体查询
在本例中,我们使用媒体查询来创建响应式导航菜单,该菜单在不同的屏幕尺寸上会有所不同。
实例
<!DOCTYPE html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><style>* {box-sizing: border-box;}/* 设置顶部导航栏样式 */.topnav {overflow: hidden;background-color: #333;}/* 设置 topnav 链接的样式 */.topnav a {float: left;display: block;color: #f2f2f2;text-align: center;padding: 14px 16px;text-decoration: none;}/* 悬停时改变颜色 */.topnav a:hover {background-color: #ddd;color: black;}/* 在宽度为 600 像素或更小的屏幕上,使菜单链接彼此堆叠,而不是并排 */@media screen and (max-width: 600px) {.topnav a {float: none;width: 100%;}}</style></head><body><h2>响应式导航菜单</h2><p>请调整浏览器窗口的大小以查看效果:当屏幕小于 600 像素时,导航菜单将垂直显示,而不是水平显示。</p><div class="topnav"><a href="#">Link</a><a href="#">Link</a><a href="#">Link</a></div></body></html>
列的媒体查询
媒体查询的常见用法是创建弹性布局。在本例中,我们创建了一个布局,该布局在四列、两列和全宽列之间变化,具体取决于不同的屏幕尺寸:
实例
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1"><style>* {box-sizing: border-box;}/* 创建彼此相邻浮动的四个等列 */.column {float: left;width: 25%;padding: 20px;}/* 清除列后的浮动 */.row:after {content: "";display: table;clear: both;}/* 在 992px 或更小的屏幕上,从四列变为两列 */@media screen and (max-width: 992px) {.column {width: 50%;}}/* 在宽度小于或等于 600px 的屏幕上,使列堆叠在一起,而不是彼此相邻 */@media screen and (max-width: 600px) {.column {width: 100%;}}</style></head><body><h2>响应式四列布局</h2><p><b>请调整浏览器窗口的大小以查看响应效果。</b>在宽度小于或等于 992px 的屏幕上,列的大小将从四列调整为两列。在宽度为 600px 或更小的屏幕上,这些列将堆叠在一起,而不是彼此相邻。</p><div class="row"><div class="column" style="background-color:#aaa;"><h2>Column 1</h2><p>Some text..</p></div><div class="column" style="background-color:#bbb;"><h2>Column 2</h2><p>Some text..</p></div><div class="column" style="background-color:#ccc;"><h2>Column 3</h2><p>Some text..</p></div><div class="column" style="background-color:#ddd;"><h2>Column 4</h2><p>Some text..</p></div></div></body></html>
提示:更现代的创建列布局方法是使用 CSS Flexbox(请参见下面的例子)。但是,Internet Explorer 10 以及更早版本不支持它。如果需要 IE6-10 的支持,请使用浮动(如上所示)。
如需学习有关弹性框布局模块的更多知识,请学习 CSS Flexbox 这一章。
如需学习有关响应式 Web 设计的更多知识,请访问本站的 响应式 Web 设计教程。
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1"><style>* {box-sizing: border-box;}/* 弹性框的容器 */.row {display: flex;flex-wrap: wrap;}/* 创建四个等列 */.column {flex: 25%;padding: 20px;}/* 在 992px 或更小的屏幕上,从四列变为两列 */@media screen and (max-width: 992px) {.column {flex: 50%;}}/* 在宽度小于或等于 60px 的屏幕上,使列堆叠在一起,而不是彼此相邻 */@media screen and (max-width: 600px) {.row {flex-direction: column;}}</style></head><body><h2>响应式四列弹性布局</h2><p><b>请调整浏览器窗口的大小以查看响应效果。</b>在宽度小于或等于 992px 的屏幕上,列的大小将从四列调整为两列。在宽度为 600px 或更小的屏幕上,这些列将堆叠在一起,而不是彼此相邻。</p><div class="row"><div class="column" style="background-color:#aaa;"><h2>Column 1</h2><p>Some text..</p></div><div class="column" style="background-color:#bbb;"><h2>Column 2</h2><p>Some text..</p></div><div class="column" style="background-color:#ccc;"><h2>Column 3</h2><p>Some text..</p></div><div class="column" style="background-color:#ddd;"><h2>Column 4</h2><p>Some text..</p></div></div></body></html>
用媒体查询隐藏元素
媒体查询的另一种常见用法是在不同屏幕尺寸上隐藏元素:
实例
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1"><style>div.example {background-color: yellow;padding: 20px;}@media screen and (max-width: 600px) {div.example {display: none;}}</style></head><body><h2>隐藏不同屏幕尺寸的元素</h2><div class="example">Example DIV.</div><p>当浏览器的宽度为 600 像素或更小时,隐藏 div 元素。请调整浏览器窗口的大小以查看效果。</p></body></html>
用媒体查询改变字体
您还可以使用媒体查询来更改不同屏幕尺寸上的元素的字体大小:
可变的字体大小。
实例
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1"><style>div.example {background-color: lightgrey;padding: 20px;}@media screen and (min-width: 600px) {div.example {font-size: 80px;}}@media screen and (max-width: 600px) {div.example {font-size: 30px;}}</style></head><body><h2>在不同的屏幕尺寸上更改元素的字体大小</h2><div class="example">Example DIV.</div><p>当浏览器的宽度为 600 像素或更小时,将 DIV 的字体大小设置为 30px。当它是 601 像素或更宽时,将字体大小设置为 80 像素。请调整浏览器窗口的大小以查看效果。</p></body></html>
方向:人像 / 风景
媒体查询还可以用于根据浏览器的方向更改页面的布局。
您可以设置一组 CSS 属性,这些属性仅在浏览器窗口的宽度大于其高度时才适用,即所谓的横屏:
如果方向处于横向模式,则使用浅蓝背景色:
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1.0"><style>body {background-color: lightgreen;}@media only screen and (orientation: landscape) {body {background-color: lightblue;}}</style></head><body><p>请调整浏览器窗口的大小。如果此文档的宽度大于高度,背景色为“浅蓝色”,否则为“浅绿色”。</p></body></html>
最小宽度到最大宽度
您还可以使用 max-width 和 min-width 属性设置最小宽度和最大宽度。
例如,当浏览器的宽度在 600 到 900 像素之间时,更改 <div> 元素的外观:
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1"><style>@media screen and (max-width: 900px) and (min-width: 600px) {div.example {font-size: 50px;padding: 50px;border: 8px solid black;background: yellow;}}</style></head><body><h2>在不同的屏幕尺寸上更改 DIV 的外观</h2><div class="example">Example DIV.</div><p>当浏览器的宽度在 600 到 900 像素之间时,更改 DIV 的外观。<b>请调整浏览器窗口大小以查看效果。</b></p></body></html>
使用附加值:在下面的例子中,我们使用逗号(类似 OR 运算符)将附加的媒体查询添加到已有媒体查询中:
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1"><style>@media screen and (max-width: 900px) and (min-width: 600px), (min-width: 1100px) {div.example{font-size: 50px;padding: 50px;border: 8px solid black;background: yellow;}}</style></head><body><h2>在不同的屏幕尺寸上更改 DIV 的外观</h2><div class="example">Example DIV.</div><p>当浏览器的宽度介于 600 和 900 像素之间或大于 1100 像素时,请更改 DIV 的外观。<b>请调整浏览器窗口大小以查看效果。</b></p></body></html>
CSS @media 参考手册
有关所有媒体类型和特性/表达式的完整概述,请查看我们的 CSS 参考中的 @media 规则。