CSS @media 规则
@media CSS @规则 可用于基于一个或多个 媒体查询 的结果来应用样式表的一部分。 使用它,您可以指定一个媒体查询和一个CSS块,当且仅当该媒体查询与正在使用其内容的设备匹配时,该CSS块 样式才能应用于该文档。
实例
如果浏览器窗口的宽度为 600px 或更小时,把 <body> 元素的背景颜色更改为“浅蓝色”:
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<style>
body {
background-color: yellow;
}
@media only screen and (max-width: 600px) {
body {
background-color: lightblue;
}
}
</style>
</head>
<body>
<h1>@media 规则</h1>
<p>请调整浏览器窗口的大小。如果此文档的宽度为 600 像素或更小,背景颜色为“浅蓝色”,否则为“黄色”。</p>
</body>
</html>
可以在页面下方找到更多 TIY 实例。
定义和用法
@media 规则在媒体查询中用于为不同的媒体类型/设备应用不同的样式。媒体查询可用于检查许多事情,诸如:视口的宽度和高度设备的宽度和高度方向(手机或平板电脑处于横屏还是竖屏模式?)分辨率使用媒体查询是一种流行的技术,用于向台式机、笔记本电脑、平板电脑和手机提供定制的样式表(响应式网页设计)。您还可以使用媒体查询来规定某些样式仅适用于打印的文档或屏幕阅读器(mediatype:print、screen 或 speech)。除了媒体类型之外,还有媒体特性。媒体特性通过允许测试用户代理或显示设备的具体特性,为媒体查询提供了更多特定细节。例如,您可以将样式仅应用于大于或小于特定宽度的屏幕。
浏览器支持
表格中的数字注明了完全支持 @media 规则的首个浏览器版本。
属性 | |||||
---|---|---|---|---|---|
@media | 21 | 9 | 3.5 | 4.0 | 9 |
CSS 语法
@media not|only mediatype and (mediafeature and|or|not mediafeature) {
CSS-Code;
}
not、only 和 and 关键字的含义:
not:not 关键字反正整个媒体查询的含义。only:only 关键字可防止旧版浏览器应用指定的样式,这些浏览器不支持带媒体特性的媒体查询。它对现代浏览器没有影响。and:and 关键字将媒体特性与媒体类型或其他媒体特性组合在一起。它们都是可选的。但是,如果使用 not 或 only,则还必须指定媒体类型。您还可以针对不同的媒体使用不同的样式表,就像这样:
<link rel="stylesheet" media="screen and (min-width: 900px)" href="widescreen.css">
<link rel="stylesheet" media="screen and (max-width: 600px)" href="smallscreen.css">
....
媒体类型
值 | 描述 |
---|---|
all | 默认。用于所有媒体类型设备。 |
用于打印机。 | |
screen | 用于计算机屏幕、平板电脑、智能手机等。 |
speech | 用于朗读页面的屏幕阅读器。 |
媒体特性
值 | 描述 |
---|---|
any-hover | 是否有任何可用的输入机制允许用户(将鼠标等)悬停在元素上? 在 Media Queries Level 4 中被添加。 |
any-pointer | 可用的输入机制中是否有任何指针设备,如果有,它的精度如何? 在 Media Queries Level 4 中被添加。 |
aspect-ratio | 视口(viewport)的宽高比。 |
color | 输出设备每个像素的比特值,常见的有 8、16、32 位。 如果设备不支持输出彩色,则该值为 0。 |
color-gamut | 用户代理和输出设备大致程度上支持的色域。 在 Media Queries Level 4 中被添加。 |
color-index | 输出设备的颜色查询表(color lookup table)中的条目数量。 如果设备不使用颜色查询表,则该值为 0。 |
device-aspect-ratio | 输出设备的宽高比。 已在 Media Queries Level 4 中被弃用。 |
device-height | 输出设备渲染表面(如屏幕)的高度。 已在 Media Queries Level 4 中被弃用。 |
device-width | 输出设备渲染表面(如屏幕)的宽度。 已在 Media Queries Level 4 中被弃用。 |
display-mode | 应用程序的显示模式,如 web app 的 manifest 中的 display 成员所指定 在 Web App Manifest spec 被定义。 |
forced-colors | 检测是用户代理否限制调色板。 在 Media Queries Level 5 中被添加。 |
grid | 输出设备使用网格屏幕还是点阵屏幕? |
height | 视口(viewport)的高度。 |
hover | 主输入机制是否允许用户将鼠标悬停在元素上? 在 Media Queries Level 4 中被添加。 |
inverted-colors | 浏览器或者底层操作系统是否反转了颜色。 在 Media Queries Level 5 中被添加。 |
light-level | 当前环境光水平。 在 Media Queries Level 5 中被添加。 |
max-aspect-ratio | 显示区域的宽度和高度之间的最大比例。 |
max-color | 输出设备每个颜色分量的最大位数。 |
max-color-index | 设备可以显示的最大颜色数。 |
max-height | 显示区域的最大高度,例如浏览器窗口。 |
max-monochrome | 单色(灰度)设备上每种“颜色”的最大位数。 |
max-resolution | 设备的最大分辨率,使用 dpi 或 dpcm。 |
max-width | 显示区域的最大宽度,例如浏览器窗口。 |
min-aspect-ratio | 显示区域的宽度和高度之间的最小比例。 |
min-color | 输出设备每个颜色分量的最小位数。 |
min-color-index | 设备可以显示的最小颜色数。 |
min-height | 显示区域的最小高度,例如浏览器窗口。 |
min-monochrome | 单色(灰度)设备上每种“颜色”的最小位数。 |
min-resolution | 设备的最低分辨率,使用 dpi 或 dpcm。 |
min-width | 显示区域的最小宽度,例如浏览器窗口。 |
monochrome | 输出设备单色帧缓冲区中每个像素的位深度。 如果设备并非黑白屏幕,则该值为 0。 |
orientation | 视窗(viewport)的旋转方向(横屏还是竖屏模式)。 |
overflow-block | 输出设备如何处理沿块轴溢出视口(viewport)的内容。 在 Media Queries Level 4 中被添加。 |
overflow-inline | 沿内联轴溢出视口(viewport)的内容是否可以滚动? 在 Media Queries Level 4 中被添加。 |
pointer | 主要输入机制是一个指针设备吗?如果是,它的精度如何? 在 Media Queries Level 4 中被添加。 |
prefers-color-scheme | 探测用户倾向于选择亮色还是暗色的配色方案。 在 Media Queries Level 5 中被添加。 |
prefers-contrast | 探测用户是否有向系统要求提高或降低相近颜色之间的对比度。 在 Media Queries Level 5 中被添加。 |
prefers-reduced-motion | 用户是否希望页面上出现更少的动态效果。 在 Media Queries Level 5 中被添加。 |
prefers-reduced-transparency | 用户是否倾向于选择更低的透明度。 在 Media Queries Level 5 中被添加。 |
resolution | 输出设备的分辨率,使用 dpi 或 dpcm。 |
scan | 输出设备的扫描过程(适用于电视等)。 |
scripting | 探测脚本(例如 JavaScript)是否可用。 在 Media Queries Level 5 中被添加。 |
update | 输出设备更新内容的渲染结果的频率。 在 Media Queries Level 4 中被添加。 |
width | 视窗(viewport)的宽度。 |
更多实例
当浏览器的宽度为 600px 或更小时,隐藏元素:
<!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">示例 DIV</div>
<p>请调整浏览器窗口的大小以查看响应效果。如果浏览器宽度小于或等于 600 像素,则隐藏元素。</p>
</body>
</html>
如果视口的宽度为 800 像素或更宽,请使用媒体查询将背景色设置为淡紫色;如果视口的宽度介于 400 至 799 像素之间,则使用媒体查询将背景色设置为浅绿色。如果视口小于 400 像素,则背景色为浅蓝色:
<!DOCTYPE html>
<html>
<head>
<style>
body {
background-color: lightblue;
}
@media screen and (min-width: 400px) {
body {
background-color: lightgreen;
}
}
@media screen and (min-width: 800px) {
body {
background-color: lavender;
}
}
</style>
</head>
<body>
<h1>请调整浏览器窗口大小以查看效果!</h1>
<p>如果视口的宽度为 800 像素或更宽,使用媒体查询将背景色设置为淡紫色;如果视口的宽度介于 400 至 799 像素之间,背景色为浅绿色。如果视口小于 400 像素,则背景色为浅蓝色。</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="#">链接</a>
<a href="#">链接</a>
<a href="#">链接</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;
}
/* 如果屏幕宽度为 992 像素或更窄,则四列变为两列 */
@media screen and (max-width: 992px) {
.column {
width: 50%;
}
}
/* 如果屏幕宽度为 600 像素或更窄,则列堆叠而不是并排 */
@media screen and (max-width: 600px) {
.column {
width: 100%;
}
}
</style>
</head>
<body>
<h2>响应式四列布局</h2>
<p>请调整浏览器窗口的大小以查看响应效果。在宽度为 992px 或更窄的屏幕上,列会调整尺寸,将从四列变为为两列。在宽度为 600 像素或更小的屏幕上,这些列将堆叠,而不是并排。</p>
<div class="row">
<div class="column" style="background-color:#aaa;">
<h2>列 1</h2>
<p>一些文本..</p>
</div>
<div class="column" style="background-color:#bbb;">
<h2>列 2</h2>
<p>一些文本..</p>
</div>
<div class="column" style="background-color:#ccc;">
<h2>列 3</h2>
<p>一些文本..</p>
</div>
<div class="column" style="background-color:#ddd;">
<h2>列 4</h2>
<p>一些文本..</p>
</div>
</div>
</body>
</html>
实例
使用媒体查询来创建响应式网站:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<style>
* {
box-sizing: border-box;
}
/* 设置 body 的样式 */
body {
font-family: Arial;
margin: 0;
}
/* 页眉/LOGO */
.header {
padding: 60px;
text-align: center;
background: #1abc9c;
color: white;
}
/* 设置顶部导航栏的样式 */
.navbar {
display: flex;
background-color: #333;
}
/* 设置导航栏链接的样式 */
.navbar a {
color: white;
padding: 14px 20px;
text-decoration: none;
text-align: center;
}
/* 当鼠标悬停时改变颜色 */
.navbar a:hover {
background-color: #ddd;
color: black;
}
/* 列容器 */
.row {
display: flex;
flex-wrap: wrap;
}
/* 创建两个并排的等列 */
/* Sidebar/left column */
.side {
flex: 30%;
background-color: #f1f1f1;
padding: 20px;
}
/* 主列 */
.main {
flex: 70%;
background-color: white;
padding: 20px;
}
/* 伪图像,仅供示例 */
.fakeimg {
background-color: #aaa;
width: 100%;
padding: 20px;
}
/* 页脚 */
.footer {
padding: 20px;
text-align: center;
background: #ddd;
}
/* 响应式布局 - 当屏幕宽度小于 700 像素时,使两列堆叠,而不是并排 */
@media (max-width: 700px) {
.row, .navbar {
flex-direction: column;
}
}
</style>
</head>
<body>
<!-- 注释 -->
<div style="background:yellow;padding:5px">
<h4 style="text-align:center">请调整浏览器窗口的大小以查看响应效果。</h4>
</div>
<!-- Header -->
<div class="header">
<h2>我的网站</h2>
<p>拥有<b>弹性</b>布局。</p>
</div>
<!-- 导航栏 -->
<div class="navbar">
<a href="#">链接</a>
<a href="#">链接</a>
<a href="#">链接</a>
<a href="#">链接</a>
</div>
<!-- 弹性网格(内容) -->
<div class="row">
<div class="side">
<h2>关于我</h2>
<h5>我的照片:</h5>
<div class="fakeimg" style="height:200px;">图像</div>
<p>hello world!</p>
<h3>更多文本</h3>
<p>Welcome to Shanghai!</p>
<div class="fakeimg" style="height:60px;">图像</div><br>
<div class="fakeimg" style="height:60px;">图像</div><br>
<div class="fakeimg" style="height:60px;">图像</div>
</div>
<div class="main">
<h2>标题</h2>
<h5>标题描述, Dec 7, 2021</h5>
<div class="fakeimg" style="height:200px;">图像</div>
<p>一些文本..</p>
<p>上海是中华人民共和国四个直辖市之一。欢迎来到上海!</p>
<br>
<h2>标题</h2>
<h5>标题描述, Sep 2, 2021</h5>
<div class="fakeimg" style="height:200px;">图像</div>
<p>一些文本..</p>
<p>上海是中华人民共和国四个直辖市之一。欢迎来到上海!</p>
</div>
</div>
<!-- 页脚 -->
<div class="footer">
<h2>页脚</h2>
</div>
</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>
实例
使用媒体查询将文本颜色设置为在屏幕上显示文档时为绿色,在打印时为黑色:
<!DOCTYPE html>
<html>
<head>
<style>
@media screen {
body {
color: green;
}
}
@media print {
body {
color: black;
}
}
</style>
</head>
<body>
<h1>@media 规则</h1>
<p>在屏幕上显示文档时,使用媒体查询将文本颜色设置为绿色,在打印时为黑色。</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 的外观。</p>
</body>
</html>
相关页面
CSS 教程:CSS 媒体查询
RWD 教程:通过媒体查询实现响应式 Web 设计
JavaScript 教程:window.matchMedia() 方法