CSS3 媒体查询

媒体查询(Media Queries)可以让我们根据设备显示器的特性(如视口宽度、屏幕比例、设备方向:横向或纵向)为其设定CSS 样式。

媒体查询非常实用,尤其是当你想要根据设备的大致类型(如打印设备与带屏幕的设备)或者特定的特征和设备参数(例如屏幕分辨率和浏览器视窗宽度)来修改网站或应用程序时。


CSS2 引入了媒体类型

CSS2 中引入了 @media 规则,它让为不同媒体类型定义不同样式规则成为可能。

例如:您可能有一组用于计算机屏幕的样式规则、一组用于打印机、一组用于手持设备,甚至还有一组用于电视,等等。不幸的是,除了打印媒体类型之外,这些媒体类型从未得到过设备的大规模支持。


CSS3 引入了媒体查询

CSS3 中的媒体查询扩展了 CSS2 媒体类型的概念:它们并不查找设备类型,而是关注设备的能力。

媒体查询可用于检查许多事情,例如:

  • 视口的宽度和高度
  • 设备的宽度和高度
  • 方向(平板电脑/手机处于横向还是纵向模式)
  • 分辨率

使用媒体查询是一种流行的技术,可以向台式机、笔记本电脑、平板电脑和手机(例如 iPhone 和 Android 手机)提供定制的样式表。


浏览器支持

表格中的数字注明了完全支持 @media 规则的首个浏览器版本。

属性
@media21.09.03.54.09.0

媒体查询语法

媒体查询由一种媒体类型组成,并可包含一个或多个表达式,这些表达式可以解析为 true 或 false。

  1. @media not|only mediatype and (expressions) {
  2. CSS-Code;
  3. }

如果指定的媒体类型与正在显示文档的设备类型匹配,并且媒体查询中的所有表达式均为 true,则查询结果为 true。当媒体查询为 true 时,将应用相应的样式表或样式规则,并遵循正常的级联规则。

除非您使用 not 或 only 运算符,否则媒体类型是可选的,且隐含 all 类型。您还可以针对不同的媒体使用不同的样式表:

  1. <link rel="stylesheet" media="mediatype and|not|only (expressions)" href="print.css">

CSS3 媒体类型

描述
all用于所有媒体类型设备。
print用于打印机。
screen用于计算机屏幕、平板电脑、智能手机等等。
speech用于大声“读出”页面的屏幕阅读器。

媒体查询的简单实例

使用媒体查询的一种方法是在样式表内有一个备用的 CSS 部分。

下面的例子在视口宽度为 480 像素或更宽时将背景颜色更改为浅绿色(如果视口小于 480 像素,则背景颜色会是粉色):

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <style>
  5. body {
  6. background-color: pink;
  7. }
  8. @media screen and (min-width: 480px) {
  9. body {
  10. background-color: lightgreen;
  11. }
  12. }
  13. </style>
  14. </head>
  15. <body>
  16. <h1>请调整浏览器窗口大小来查看效果!</h1>
  17. <p>此媒体查询值应用于:媒体类型为 screen,且视口为 480px 或更宽。</p>
  18. </body>
  19. </html>

下例显示了一个菜单,如果视口的宽度为 480 像素或更宽,则该菜单会浮动到页面的左侧(如果视口小于 480 像素,则该菜单将位于内容的顶部):

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <style>
  6. .wrapper {overflow: auto;}
  7. #main {margin-left: 4px;}
  8. #leftsidebar {
  9. float: none;
  10. width: auto;
  11. }
  12. #menulist {
  13. margin: 0;
  14. padding: 0;
  15. }
  16. .menuitem {
  17. background: #CDF0F6;
  18. border: 1px solid #d4d4d4;
  19. border-radius: 4px;
  20. list-style-type: none;
  21. margin: 4px;
  22. padding: 2px;
  23. }
  24. @media screen and (min-width: 480px) {
  25. #leftsidebar {width: 200px; float: left;}
  26. #main {margin-left: 216px;}
  27. }
  28. </style>
  29. </head>
  30. <body>
  31. <div class="wrapper">
  32. <div id="leftsidebar">
  33. <ul id="menulist">
  34. <li class="menuitem">Menu-item 1</li>
  35. <li class="menuitem">Menu-item 2</li>
  36. <li class="menuitem">Menu-item 3</li>
  37. <li class="menuitem">Menu-item 4</li>
  38. <li class="menuitem">Menu-item 5</li>
  39. </ul>
  40. </div>
  41. <div id="main">
  42. <h1>请调整浏览器窗口大小来查看效果!</h1>
  43. <p>本例显示了一个菜单,如果视口为 480 像素或更宽,它将向页面左侧浮动。如果视口小于 480 像素,则菜单将位于内容的顶部。</p>
  44. </div>
  45. </div>
  46. </body>
  47. </html>

更多媒体查询实例

下面演示一个简单的例子,让我们来更改不同设备的背景色:

实例
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <style>
  5. body {
  6. background-color: tan;
  7. color: black;
  8. }
  9. /* 在宽度为 992px 或更小的屏幕上,背景颜色为蓝色 */
  10. @media screen and (max-width: 992px) {
  11. body {
  12. background-color: blue;
  13. color: white;
  14. }
  15. }
  16. /* 在宽度为 600px 或更小的屏幕上,背景色为橄榄色 */
  17. @media screen and (max-width: 600px) {
  18. body {
  19. background-color: olive;
  20. color: white;
  21. }
  22. }
  23. </style>
  24. </head>
  25. <body>
  26. <h2>请调整浏览器窗口大小以查看效果!</h2>
  27. <p>默认情况下,文档的背景色为棕褐色。如果屏幕尺寸为 992px 或更小,则颜色将变为蓝色。如果小于或等于 600px,它将变为橄榄色。</p>
  28. </body>
  29. </html>
您想知道我们为什么要精确使用 992px 和 600px 吗?它们就是我们所称的设备的“典型断点”(typical breakpoints)。您访问本站的 响应式 Web 设计教程 中学习有关典型断点的更多知识。

菜单的媒体查询

在本例中,我们使用媒体查询来创建响应式导航菜单,该菜单在不同的屏幕尺寸上会有所不同。

实例
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="utf-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1">
  6. <style>
  7. * {
  8. box-sizing: border-box;
  9. }
  10. /* 设置顶部导航栏样式 */
  11. .topnav {
  12. overflow: hidden;
  13. background-color: #333;
  14. }
  15. /* 设置 topnav 链接的样式 */
  16. .topnav a {
  17. float: left;
  18. display: block;
  19. color: #f2f2f2;
  20. text-align: center;
  21. padding: 14px 16px;
  22. text-decoration: none;
  23. }
  24. /* 悬停时改变颜色 */
  25. .topnav a:hover {
  26. background-color: #ddd;
  27. color: black;
  28. }
  29. /* 在宽度为 600 像素或更小的屏幕上,使菜单链接彼此堆叠,而不是并排 */
  30. @media screen and (max-width: 600px) {
  31. .topnav a {
  32. float: none;
  33. width: 100%;
  34. }
  35. }
  36. </style>
  37. </head>
  38. <body>
  39. <h2>响应式导航菜单</h2>
  40. <p>请调整浏览器窗口的大小以查看效果:当屏幕小于 600 像素时,导航菜单将垂直显示,而不是水平显示。</p>
  41. <div class="topnav">
  42. <a href="#">Link</a>
  43. <a href="#">Link</a>
  44. <a href="#">Link</a>
  45. </div>
  46. </body>
  47. </html>

列的媒体查询

媒体查询的常见用法是创建弹性布局。在本例中,我们创建了一个布局,该布局在四列、两列和全宽列之间变化,具体取决于不同的屏幕尺寸:

大屏幕:

中等屏幕:

小屏幕:

实例
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="viewport" content="width=device-width, initial-scale=1">
  5. <style>
  6. * {
  7. box-sizing: border-box;
  8. }
  9. /* 创建彼此相邻浮动的四个等列 */
  10. .column {
  11. float: left;
  12. width: 25%;
  13. padding: 20px;
  14. }
  15. /* 清除列后的浮动 */
  16. .row:after {
  17. content: "";
  18. display: table;
  19. clear: both;
  20. }
  21. /* 在 992px 或更小的屏幕上,从四列变为两列 */
  22. @media screen and (max-width: 992px) {
  23. .column {
  24. width: 50%;
  25. }
  26. }
  27. /* 在宽度小于或等于 600px 的屏幕上,使列堆叠在一起,而不是彼此相邻 */
  28. @media screen and (max-width: 600px) {
  29. .column {
  30. width: 100%;
  31. }
  32. }
  33. </style>
  34. </head>
  35. <body>
  36. <h2>响应式四列布局</h2>
  37. <p><b>请调整浏览器窗口的大小以查看响应效果。</b>在宽度小于或等于 992px 的屏幕上,列的大小将从四列调整为两列。在宽度为 600px 或更小的屏幕上,这些列将堆叠在一起,而不是彼此相邻。</p>
  38. <div class="row">
  39. <div class="column" style="background-color:#aaa;">
  40. <h2>Column 1</h2>
  41. <p>Some text..</p>
  42. </div>
  43. <div class="column" style="background-color:#bbb;">
  44. <h2>Column 2</h2>
  45. <p>Some text..</p>
  46. </div>
  47. <div class="column" style="background-color:#ccc;">
  48. <h2>Column 3</h2>
  49. <p>Some text..</p>
  50. </div>
  51. <div class="column" style="background-color:#ddd;">
  52. <h2>Column 4</h2>
  53. <p>Some text..</p>
  54. </div>
  55. </div>
  56. </body>
  57. </html>

提示:更现代的创建列布局方法是使用 CSS Flexbox(请参见下面的例子)。但是,Internet Explorer 10 以及更早版本不支持它。如果需要 IE6-10 的支持,请使用浮动(如上所示)。

如需学习有关弹性框布局模块的更多知识,请学习 CSS Flexbox 这一章。

如需学习有关响应式 Web 设计的更多知识,请访问本站的 响应式 Web 设计教程

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="viewport" content="width=device-width, initial-scale=1">
  5. <style>
  6. * {
  7. box-sizing: border-box;
  8. }
  9. /* 弹性框的容器 */
  10. .row {
  11. display: flex;
  12. flex-wrap: wrap;
  13. }
  14. /* 创建四个等列 */
  15. .column {
  16. flex: 25%;
  17. padding: 20px;
  18. }
  19. /* 在 992px 或更小的屏幕上,从四列变为两列 */
  20. @media screen and (max-width: 992px) {
  21. .column {
  22. flex: 50%;
  23. }
  24. }
  25. /* 在宽度小于或等于 60px 的屏幕上,使列堆叠在一起,而不是彼此相邻 */
  26. @media screen and (max-width: 600px) {
  27. .row {
  28. flex-direction: column;
  29. }
  30. }
  31. </style>
  32. </head>
  33. <body>
  34. <h2>响应式四列弹性布局</h2>
  35. <p><b>请调整浏览器窗口的大小以查看响应效果。</b>在宽度小于或等于 992px 的屏幕上,列的大小将从四列调整为两列。在宽度为 600px 或更小的屏幕上,这些列将堆叠在一起,而不是彼此相邻。</p>
  36. <div class="row">
  37. <div class="column" style="background-color:#aaa;">
  38. <h2>Column 1</h2>
  39. <p>Some text..</p>
  40. </div>
  41. <div class="column" style="background-color:#bbb;">
  42. <h2>Column 2</h2>
  43. <p>Some text..</p>
  44. </div>
  45. <div class="column" style="background-color:#ccc;">
  46. <h2>Column 3</h2>
  47. <p>Some text..</p>
  48. </div>
  49. <div class="column" style="background-color:#ddd;">
  50. <h2>Column 4</h2>
  51. <p>Some text..</p>
  52. </div>
  53. </div>
  54. </body>
  55. </html>

用媒体查询隐藏元素

媒体查询的另一种常见用法是在不同屏幕尺寸上隐藏元素:

在小屏幕上我会隐藏。
实例
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="viewport" content="width=device-width, initial-scale=1">
  5. <style>
  6. div.example {
  7. background-color: yellow;
  8. padding: 20px;
  9. }
  10. @media screen and (max-width: 600px) {
  11. div.example {
  12. display: none;
  13. }
  14. }
  15. </style>
  16. </head>
  17. <body>
  18. <h2>隐藏不同屏幕尺寸的元素</h2>
  19. <div class="example">Example DIV.</div>
  20. <p>当浏览器的宽度为 600 像素或更小时,隐藏 div 元素。请调整浏览器窗口的大小以查看效果。</p>
  21. </body>
  22. </html>

用媒体查询改变字体

您还可以使用媒体查询来更改不同屏幕尺寸上的元素的字体大小:

可变的字体大小。

实例
  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="viewport" content="width=device-width, initial-scale=1">
  5. <style>
  6. div.example {
  7. background-color: lightgrey;
  8. padding: 20px;
  9. }
  10. @media screen and (min-width: 600px) {
  11. div.example {
  12. font-size: 80px;
  13. }
  14. }
  15. @media screen and (max-width: 600px) {
  16. div.example {
  17. font-size: 30px;
  18. }
  19. }
  20. </style>
  21. </head>
  22. <body>
  23. <h2>在不同的屏幕尺寸上更改元素的字体大小</h2>
  24. <div class="example">Example DIV.</div>
  25. <p>当浏览器的宽度为 600 像素或更小时,将 DIV 的字体大小设置为 30px。当它是 601 像素或更宽时,将字体大小设置为 80 像素。请调整浏览器窗口的大小以查看效果。</p>
  26. </body>
  27. </html>

方向:人像 / 风景

媒体查询还可以用于根据浏览器的方向更改页面的布局。

您可以设置一组 CSS 属性,这些属性仅在浏览器窗口的宽度大于其高度时才适用,即所谓的横屏:

如果方向处于横向模式,则使用浅蓝背景色:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  5. <style>
  6. body {
  7. background-color: lightgreen;
  8. }
  9. @media only screen and (orientation: landscape) {
  10. body {
  11. background-color: lightblue;
  12. }
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <p>请调整浏览器窗口的大小。如果此文档的宽度大于高度,背景色为“浅蓝色”,否则为“浅绿色”。</p>
  18. </body>
  19. </html>

最小宽度到最大宽度

您还可以使用 max-widthmin-width 属性设置最小宽度和最大宽度。

例如,当浏览器的宽度在 600 到 900 像素之间时,更改 <div> 元素的外观:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="viewport" content="width=device-width, initial-scale=1">
  5. <style>
  6. @media screen and (max-width: 900px) and (min-width: 600px) {
  7. div.example {
  8. font-size: 50px;
  9. padding: 50px;
  10. border: 8px solid black;
  11. background: yellow;
  12. }
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <h2>在不同的屏幕尺寸上更改 DIV 的外观</h2>
  18. <div class="example">Example DIV.</div>
  19. <p>当浏览器的宽度在 600 到 900 像素之间时,更改 DIV 的外观。<b>请调整浏览器窗口大小以查看效果。</b></p>
  20. </body>
  21. </html>

使用附加值:在下面的例子中,我们使用逗号(类似 OR 运算符)将附加的媒体查询添加到已有媒体查询中:

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta name="viewport" content="width=device-width, initial-scale=1">
  5. <style>
  6. @media screen and (max-width: 900px) and (min-width: 600px), (min-width: 1100px) {
  7. div.example{
  8. font-size: 50px;
  9. padding: 50px;
  10. border: 8px solid black;
  11. background: yellow;
  12. }
  13. }
  14. </style>
  15. </head>
  16. <body>
  17. <h2>在不同的屏幕尺寸上更改 DIV 的外观</h2>
  18. <div class="example">Example DIV.</div>
  19. <p>当浏览器的宽度介于 600 和 900 像素之间或大于 1100 像素时,请更改 DIV 的外观。<b>请调整浏览器窗口大小以查看效果。</b></p>
  20. </body>
  21. </html>

CSS @media 参考手册

有关所有媒体类型和特性/表达式的完整概述,请查看我们的 CSS 参考中的 @media 规则

分类导航