• H5 移动端 iOS 初次加载页面,整体缩小(meta 设置失效的缘故)


    爬坑之旅

    漫长孤寂

    感谢信息时代

    感谢巨人的肩膀

    感慨完毕,回归正题

    之前开始时,遇到个奇葩的问题,在ios移动端初次加载页面,都会出现整体缩小的情况

    真的是第一次遇到,可能是经历不够丰富吧(走过的路太少了啊)

    网上百度了一圈,各有说法,

    交流群也问了一圈,回答竟然是不管

    好吧,还是得自己想办法

    排查完毕,锁定为meta  viewport的设置失效

    想想之前怎么没有呢,对比一下rem的写法

    好咯,试一下

    解决~

     

    /* eslint-disable */
    (function(designWidth, maxWidth) {
        var doc = document,
            win = window;
        var docEl = doc.documentElement;
        var metaEl,
            metaElCon;
        var styleText,
            remStyle = document.createElement("style");
        var tid;
    
        function refreshRem() {
            // var width = parseInt(window.screen.width); // uc有bug
            var width = docEl.getBoundingClientRect().width;
            if (!maxWidth) {
                maxWidth = 540;
            };
            if (width > maxWidth) { // 淘宝做法:限制在540的屏幕下,这样100%就跟10rem不一样了
                width = maxWidth;
            }
            var rem = width * 100 / designWidth;
            // var rem = width / 10; // 如果要兼容vw的话分成10份 淘宝做法
            //docEl.style.fontSize = rem + "px"; //旧的做法,在uc浏览器下面会有切换横竖屏时定义了font-size的标签不起作用的bug
            remStyle.innerHTML = 'html{font-size:' + rem + 'px;}';
        }
    
        // 设置 viewport ,有的话修改 没有的话设置
        metaEl = doc.querySelector('meta[name="viewport"]');
        // 20171219修改:增加 viewport-fit=cover ,用于适配iphoneX
        metaElCon = "width=device-width,initial-scale=1,maximum-scale=1.0,user-scalable=no,viewport-fit=cover";
        if(metaEl) {
            metaEl.setAttribute("content", metaElCon);
        }else{
            metaEl = doc.createElement("meta");
            metaEl.setAttribute("name", "viewport");
            metaEl.setAttribute("content", metaElCon);
            if (docEl.firstElementChild) {
                docEl.firstElementChild.appendChild(metaEl);
            }else{
                var wrap = doc.createElement("div");
                wrap.appendChild(metaEl);
                doc.write(wrap.innerHTML);
                wrap = null;
            }
        }
    
        //要等 wiewport 设置好后才能执行 refreshRem,不然 refreshRem 会执行2次;
        refreshRem();
    
        if (docEl.firstElementChild) {
            docEl.firstElementChild.appendChild(remStyle);
        } else {
            var wrap = doc.createElement("div");
            wrap.appendChild(remStyle);
            doc.write(wrap.innerHTML);
            wrap = null;
        }
    
        win.addEventListener("resize", function() {
            clearTimeout(tid); //防止执行两次
            tid = setTimeout(refreshRem, 300);
        }, false);
    
        win.addEventListener("pageshow", function(e) {
            if (e.persisted) { // 浏览器后退的时候重新计算
                clearTimeout(tid);
                tid = setTimeout(refreshRem, 300);
            }
        }, false);
    
        if (doc.readyState === "complete") {
            doc.body.style.fontSize = "16px";
        } else {
            doc.addEventListener("DOMContentLoaded", function(e) {
                doc.body.style.fontSize = "16px";
            }, false);
        }
    })(750, 750);

    ps:废话很多,遁走

  • 相关阅读:
    Gradle 是什么
    Spring AOP知识
    Spring IOC常用注解
    spring 依赖注入
    Java实现基数排序
    Java实现基数排序(解决负数也可以排序)
    2020/4/10安卓开发:Spinner下拉框
    Spring ioc使用
    java实现:归并排序
    centos中docker的安装
  • 原文地址:https://www.cnblogs.com/CaktyRiven/p/11168175.html
Copyright © 2020-2023  润新知