响应式网页设计 - 媒体查询
什么是媒体查询?
媒体查询是 CSS3 中引入的一种 CSS 技术。
仅在满足特定条件时,它才会使用 @media 规则来引用 CSS 属性块。
实例
如果浏览器窗口是 600px 或更小,则背景颜色为浅蓝色:
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1.0"><style>body {background-color: lightgreen;}@media only screen and (max-width: 600px) {body {background-color: lightblue;}}</style></head><body><p>请调整浏览器窗口的大小。如果此文档的宽度为 600 像素或更小,背景颜色为“浅蓝色”,否则为“浅绿色”。</p></body></html>
添加断点
在本教程中稍早前,我们制作了一张包含行和列的网页,但是这张响应式网页在小屏幕上看起来效果并不好。
媒体查询可以帮助您。我们可以添加一个断点,其中设计的某些部分在断点的每一侧会表现得有所不同。
使用媒体查询在 768px 处添加断点:
当屏幕(浏览器窗口)小于 768px 时,每列的宽度应为 100%:
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1.0"><style>* {box-sizing: border-box;}.row::after {content: "";clear: both;display: block;}[class*="col-"] {float: left;padding: 15px;}html {font-family: "Lucida Sans", sans-serif;}.header {background-color: #9933cc;color: #ffffff;padding: 15px;}.menu ul {list-style-type: none;margin: 0;padding: 0;}.menu li {padding: 8px;margin-bottom: 7px;background-color: #33b5e5;color: #ffffff;box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);}.menu li:hover {background-color: #0099cc;}.aside {background-color: #33b5e5;padding: 15px;color: #ffffff;text-align: center;font-size: 14px;box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);}.footer {background-color: #0099cc;color: #ffffff;text-align: center;font-size: 12px;padding: 15px;}/* 针对桌面: */.col-1 {width: 8.33%;}.col-2 {width: 16.66%;}.col-3 {width: 25%;}.col-4 {width: 33.33%;}.col-5 {width: 41.66%;}.col-6 {width: 50%;}.col-7 {width: 58.33%;}.col-8 {width: 66.66%;}.col-9 {width: 75%;}.col-10 {width: 83.33%;}.col-11 {width: 91.66%;}.col-12 {width: 100%;}@media only screen and (max-width: 768px) {/* 针对手机: */[class*="col-"] {width: 100%;}}</style></head><body><div class="header"><h2>上海</h2></div><div class="row"><div class="col-3 menu"><ul><li>交通</li><li>文化</li><li>旅游</li><li>美食</li></ul></div><div class="col-6"><h2>欢迎来到上海</h2><p>上海市,简称沪,别称申,是中华人民共和国直辖市,中国的经济、金融、贸易和航运中心,世界著名的港口城市,是中国人口第二多的城市。</p></div><div class="col-3 right"><div class="aside"><h2>历史</h2><p>最晚在新石器时代,上海地区已经有先民聚居。春秋时代,上海由吴国管辖,战国时代则是楚国领土 ...</p><h2>位置</h2><p>上海位于中国东部弧形海岸线的正中间,长江三角洲最东部,东临东海,南濒杭州湾,西与江苏、浙江两省相接 ...</p><h2>环境</h2><p>上海地处江南水乡,并位于长江入海口,亦不处于主要地震带上,因此如地震、洪水以及地质类灾害鲜有发生 ...</p></div></div></div><div class="footer"><p>请调整浏览器窗口的大小,以查看内容如何响应调整大小。</p></div></body></html>
始终移动优先设计
移动优先(Mobile First)指的是在对台式机或任何其他设备进行设计之前,优先针对移动设备进行设计(这将使页面在较小的设备上显示得更快)。
这意味着我们必须在 CSS 中做一些改进。
当宽度小于 768px 时,我们应该修改设计,而不是更改宽度。我们就这样进行了“移动优先”的设计:
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1.0"><style>* {box-sizing: border-box;}.row::after {content: "";clear: both;display: table;}[class*="col-"] {float: left;padding: 15px;}html {font-family: "Lucida Sans", sans-serif;}.header {background-color: #9933cc;color: #ffffff;padding: 15px;}.menu ul {list-style-type: none;margin: 0;padding: 0;}.menu li {padding: 8px;margin-bottom: 7px;background-color: #33b5e5;color: #ffffff;box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);}.menu li:hover {background-color: #0099cc;}.aside {background-color: #33b5e5;padding: 15px;color: #ffffff;text-align: center;font-size: 14px;box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);}.footer {background-color: #0099cc;color: #ffffff;text-align: center;font-size: 12px;padding: 15px;}/* 针对手机: */[class*="col-"] {width: 100%;}@media only screen and (min-width: 768px) {/* For desktop: */.col-1 {width: 8.33%;}.col-2 {width: 16.66%;}.col-3 {width: 25%;}.col-4 {width: 33.33%;}.col-5 {width: 41.66%;}.col-6 {width: 50%;}.col-7 {width: 58.33%;}.col-8 {width: 66.66%;}.col-9 {width: 75%;}.col-10 {width: 83.33%;}.col-11 {width: 91.66%;}.col-12 {width: 100%;}}</style></head><body><div class="header"><h1>上海</h1></div><div class="row"><div class="col-3 menu"><ul><li>交通</li><li>文化</li><li>旅游</li><li>美食</li></ul></div><div class="col-6"><h1>欢迎来到上海</h1><p>上海市,简称沪,别称申,是中华人民共和国直辖市,中国的经济、金融、贸易和航运中心,世界著名的港口城市,是中国人口第二多的城市。</p></div><div class="col-3 right"><div class="aside"><h2>历史</h2><p>最晚在新石器时代,上海地区已经有先民聚居。春秋时代,上海由吴国管辖,战国时代则是楚国领土 ...</p><h2>位置</h2><p>上海位于中国东部弧形海岸线的正中间,长江三角洲最东部,东临东海,南濒杭州湾,西与江苏、浙江两省相接 ...</p><h2>环境</h2><p>上海地处江南水乡,并位于长江入海口,亦不处于主要地震带上,因此如地震、洪水以及地质类灾害鲜有发生 ...</p></div></div></div><div class="footer"><p>请调整浏览器窗口的大小,来查看内容如何响应调整大小。</p></div></body></html>
另一个断点
您可以添加任意多个断点。我们还会在平板电脑和手机之间插入一个断点。
为此,我们添加了一个媒体查询(在 600 像素),并为大于 600 像素(但小于 768 像素)的设备添加了一组新类:
请注意,两组类几乎相同,唯一的区别是名称(col- 和 col-s-):
/* 针对手机: */[class*="col-"] {width: 100%;}@media only screen and (min-width: 600px) {/* 针对平板电脑: */.col-s-1 {width: 8.33%;}.col-s-2 {width: 16.66%;}.col-s-3 {width: 25%;}.col-s-4 {width: 33.33%;}.col-s-5 {width: 41.66%;}.col-s-6 {width: 50%;}.col-s-7 {width: 58.33%;}.col-s-8 {width: 66.66%;}.col-s-9 {width: 75%;}.col-s-10 {width: 83.33%;}.col-s-11 {width: 91.66%;}.col-s-12 {width: 100%;}}@media only screen and (min-width: 768px) {/* 针对桌面: */.col-1 {width: 8.33%;}.col-2 {width: 16.66%;}.col-3 {width: 25%;}.col-4 {width: 33.33%;}.col-5 {width: 41.66%;}.col-6 {width: 50%;}.col-7 {width: 58.33%;}.col-8 {width: 66.66%;}.col-9 {width: 75%;}.col-10 {width: 83.33%;}.col-11 {width: 91.66%;}.col-12 {width: 100%;}}
有两组相同的类似乎很奇怪,但是它给了我们机会用 HTML 来决定在每个断点处的列会发生什么:
HTML 实例
对于台式机:
第一和第三部分都会跨越 3 列。中间部分将跨越 6 列。
对于平板电脑:
第一部分将跨越 3 列,第二部分将跨越 9 列,第三部分将显示在前两部分的下方,并将跨越 12 列:
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1.0"><style>* {box-sizing: border-box;}.row::after {content: "";clear: both;display: table;}[class*="col-"] {float: left;padding: 15px;}html {font-family: "Lucida Sans", sans-serif;}.header {background-color: #9933cc;color: #ffffff;padding: 15px;}.menu ul {list-style-type: none;margin: 0;padding: 0;}.menu li {padding: 8px;margin-bottom: 7px;background-color: #33b5e5;color: #ffffff;box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);}.menu li:hover {background-color: #0099cc;}.aside {background-color: #33b5e5;padding: 15px;color: #ffffff;text-align: center;font-size: 14px;box-shadow: 0 1px 3px rgba(0,0,0,0.12), 0 1px 2px rgba(0,0,0,0.24);}.footer {background-color: #0099cc;color: #ffffff;text-align: center;font-size: 12px;padding: 15px;}/* For mobile phones: */[class*="col-"] {width: 100%;}@media only screen and (min-width: 600px) {/* 针对平板电脑: */.col-s-1 {width: 8.33%;}.col-s-2 {width: 16.66%;}.col-s-3 {width: 25%;}.col-s-4 {width: 33.33%;}.col-s-5 {width: 41.66%;}.col-s-6 {width: 50%;}.col-s-7 {width: 58.33%;}.col-s-8 {width: 66.66%;}.col-s-9 {width: 75%;}.col-s-10 {width: 83.33%;}.col-s-11 {width: 91.66%;}.col-s-12 {width: 100%;}}@media only screen and (min-width: 768px) {/* 针对桌面: */.col-1 {width: 8.33%;}.col-2 {width: 16.66%;}.col-3 {width: 25%;}.col-4 {width: 33.33%;}.col-5 {width: 41.66%;}.col-6 {width: 50%;}.col-7 {width: 58.33%;}.col-8 {width: 66.66%;}.col-9 {width: 75%;}.col-10 {width: 83.33%;}.col-11 {width: 91.66%;}.col-12 {width: 100%;}}</style></head><body><div class="header"><h2>上海</h2></div><div class="row"><div class="col-3 col-s-3 menu"><ul><li>交通</li><li>文化</li><li>旅游</li><li>美食</li></ul></div><div class="col-6 col-s-9"><h2>欢迎来到上海</h2><p>上海市,简称沪,别称申,是中华人民共和国直辖市,中国的经济、金融、贸易和航运中心,世界著名的港口城市,是中国人口第二多的城市。</p></div><div class="col-3 col-s-12"><div class="aside"><h2>历史</h2><p>最晚在新石器时代,上海地区已经有先民聚居。春秋时代,上海由吴国管辖,战国时代则是楚国领土 ...</p><h2>位置</h2><p>上海位于中国东部弧形海岸线的正中间,长江三角洲最东部,东临东海,南濒杭州湾,西与江苏、浙江两省相接 ...</p><h2>环境</h2><p>上海地处江南水乡,并位于长江入海口,亦不处于主要地震带上,因此如地震、洪水以及地质类灾害鲜有发生 ...</p></div></div></div><div class="footer"><p>请调整浏览器窗口的大小,以查看内容如何响应调整大小。</p></div></body></html>
典型的设备断点
高度和宽度不同的屏幕和设备不计其数,因此很难为每个设备创建精确的断点。为了简单起见,您可以瞄准这五组:
<!DOCTYPE html><html><head><meta name="viewport" content="width=device-width, initial-scale=1.0"><style>.example {padding: 20px;color: white;}/* 超小型设备(600px及以下的手机) */@media only screen and (max-width: 600px) {.example {background: red;}}/* 小型设备(平板电脑竖屏模式和大屏手机,600 像素及以上) */@media only screen and (min-width: 600px) {.example {background: green;}}/* 中型设备(平板电脑横屏模式,768 像素及以上) */@media only screen and (min-width: 768px) {.example {background: blue;}}/* 大型设备(笔电、台式机,992 像素及以上) */@media only screen and (min-width: 992px) {.example {background: orange;}}/* 超大型设备(大屏笔电、台式机,1200 像素及以上) */@media only screen and (min-width: 1200px) {.example {background: pink;}}</style></head><body><h1>典型的媒体查询断点</h1><p class="example">请调整浏览器窗口的大小,来查看该段落的背景色在不同屏幕尺寸下如何变化。</p></body></html>
方向:人像 / 风景
媒体查询还可用于根据浏览器的方向来更改页面的布局。
您可以设置一组 CSS 属性,这些属性仅在浏览器窗口的宽度大于其高度时才适用,即所谓的“横屏”方向:
实例
如果方向为横向模式(landscape mode),则网页背景为浅蓝色:
<!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>
用媒体查询隐藏元素
媒体查询的另一种常见用法是在不同屏幕尺寸上对元素进行隐藏:
实例
<!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><h1>隐藏不同屏幕尺寸的元素</h1><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><h1>在不同的屏幕尺寸上更改元素的字体大小</h1><div class="example">Example DIV.</div><p>当浏览器的宽度为 600 像素或更小时,将 DIV 的字体大小设置为 30px。当它是 601 像素或更宽时,将字体大小设置为 80 像素。请调整浏览器窗口的大小以查看效果。</p></body></html>
CSS @media 参考手册
有关所有媒体类型和特性/表达式的完整概述,请在 CSS 参考手册中参阅 @media 规则。