JavaScript 实现响应式设计的核心是补充 CSS 媒体查询,而非替代:通过 window.matchMedia() 监听视口变化、动态加载资源、调整交互逻辑及适配设备行为;需复用 MediaQueryList、避免 resize 中重复调用、注意 SSR 兼容与监听器清理。
JavaScript 实现响应式设计,核心不是替代 CSS 媒体查询,而是补充其能力:监听视口变化、动态加载资源、调整交互逻辑、适配不同设备行为。媒体查询在 JavaScript 中主要通过 window.matchMedia() API 使用,它让 JS 能“感知”CSS 中定义的断点条件。
window.matchMedia() 接收一个 CSS 媒体查询字符串(如 "(max-width: 768px)"),返回一个 MediaQueryList 对象,该对象包含当前是否匹配、以及可监听变化的接口。
mq.matches 返回布尔值mq.addEventListener('change', handler)(推荐)或旧式 mq.addListener(handler)
mq.removeEventListener('change', handler) 或 mq.removeListener(handler)
示例:在小屏时启用滑动菜单,大屏时禁用
const mobileQuery = window.matchMedia('(max-width: 768px)');
function handleMobileChange(e) {
if (e.matches) {
initMobileMenu(); // 激活移动端逻辑
} else {
destroyMobileMenu(); // 清理移动端逻辑
}
}
mobileQuery.addEventListener('change', handleMobileChange);
handleMobileChange(mobileQuery); // 立即执行一次,确保初始状态正确
JS 不必直接操作 DOM 样式,可修改 CSS 变量,让样式层统一响应。例如在 CSS 中定义:
:root {
--gap: 24px;
}
@media (max-width: 768px) {
:root { --gap: 12px; }
}
JS 中可读取或设置变量,也可配合 matchMedia 主动同步:
const mq = window.matchMedia('(max-width: 768px)');
document.documentElement.style.setProperty('--is-mobile', mq.matches ? '1' : '0');
mq.addEventListener('change', e => {
document.documentElement.style.setProperty('--is-mobile', e.matches ? '1' : '0');
});
MediaQueryList 实例window 在 Node.js 中不存在,需加判断 if (typeof window !== 'undefi
ned')
prefers-reduced-motion,自动关闭复杂动画(hover: hover) 判断是否有悬停能力,调整 tooltip 触发方式(hover vs click)