根本原因是平台规则不统一:iOS Safari认-webkit-text-size-adjust,Android微信X5内核完全忽略,Chrome/Edge只认标准text-size-adjust;viewport缺失或错误会导致该属性失效,必须写width=device-width且initial-scale=1.0共存;真机调试用getComputedStyle查返回值;作用位置须在块级父容器(如html);X5需JS桥接WeixinJSBridge.invoke('setFontSizeCallback', {fontSize: 0});取值禁用none,统一用100%;rem需确保根字号≥16px;X5 JS桥接须在首屏HTML解析前执行。

根本原因不是写法错,而是不同平台用的不是同一套规则:iOS Safari 看 -webkit-text-size-adjust,Android 微信 X5 内核直接忽略它,而现代 Chrome/Edge 又只认 text-size-adjust 标准属性——三者不互通。
viewport 缺失或写错,text-size-adjust 直接不触发
这个属性只在「移动端渲染模式」下生效。如果 <meta name="viewport"> 缺失、顺序靠后、或写了 width=375 这类固定值,iOS Safari 会退化为桌面布局逻辑,CSS 属性压根不解析。
- 必须写:
<meta name="viewport" content="width=device-width, initial-scale=1.0">,且放在<head>最前面 -
initial-scale=1.0单独写等于没写,必须和width=device-width同时存在 - 真机调试时,用
window.getComputedStyle(document.documentElement).textSizeAdjust查返回值;如果是""(空字符串),八成是 viewport 没生效
作用位置错误:写在 p、span 上完全无效
text-size-adjust 不作用于文本自身,而是控制“文本所处的块级上下文”。浏览器只查最近的块级父容器是否设置了该值。
- 最稳妥写法:
html { text-size-adjust: 100%; -webkit-text-size-adjust: 100% !important; } - 局部修复(如页脚菜单)可加在包裹它的
<div class="footer">上,别跳过一级写到body - 避免用
* { text-size-adjust: 100% }:旧版 Safari 可能忽略通配符规则,还可能误伤表单控件
Android 微信 X5 内核根本不支持 -webkit-text-size-adjust
你在 Android 微信里加再多 !important,getComputedStyle(document.body).webkitTextSizeAdjust 返回的仍是 ""。这不是 CSS 写得不对,是内核不认。
立即学习“前端免费学习笔记(深入)”;
- 必须桥接 JS:
WeixinJSBridge.invoke('setFontSizeCallback', {fontSize: 0}),其中0表示“系统默认”,不是“最小” - JS 必须尽早执行:放在
<head>里,监听WeixinJSBridgeReady,不能等DOMContentLoaded - 还要监听
menu:setfont事件,否则用户手动点微信菜单里的「调整字体」会再次放大
取值陷阱:none 已废弃,100% 才是唯一兼容解
iOS 13+ 已废弃 none 值,部分机型会直接忽略;且 none 会破坏系统字体设置,影响低视力用户。而 100% 允许用户缩放,但禁用浏览器自动干预,是目前唯一兼顾兼容性与可访问性的选择。
-
body { -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; text-size-adjust: 100%; }是基础防线 - 若页面用了
rem,需确保根元素计算后字号 ≥16px(推荐用px或clamp()配合),否则text-size-adjust: 100%也救不了 - iOS 16+ 对前缀拦截更严格,建议同时加
html { text-size-adjust: 100%; }(标准属性,Safari 16.4+ 支持)
真正容易被忽略的是渲染时序:X5 内核的 JS 桥接必须在首屏 HTML 解析完成前就执行,否则用户会看到错位→闪动→修正的过程。这不是样式问题,是浏览器底层渲染层和 JS 运行时的竞态关系。


















