要可靠禁用页面缩放,必须同时设置 minimum-scale=1.0 和 maximum-scale=1.0,并搭配 width=device-width 与 initial-scale=1.0;user-scalable=no 仅作辅助,不可依赖;按钮需加 touch-action: manipulation;双指缩放须用 touchstart + preventDefault({passive: false}) 拦截。

单纯设置 user-scalable=no 已无法可靠阻止手势缩放,尤其在 iOS 10.3+ 和现代安卓浏览器中,该参数会被系统主动忽略——这不是代码写错,而是浏览器出于可访问性要求的强制策略。
viewport 必须用 scale 组合替代 user-scalable
真正被广泛支持且生效的写法是同时锁定最小与最大缩放比例:
-
必须包含
width=device-width和initial-scale=1.0,否则 scale 参数可能被部分 WebView(如 UC、旧版安卓)直接跳过 - minimum-scale=1.0 和 maximum-scale=1.0 是硬性约束,浏览器会严格执行,而非提示
- 不建议省略
user-scalable=no,它仍对部分老旧环境或 WebView 有辅助作用,但不可依赖 - 正确示例:
- 该标签必须静态写在
最开头位置,JS 动态插入完全无效
按钮级双击缩放需配合 touch-action
即使 viewport 设置正确,iOS Safari 对按钮的双击仍可能触发局部放大(尤其内容溢出时)。关键在于让按钮跳过双击识别逻辑:
生成可在 deepbi 沙箱 iframe 内运行或作为独立文件运行的交互式 HTML 页面,使用 `window.deepbi` JS SDK 实现数据查询、空间管理、文件浏览及用户操作。当用户提出以下需求时启用该能力: - 创建 KPI 仪表盘、数据表格、文件浏览器、成员列表、管理页面; - 明确要求“转成 dhtml”、“转译成 HTML”、“把 XX 页面转成……”、“控制台页面”、“管理后台”、“DeepBI 页面迁移”; - 提及位于 `apps/console/src/featur
- 给所有可点击元素(如
button、.btn、[data-role="submit"])添加touch-action: manipulation; - 不要写在
body或html上,否则对轮播图、图片查看等交互造成破坏 - 确保父容器未设置
touch-action: none,否则会覆盖子元素的manipulation - 该样式同时消除 300ms 点击延迟,一并解决响应滞后问题
双指缩放必须用 JS 实时拦截
当页面内容高度超出视口(document.documentElement.scrollHeight > window.innerHeight),iOS 会自动启用双指缩放以查看溢出区域,此时 viewport 设置彻底失效。唯一有效手段是运行时拦截:
- 监听
document.documentElement的touchstart,检测event.touches.length > 1,立即event.preventDefault() - 必须传入
{ passive: false },否则 modern Chrome/Safari/Edge 会静默忽略 preventDefault - 补充监听
gesturestart事件并阻止,作为双保险(部分 iOS WebKit 版本对此更敏感) - 注意:不要监听
touchmove或touchend来防双指——缩放动作在touchstart阶段已启动
额外注意事项
以下情况会让所有防护失效,需同步检查:
- 输入框字体小于 16px 时,iOS 会自动放大整个区域,应设
font-size: 16px或更大 - 页面存在横向溢出(如未设
overflow-x: hidden或宽度过大的元素),可能触发 Safari 强制启用缩放 - iOS 13.4+ 起,长按链接或聚焦输入框时的“放大镜”功能无法禁用,这是系统级无障碍策略,合法且不可绕过










