前端进阶之旅前端进阶之旅
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
基础篇
进阶篇
高频篇
精选篇
手写篇
面经篇
AI 篇
原理篇
每日一题
小程序题库
知识卡片
  • 场景篇按分类整理的大前端场景考点
  • 历年面经按年份追踪真实考点
  • 算法题库NEW在线编码即时判题
  • 专项自测100 题快速查漏
  • 前端基础
    • HTTP从报文一路讲到 HTTPS
    • 浏览器渲染、事件循环、进程
    • 计算机基础Linux、网络、操作系统
  • 进阶专项
    • 设计模式23 种模式怎么用
    • 前端系统进阶学习大型项目工程化
    • 前端综合文章长期沉淀的实践文
  • 工程与工具
    • Node学习指南从环境搭建到服务端
    • NPM工作流script、依赖与发布
    • Docker容器化部署上手
    • Canvas图形与动画实战
  • 路线与导图
    • 思维导图知识点全景图
    • 学习路线按图索骥不跑偏
  • 动态
    • 公众号动态公众号历史文章
    • 博客动态站长的技术博客
    • 开发者导航常用工具与文档站
  • AI 助手随时提问,即时解析
  • AI 模拟面试模拟真实面试 + 报告
  • AI 知识地图串起全站知识点
  • AI 定制路线按你的简历现排
AI 热点
旧版
首页程序员面试题库matchMedia JS 响应式状态判断
CSS响应式设计

JavaScript 怎么知道媒体查询是否匹配?

CSS 负责纯视觉布局时直接用 @media。脚本确实需要根据环境改变行为,可以用 window.matchMedia(query) 得到 MediaQueryList,读取 matches,再监听 change 事件。组件卸载时移除监听;如果只需要改变颜色、排列或显示,通常不必把 CSS 状态搬到 JavaScript 中。

前端进阶之旅 · 一题精讲更新于 2026.09.29
CSS#响应式设计
先看核心答案读代码示例
理解线索

`matches` 与 `change` 分工

  1. matchMedia返回可观察的媒体查询对象,适用于确需改变脚本行为时
  2. matches初始化应先读当前布尔值,不能只等下一次事件
  3. change仅当匹配状态跨界改变才触发,卸载时移除监听

视口或偏好变化后值可能更新,需要变化时同步业务状态。

核心回答

先记住这个答案

布局和配色若只影响呈现,用 CSS 媒体查询就能让浏览器自行切换。若断点还决定是否启动高成本交互或加载资源,脚本可通过 matchMedia() 读取当前匹配状态并监听变化。只在页面加载时读一次会漏掉窗口缩放;把纯视觉变化搬进脚本则会多出状态同步与清理负担。

  • 纯视觉变化优先写 CSS
  • matchMedia 可读当前匹配状态
  • change 只在匹配状态变化时触发
  • 组件卸载时移除监听

地图面板跨断点时同步行为

地图组件的图层信息用 <details id="map-panel"> 显示,窄屏时要关掉默认展开的面板。这涉及控件的打开状态,不是简单的样式切换。初始化时用 matchMedia 读一次;之后监听 change,当视口跨过断点再调整面板行为。不要只在页面加载时检查一次,否则旋转屏幕或调整窗口后,行为和布局会分离。服务端渲染时 window 不存在,访问应放在客户端生命周期里。

窄屏面板状态同步JavaScript
const panel = document.querySelector('#map-panel')
const query = window.matchMedia('(max-width: 600px)')
const sync = () => {
  panel.open = !query.matches // 窄屏关闭详情面板
}
sync()
query.addEventListener('change', sync)
// 组件卸载时:query.removeEventListener('change', sync)

matchMedia 使用和 CSS 媒体查询一致的表达式,但它返回的是查询对象,不会替你修改样式。 这段代码假定页面有一个 <details id="map-panel">。它先根据当前断点设置 open,再在匹配状态跨过 600px 时更新;只在 resize 中读窗口宽度,反而会在每一帧触发不必要的同步。若产品允许用户手动展开面板,还要决定自动断点切换是否可以覆盖用户选择,不能让脚本一运行就把刚打开的详情关掉。

matches 与 change 分工

matches 是当前结果;change 事件只在匹配状态变化时触发,并不等于每一次 resize 都触发。开发时要考虑生命周期和初始状态,尤其在 React 等框架里,避免每次渲染都注册一个新监听器。对于组件容器的尺寸变化,视口媒体查询不够精准,可考虑 CSS 容器查询或 ResizeObserver。

例如地图组件在窄屏时不只是缩小宽度,而要暂停高频拖拽提示或切换控制面板行为,这才需要脚本知道匹配状态。初始化先读一次 matches,之后监听 change,卸载时移除监听,避免路由切换后旧回调仍改当前页面。若只是侧栏从左移到下方,CSS 能完成,额外保存一份 JavaScript 状态反而容易不同步。

回答前,多想一步

容易答错的地方

只在初始化时读一次 matches
视口或偏好变化后值可能更新,需要变化时同步业务状态。
用 matchMedia 重写所有响应式 CSS
它不会替代 CSS 级联;纯布局交给样式规则更简单。
试着用自己的话回答

面试官还会怎么问?

change 事件何时触发?

查询的匹配布尔值发生变化时触发,不是每一次窗口尺寸变化都触发。

SSR 中怎样避免报错?

只在客户端生命周期访问 window,并为服务端初始渲染准备稳定的默认状态。

监听组件宽度该用什么?

媒体查询看视口或环境;组件自身宽度优先考虑容器查询,需要脚本尺寸数据再用 ResizeObserver。

从一道题,走向一组知识

把知识连起来

响应式设计

移动优先具体怎么写,为什么也有人反对?

脚本监听到窄屏后要决定具体行为,移动优先布局仍可由 CSS 负责。

响应式设计

orientation 判断横屏可靠吗?什么时候改用宽度断点?

orientation 也能放进 matchMedia,视口形状改变时会触发匹配变化。

参考资料

  • CSS:响应式设计参考资料

示例用于理解所注明的运行环境与边界;延伸学习可结合原文中的更多案例。

本题目录
  1. 先记住这个答案
  2. 地图面板跨断点时同步行为
  3. matches 与 change 分工
  4. 容易答错的地方
  5. 面试官还会怎么问
  6. 把知识连起来
读懂,再试着讲出来

先看核心答案,再读代码。最后展开追问,检查自己有没有遗漏边界。

试着回答追问
浏览全部面试题理解原理,也关注真实的使用场景。回到顶部 ↑