原文:http://www.grycheng.com/?p=2411 html
微信 webview 内置了调整字体大小的功能,对于网页的可用性来讲是一个很实用的功能。一些网页的字体设置太小致使用户看不清文字,调整字体大小便可解决这个问题。web
可是对于一些追求显示效果的移动端页面来讲,字体大小的调整可能会致使部分文字没法显示甚至是页面布局出错。如图,大众点评案例。微信
解决方案布局
微信的 iOS 版的调整字体大小使用的是经过给 body 设置 -webkit-text-size-adjust:120% 属性实现的,Android 则是用过 Java 调用 webview 的 API 设置字体大小。测试
由于这两个系统实现调整字体大小的原理不一样,因此须要两种方法来限制微信对网页字体大小的调整。字体
iOSspa
在 iOS 下,对网页的 body 元素设置 -webkit-text-size-adjust: 100% !important; 能够覆盖掉微信的样式。code
1 body { 2 -webkit-text-size-adjust: 100% !important; 3 }
Androidhtm
在 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 延迟生效问题录屏:
测试用例
http://www.grycheng.com/case/resize_font.html
总结
因为实现原理的不一样,目前的解决方案只在 iOS 上表现完美,Android 下仍然有延迟生效问题。若是你有更好的解决方案,欢迎在评论里补充。