美文网首页前端常用技术汇总vuevue技术栈
vue项目PC端随屏幕分辨率与窗口大小自适应(五步完成,吐血干货

vue项目PC端随屏幕分辨率与窗口大小自适应(五步完成,吐血干货

作者: 顺小星 | 来源:发表于2019-12-04 11:40 被阅读0次

    又见面了鸭!


    前言:这是用webpack创建的项目


    【壹】不同屏幕分辨率效果展示:

    A、1920*1080分辨率全屏显示的情况下:
    image.png
    B、1600*900分辨率全屏显示的情况下:
    image.png
    C、1024*768分辨率全屏显示的情况下:
    image.png

    【贰】不同浏览器窗口缩放时的效果展示:

    A、正常浏览窗口显示:
    image.png
    B、缩放浏览窗口显示:
    image.png

    【叁】上述HTML演示代码

    <template>
      <div class="big">
          <div class="box1"></div>
          <div class="box2"></div>
          <div class="box3" style="width:1920px;background: skyblue;"></div>
      </div>
    </template>
    
    <style>
        * {
            margin: 0;
            padding: 0;
        }
    </style>
    
    <style scoped>
        .big {
            width: 100vw;
            height: 100vh;
            background: yellowgreen;
        }
        
        .big div {
            height: 100px;
        }
        
        .big img {
            width: 710px;
            height: 400px;
        }
        
        .box1 {
            width: 960px;
            background: tomato;
        }
        
        .box2 {
            width: 1920px;
            background-color: darkred;
        }
    </style>
    

    一、npm安装依赖

    npm i lib-flexible -S
    
    npm i px2rem-loader -D
    

    二、新建文件夹

    在src下面新建utils文件夹,并新建一个js文件,取名为【flexible】

    image.png

    三、将下述代码全部复制进【flexible】文件中

    (function() {
        // flexible.css
        var cssText =
            '' +
            '@charset "utf-8";html{color:#000;background:#fff;overflow-y:scroll;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;-webkit-overflow-scrolling:touch}html *{outline:0;-webkit-text-size-adjust:none;-webkit-tap-highlight-color:transparent}body,html{font-family:"Microsoft YaHei",sans-serif,Tahoma,Arial}article,aside,blockquote,body,button,code,dd,details,div,dl,dt,fieldset,figcaption,figure,footer,form,h1,h2,h3,h4,h5,h6,header,hgroup,hr,input,legend,li,menu,nav,ol,p,pre,section,td,textarea,th,ul{margin:0;padding:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}article,aside,details,figcaption,figure,footer,header,hgroup,menu,nav,section{display:block}input,input[type=button],input[type=reset],input[type=submit]{resize:none;border:none;-webkit-appearance:none;border-radius:0}input,select,textarea{font-size:100%}table{border-collapse:collapse;border-spacing:0}fieldset,img{border:0}abbr,acronym{border:0;font-variant:normal}del{text-decoration:line-through}address,caption,cite,code,dfn,em,th,var{font-style:normal;font-weight:500}ol,ul{list-style:none}caption,th{text-align:left}h1,h2,h3,h4,h5,h6{font-size:100%;font-weight:500}q:after,q:before{content:\'\'}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}a:hover{text-decoration:underline}a,ins{text-decoration:none}a:active,a:hover,a:link,a:visited{background:0 0;-webkit-tap-highlight-color:transparent;-webkit-tap-highlight-color:transparent;outline:0;text-decoration:none}';
        // cssText end
    
        var styleEl = document.createElement('style');
        document.getElementsByTagName('head')[0].appendChild(styleEl);
        if (styleEl.styleSheet) {
            if (!styleEl.styleSheet.disabled) {
                styleEl.styleSheet.cssText = cssText;
            }
        } else {
            try {
                styleEl.innerHTML = cssText;
            } catch (e) {
                styleEl.innerText = cssText;
            }
        }
    })();
    
    
    ;
    (function(win, lib) {
        var doc = win.document;
        var docEl = doc.documentElement;
        var metaEl = doc.querySelector('meta[name="viewport"]');
        var flexibleEl = doc.querySelector('meta[name="flexible"]');
        var dpr = 0;
        var scale = 0;
        var tid;
        var flexible = lib.flexible || (lib.flexible = {});
    
        if (metaEl) {
            console.warn('将根据已有的meta标签来设置缩放比例');
            var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);
            if (match) {
                scale = parseFloat(match[1]);
                dpr = parseInt(1 / scale);
            }
        } else if (flexibleEl) {
            var content = flexibleEl.getAttribute('content');
            if (content) {
                var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
                var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);
                if (initialDpr) {
                    dpr = parseFloat(initialDpr[1]);
                    scale = parseFloat((1 / dpr).toFixed(2));
                }
                if (maximumDpr) {
                    dpr = parseFloat(maximumDpr[1]);
                    scale = parseFloat((1 / dpr).toFixed(2));
                }
            }
        }
    
        if (!dpr && !scale) {
            var isAndroid = win.navigator.appVersion.match(/android/gi);
            var isIPhone = win.navigator.appVersion.match(/iphone/gi);
            var devicePixelRatio = win.devicePixelRatio;
            if (isIPhone) {
                // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
                if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
                    dpr = 3;
                } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
                    dpr = 2;
                } else {
                    dpr = 1;
                }
            } else {
                // 其他设备下,仍旧使用1倍的方案
                dpr = 1;
            }
            scale = 1 / dpr;
        }
    
        docEl.setAttribute('data-dpr', dpr);
        if (!metaEl) {
            metaEl = doc.createElement('meta');
            metaEl.setAttribute('name', 'viewport');
            metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
            if (docEl.firstElementChild) {
                docEl.firstElementChild.appendChild(metaEl);
            } else {
                var wrap = doc.createElement('div');
                wrap.appendChild(metaEl);
                doc.write(wrap.innerHTML);
            }
        }
    
        function refreshRem() {
            var width = docEl.getBoundingClientRect().width;
            if (width / dpr > 540) {
                width = width * dpr;
            }
            var rem = width / 10;
            docEl.style.fontSize = rem + 'px';
            flexible.rem = win.rem = rem;
        }
    
        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 = 12 * dpr + 'px';
        } else {
            doc.addEventListener('DOMContentLoaded', function(e) {
                doc.body.style.fontSize = 12 * dpr + 'px';
            }, false);
        }
    
    
        refreshRem();
    
        flexible.dpr = win.dpr = dpr;
        flexible.refreshRem = refreshRem;
        flexible.rem2px = function(d) {
            var val = parseFloat(d) * this.rem;
            if (typeof d === 'string' && d.match(/rem$/)) {
                val += 'px';
            }
            return val;
        }
        flexible.px2rem = function(d) {
            var val = parseFloat(d) / this.rem;
            if (typeof d === 'string' && d.match(/px$/)) {
                val += 'rem';
            }
            return val;
        }
    
    })(window, window['lib'] || (window['lib'] = {}));
    

    四、在main.js中按路径引用【flexible】

    引用的路径一定要正确!按照你的实际路径来

    //main.js中
    import './utils/flexible'
    

    五、修改build中的utils.js

    image.png
    //build文件下的utils.js文件
    const px2remLoader = {
            loader: 'px2rem-loader',
            options: {
                remUnit: 192
            }
    }
    
    //build文件下的utils.js文件
    const loaders = options.usePostCSS ? [cssLoader, postcssLoader, px2remLoader] : [cssLoader, px2remLoader]
    

    六、重启服务(到此步骤自适应功能已实现)

    以上步骤全部完成之后,重启服务,已经宽高都已能够实现自适应。但是发现两边出现了滚动条:

    image.png

    七、去除滚动条

    1、在常规去除滚动条方法中,是在大div外面套一层大div,再将其【overflow: hidden;】见下:

    image.png

    2、横向滚动条是消除了,可是竖向滚动条依然存在

    image.png

    3、检查元素发现其存在于HTML标签上

    image.png

    4、在底部的index.html上加上【overflow:hidden】

    image.png

    八、至此已全部调整完毕

    注意事项:代码中的px是以flexible.js自动计算成rem的,其中有一个隐藏的问题,就是只能自动转换内嵌的style样式。不能计算行内样式中的px。

    image.png
    image.png

    总结:如果要去除隐疾,全部都要使用内嵌样式,不要使用行内样式。

    等我休息片刻,总结一下在cli创建的项目中的自适应,大致一样,略有不同。


    【2019.12.04晚】试了网上的几个方法,没成功。已经解决的朋友我们可以讨论一下

    相关文章

      网友评论

        本文标题:vue项目PC端随屏幕分辨率与窗口大小自适应(五步完成,吐血干货

        本文链接:https://www.haomeiwen.com/subject/lbgkgctx.html