同一份页面,电脑上是宽敞的多栏布局,到手机上还挤成三栏就没法看了。媒体查询(Media Query)就是 CSS 提供的"看菜下饭"工具:根据屏幕宽度等条件,给不同的设备套用不同的样式。
基本语法
媒体查询用 @media 开头,括号里写条件,条件成立时才会应用花括号里的样式:
/* 屏幕宽度不超过 600px 时生效(一般是手机) */
@media (max-width: 600px) {
body {
background-color: #ffeaa7;
}
}
max-width: 600px 的意思是"最大到 600px",也就是屏幕小于等于 600px 时生效;反过来 min-width: 601px 就是"最小 601px",即大于等于 601px 时生效。
拿记事本写个小页面,来回拖动浏览器窗口宽度,就能直观看到背景色什么时候变色。
移动优先的写法
推荐的习惯是"移动优先":默认样式按手机写,再用 min-width 给更大的屏幕逐级加样式:
.container {
padding: 12px;
}
/* 平板及以上 */
@media (min-width: 768px) {
.container {
padding: 24px;
}
}
/* 电脑及以上 */
@media (min-width: 1024px) {
.container {
max-width: 960px;
margin: 0 auto;
}
}
这样写的逻辑是"一层层往上加",手机端也不用加载用不到的复杂布局。
经典场景:多栏变单栏
媒体查询最常见的用途就是布局切换。电脑上侧边栏和内容并排,手机上变成上下堆叠:
.layout {
display: flex;
gap: 16px;
}
.sidebar { width: 240px; }
.main { flex: 1; }
@media (max-width: 768px) {
.layout {
flex-direction: column; /* 改成上下排列 */
}
.sidebar {
width: auto;
}
}
窗口宽度小于等于 768px 时,侧边栏会跑到内容上方,变成常见的手机版式。
条件可以组合
多个条件用 and 连接,全部满足才生效:
/* 宽度在 600px 到 1024px 之间(大概平板范围) */
@media (min-width: 600px) and (max-width: 1024px) {
.banner {
font-size: 20px;
}
}
用逗号分隔表示"或",任一条件满足就生效:
/* 正在打印,或屏幕宽度小于 500px 时 */
@media print, (max-width: 500px) {
.ad {
display: none;
}
}
少了 viewport 一切白搭
手机浏览器默认会假装自己是 980px 宽的桌面浏览器,再把整页缩小显示。想让媒体查询在手机上按真实宽度生效,HTML 里必须有这行:
<meta name="viewport" content="width=device-width, initial-scale=1">
少了它,你写的 max-width: 600px 在手机上很可能根本不触发——这是新手"媒体查询明明写了却不生效"的最常见原因。
小结
max-width针对小屏,min-width针对大屏,别把方向记反;- 习惯移动优先:默认写手机样式,用
min-width逐级增强; - 最经典的用法是在宽度阈值处切换布局,比如多栏变单栏;
- 条件可用
and组合,逗号表示"或"; <meta name="viewport">是手机端生效的前提,先检查它再排查别的问题。