当使用post-px2rem在app中完全适配方案讨论

608 阅读3分钟

当使用post-px2rem在app中完全适配方案讨论

问题描述

在最近活动页的页面中,发现用手机微信访问页面发生了错乱,当前我使用的是post-px2rem,本想着不应该呀,尝试替换成post-px2vw结果问题就不存在了,但是项目中要求在pc上两边留白边,居中布局显示,这样的话只能用px2rem,变态的需求总是让攻城狮们受尽折磨,所以就尝试解决这个问题。

研究

那就把html标签打印一下吧,

let designWidth = 750;
let rem1 = 75;
let shouldWidth = (75/750)*clientWidth;
document.documentElement.style.fontSize = shouldWidth + 'px';
// 如果屏幕是360 那么这个里应该是36px

//但是通过打印得到 的是40多(这里我在微信app中调整字体为放大了一些)
console.log(getComputedStyle(document.documentElement).fontSize);

打印图显示总是比计算的大一些

更改微信中的字体再打开活动页后完美的复现了这个问题,很好,问题被定为到了,就找解决方法吧。

解决

解决方案最简单的肯定是通过webview方面,直接禁用字体调整,或者直接使用默认字体,但是市面上各种第三方app作为载体来打开活动页,肯定是不能指望在app端直接设置解决 关于怎么在app端解决这个问题,请看这里,很详细。

1.既然是在微信中,那么用微信给的api禁用一下就完美解决了

(function() {
    if (typeof WeixinJSBridge == "object" && typeof WeixinJSBridge.invoke == "function") {
        handleFontSize();
    } else {
        document.addEventListener("WeixinJSBridgeReady", handleFontSize, false);
    }
    function handleFontSize() {
        // 设置网页字体为默认大小
        WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize' : 0 });
        // 重写设置网页字体大小的事件
        WeixinJSBridge.on('menu:setfont', function() {
            WeixinJSBridge.invoke('setFontSizeCallback', { 'fontSize' : 0 });
        });
    }
 })();

2.那么就通过meta的initial-scale来进行解决

既然font-size会给我自动的乘以一个缩放系数,那么我就把这个缩放系数算出来,然后通过initial-scale进行整体的缩放

 (function () {
      let clientWidth = document.documentElement.clientWidth;
      // 如果postcss按照1rem = 75px来计算的话
      let designWidth = 750;
      let rem1 = 75;
      let shouldWidth = (75/750)*clientWidth;
      document.documentElement.style.fontSize = shouldWidth + 'px';
      let curSizeStr = getComputedStyle(document.documentElement).fontSize;
      let curSize = curSizeStr.split('px')[0];
      console.log(curSize);
     
      let scale = shouldWidth/curSize;
      var mvp = document.getElementById('viewport');
      let m = mvp.getAttribute('content');
      let marry = m.split(',');
      let index = marry.findIndex((a) => {
        if(a.includes('initial-scale')) {
          return true;
        }        
      })

      if(index !== -1) {
        marry[index] = 'initial-scale='+ scale;
      } else {
        marry.push('initial-scale='+ scale);
      }
      
      mvp.setAttribute('content',marry.join(','));
      console.log('应该缩放', scale);
    })();

比较值得注意的是页面要首先拥有meta

 <meta id="viewport" name="viewport" 
 content="width=device-width,initial-scale=1, user-scalable=no,viewport-fit=cover">

并且需要应当渲染的font-size单位是px,不要使用vw,vw会受到initial-scale属性的影响。

总结

app上webview等浏览器载体会设置字体大小,当渲染页面的时候,会自动对你写的fontsize的值进行乘以一个缩放系数。现在的解决方式基本上就是取巧的方式,可能有很多的未知的问题。 建议在移动端适配上能用vw就用vw吧

参考资料

移动端用户设置字体放大导致的问题