移动端字体放大后页面变形布局错乱问题解决方案
方案一:html 和JS结合
<body style="-webkit-text-size-adjust: 100%!important;">
<script type="text/javascript">
(function () {
if (typeof WeixinJSBridge == "object" && typeof WeixinJSBridge.invoke == "function") {
handleFontSize();
} else {
if (document.addEventListener) {
document.addEventListener("WeixinJSBridgeReady", handleFontSize, false);
} else if (document.attachEvent) {
document.attachEvent("WeixinJSBridgeReady", handleFontSize);
document.attachEvent("onWeixinJSBridgeReady", handleFontSize);
}
}
function handleFontSize() {
WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize': 0 });
WeixinJSBridge.on('menu:setfont', function () {
WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize': 0 });
});
}
})();
</script>
</body>
方案二:纯JS解决方案
<script type="text/javascript">
(function () {
document.querySelector("body").style.webkitTextSizeAdjust="100%";//IOS解决方案
if (typeof WeixinJSBridge == "object" && typeof WeixinJSBridge.invoke == "function") {
handleFontSize();
} else {
if (document.addEventListener) {
document.addEventListener("WeixinJSBridgeReady", handleFontSize, false);
} else if (document.attachEvent) {
document.attachEvent("WeixinJSBridgeReady", handleFontSize);
document.attachEvent("onWeixinJSBridgeReady", handleFontSize);
}
}
function handleFontSize() {
WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize': 0 });
WeixinJSBridge.on('menu:setfont', function () {
WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize': 0 });
});
}
})();
</script>
参考 :移动端页面字体在微信被放大,导致排版错乱_weixin_30321709的博客-CSDN博客
微信 webview 内置了调整字体大小的功能,对于网页的可用性来说是一个很实用的功能。一些网页的字体设置过小导致用户看不清文字,调整字体大小即可解决这个问题。
但是对于一些追求显示效果的移动端页面来说,字体大小的调整可能会导致部分文字无法显示甚至是页面布局出错。如图,大众点评案例。
解决方案
微信的 iOS 版的调整字体大小使用的是通过给 body
设置 -webkit-text-size-adjust:120%
属性实现的,Android 则是用过 Java 调用 webview 的 API 设置字体大小。
因为这两个系统实现调整字体大小的原理不同,所以需要两种方法来限制微信对网页字体大小的调整。
iOS
在 iOS 下,对网页的 body
元素设置 -webkit-text-size-adjust: 100% !important;
可以覆盖掉微信的样式。
body {
-webkit-text-size-adjust: 100% ;
}
Android
在 Android 下,需要通过 WeixinJSBridge
对象将网页的字体大小设置为默认大小,并且重写设置字体大小的方法,让用户不能在该网页下设置字体大小。
(function() {
if (typeof WeixinJSBridge == "object" && typeof WeixinJSBridge.invoke == "function") {
handleFontSize();
} else {
if (document.addEventListener) {
document.addEventListener("WeixinJSBridgeReady", handleFontSize, false);
} else if (document.attachEvent) {
document.attachEvent("WeixinJSBridgeReady", handleFontSize);
document.attachEvent("onWeixinJSBridgeReady", handleFontSize);
}
}
function handleFontSize() {
WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize' : 0 });
WeixinJSBridge.on('menu:setfont', function() {
WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize' : 0 });
});
}
})();
复制代码
注意:如果用户之前已经设置过了字体大小,访问网页时会先看到字体被放大后的效果再恢复正常,因为在 WeixinJSBridge
对象初始化完成之后才能通过 WeixinJSBridge
对象的方法设置为默认大小。
Android 延迟生效问题录屏:
总结
由于实现原理的不同,目前的解决方案只在 iOS 上表现完美,Android 下仍然有延迟生效问题。如果你有更好的解决方案,欢迎在评论里补充。
作者:路克克
链接:https://juejin.cn/post/6844903438602485773
相关文章
- 【测试面试题】页面很卡的原因分析及解决方案
- 【JAVA】MyEclipse中JSP页面出现中文乱码问题(3种情况的解决方案)
- 监控WebLogic 8.x的解决方案(监控应用服务器系列文章)
- VMware提示:已将该虚拟机配置为使用 64 位客户机操作系统。但是,无法执行 64 位操作。解决方案
- 混合云态势感知安全解决方案
- flutter packages get 慢 解决方案
- javascript移动端禁止页面滑动的解决方案
- Mysql日期统计自动补充日期,Mysql日期统计日期不连续解决方案
- java.lang.NoClassDefFoundError: org/apache/commons/logging/LogFactory 解决方案
- vue单页面应用刷新网页后vuex的state数据丢失的解决方案
- Java_Servlet 中文乱码问题及解决方案剖析
- H5唤起APP的解决方案:手机浏览器跳转app内指定页面(URL Scheme使用)
- jsPDF将html页面生成pdf文件的前端解决方案及html2canvas如何真正解决跨域图片的问题
- vue项目刷新当前页面的几种解决方案对比:如何优雅的强制重新渲染子组件
- 启扬智能床旁交互终端解决方案,建设智慧病房系统
- 一个页面标题和过滤输出的解决方案(下)
- Xcode 插件失效的临时解决方案
- java中路径中参数值是中文,打印到页面是乱码的解决方案
- axios设置withCredentials导致“跨域”的解决方案