viewport标签缺失或写错会导致媒体查询完全失效,因其是渲染前置开关;必须置于<head>最顶部,正确写法为<meta name="viewport" content="width=device-width, initial-scale=1.0">。
不加或写错 <meta name="viewport">,移动端浏览器会按 980px 宽度硬渲染,@media 规则压根不触发,max-width: 100% 也救不回来。这不是兼容性问题,是渲染开关没打开。
常见错误包括:
viewport 放在 <body> 里,或被 JS 动态插入(必须在 <head> 最顶部)width=375 或 initial-scale=0.5 —— 这会让不同设备缩放失衡user-scalable=no 或 maximum-scale=1.0 —— 不仅违反 WCAG,iOS 13+ 已部分忽略,且对视障用户不可用<main>、<section> 这类语义标签,在辅助技术中不是“可有可无的装饰”,而是硬信号:Android TalkBack 的“跳转到主要内容”只认 <main>,iOS VoiceOver 的 Rotor 菜单靠 <section> 区分独立内容块。
但老环境根本不认它们:
立即学习“前端免费学习笔记(深入)”;
<main> 节点,document.querySelector('main') 返回 null
display: inline,得手动补 main, section, article { display: block; }
html5shiv,且只给 IE 加载:<!--[if lt IE 9]><script src="html5shiv.min.js"></script><![endif]-->
Flexbox 在 Android 4.4 及更早 WebView 中对 flex-wrap、gap、flex-basis 的支持是稳定失效,不是偶发 Bug;PDF 工具链(如 weasyprint、pdfkit)基本不支持 Flex,puppeteer 打印模式下 min-height 也不触发伸缩。
实操建议:
flex-wrap,改用 JS 控制列数(比如屏幕宽度 < 768px 时每行 1 列)display: block + float 或 inline-block 布局@page + break-inside: avoid 控制分页,比靠 flex 对齐更可靠<html lang="zh-CN"> 必须在首字节就存在。TalkBack、VoiceOver 在页面加载瞬间解析它,后续 JS 改 document.documentElement.lang 已经晚了——前几屏内容已被按错误语言朗读完毕。
RTL 场景更需同步处理:
lang="ar" 必须配 dir="rtl",单设 lang 不改变文本流方向,单设 dir 不触发语音引擎切换<html lang="en-US" dir="ltr">
lang,例如 <p>文档中引用了<span lang="ja">日本語</span>术语</p>
lang、viewport)的**位置和时机**——它们必须在字节流开头就到位,晚一毫秒,整个链路就偏航。