text-size-adjust: 100% 必须写在 html 元素上且 viewport 设置正确才生效;缺失或错误的 meta viewport 会导致其被忽略,android 微信 x5 内核不支持该属性,需 js 桥接处理。

直接结论:text-size-adjust: 100% 必须写在 html 上,且 <meta name="viewport"> 缺失或写错,这个声明就完全不生效。
viewport 设置错误导致 text-size-adjust 被忽略
浏览器只在「移动端渲染模式」下解析 text-size-adjust。如果 <meta name="viewport"> 缺失、位置靠后、或写了 width=375 这类固定值,iOS Safari 会退化为桌面布局逻辑,CSS 属性压根不触发。
- 必须写:
<meta name="viewport" content="width=device-width, initial-scale=1.0">,且放在最前面 -
initial-scale=1.0单独写等于没写,必须和width=device-width同时存在 - 真机调试时,用
window.getComputedStyle(document.documentElement).textSizeAdjust查返回值;如果是""(空字符串),八成是 viewport 没生效
text-size-adjust 必须作用于块级祖先,而非文本元素本身
这个属性控制的是“文本所处的块级上下文”,不是单个文字的渲染行为。给 p、span、a 写 text-size-adjust: 100% 完全无效。
- 最稳妥写法:
html { text-size-adjust: 100%; -webkit-text-size-adjust: 100% !important; } - 局部修复(如页脚菜单)可加在包裹它的
<div class="footer"> 上,别跳过一级写到 <code>body - 避免用
* { text-size-adjust: 100% }:性能差,旧版 Safari 可能忽略通配符规则,还可能误伤表单控件 - 必须桥接 JS:
WeixinJSBridge.invoke('setFontSizeCallback', {fontSize: 0}),其中0表示“使用系统默认字号”,不是“最小字号” - JS 必须尽早执行:放在
里,监听WeixinJSBridgeReady,不能等DOMContentLoaded - 还要监听
menu:setfont事件,否则用户手动点微信菜单里的「调整字体」会再次放大 - 华为 EMUI 等定制 ROM 可能绕过
WeixinJSBridge,需 fallback 到window.matchMedia('(min-resolution: 2dppx)')+ 动态重设html的font-size - JS 桥接代码必须在
中同步执行,不能延迟 - 若页面用了 rem 基准,
text-size-adjust不影响计算,但行高、内边距可能因字体临时放大而失衡,造成布局跳动 - iOS 16+ 对
-webkit-text-size-adjust的拦截更严格,建议同时声明标准属性:html { text-size-adjust: 100%; }
Android 微信 X5 内核根本不支持 text-size-adjust
iOS Safari 会读取 -webkit-text-size-adjust,但 Android 微信用的是腾讯 X5 内核,它压根不解析该属性。你在 body 上加再多次 !important,getComputedStyle(document.body).webkitTextSizeAdjust 返回的仍是空字符串。
横屏时文字闪动/错位,本质是渲染接管时机问题
即使 CSS 和 JS 都写对了,横竖屏切换瞬间仍可能看到文字先放大、再缩回——这是因为浏览器先按旧上下文渲染,再应用新规则。关键不在“怎么写”,而在“什么时候写”。











