媒体查询在手机上不生效,90% 是 viewport 标签未正确加载或语法错误:需确保其位于 head 最顶部、无前置内容,且 media 查询语法完整(如必含 and)、单位正确;同时排查层叠优先级、z-index 依赖定位、老旧安卓 WebView 兼容性等问题。
媒体查询写了却在手机上不生效,90% 是 <meta name="viewport"> 标签没起作用,不是 CSS 写错了,也不是浏览器不支持。
它必须紧贴 <head> 开始标签,前面不能有注释、JS 注入、Blade @section 占位符或 @push 语句。Laravel 模板里常见 @yield('styles') 插在 viewport 前面,导致 Safari 直接忽略整条标签。
document.documentElement.clientWidth
980 或远大于设备逻辑宽度(如 iPhone 14 Pro 显示 1280),说明 viewport 完全失效<meta name="viewport">,且内容为 content="width=device-width, initial-scale=1"
浏览器不报错,DevTools 里规则变灰、不可编辑、右侧无 :hover 图标,基本就是语法问题。
and:@media screen (max-width: 768px) ❌ → 必须写成 @media screen and (max-width: 768px) ✅max-with、min-hieght、screenand(缺空格)都会被整条跳过(max-width: 768) ❌(缺 px),(max-width: 768px { ❌(右括号漏了)max-device-width:iOS/iPadOS/macOS Safari 已弃用,一律改用 max-width
媒体查询规则本身可能已加载并匹配,但声明被更高优先级样式覆盖——这不是断点失效,而是 CSS 层叠在起作用。
@media
!important、内联样式干扰了媒体查询内的声明div p 容易被 .content p 覆盖;提升特异性更可靠,例如把 .nav 改成 .header .nav
z-index 不生效?先确认元素是否设置了 position: relative 或其它定位值——z-index 只对定位元素有效这些 WebView 对语法和结构更敏感,模拟器测不出来,必须真机验证。
@media:像 .header { @media (...) { ... } } 这种写法在 X5/UC 内核中完全无效,必须提至顶层display: flex 在 Android 4.3 及更早版本不识别,整个容器变成 block,媒体查询虽触发但布局错乱initial-scale=1.0,可临时加 minimum-scale=1.0, maximum-scale=1.0 测试,但不要长期依赖user-scalable=no 掩盖问题——它禁用缩放,却不修复视口逻辑,还影响无障碍访问真正卡住人的地方,往往不是媒体查询怎么写,而是 viewport 没生效时你还在调 CSS;或者语法错了一处,你却在反复改断点数值。真机跑一次 document.documentElement.clientWidth,比在 DevTools 里切十次模拟器都管用。