首页 > 其他分享 >vue使用flexible.js 最大宽度只有540

vue使用flexible.js 最大宽度只有540

时间:2024-01-11 16:26:43浏览次数:26  
标签:vue dpr doc js 540 scale var flexible match

分辨率大于540px的时候,flexible限制为540,一般的手机显示没有问题,但对于大于540的竖屏屏幕,可能右边就会留白。我想让横屏的时候限制在540,竖屏的时候根据页面实际宽度自适应,解决方法如下:

1、安装

npm install lib-flexible --save

 

2、为了避免每次安装的时候,都被覆盖掉,打开\node_modules\lib-flexible\flexible.js,复制一份出来放在/src/utils文件里面

 3、卸载掉

npm uninstall lib-flexible

4、打开/src/utils/flexible.js修改以代码

;(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;
        var height = docEl.getBoundingClientRect().height;
        if (width / dpr > 540) {
            //width = 540 * dpr;
            if(width < height){  //竖屏
                width = width * dpr;   //大于540也按实际页面大小
            }
            else{  //横屏
                width = 540 * 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();
    setTimeout(refreshRem, 300);  //第一次打开的时height=8,需要重新刷一下,不知道为什么
    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'] = {}));

 

5、项目里面引入
import '../utils/flexible'

 

标签:vue,dpr,doc,js,540,scale,var,flexible,match
From: https://www.cnblogs.com/handsomeziff/p/17958806

相关文章

  • Vue.nextTick在动态更新iframe的src中的使用
    Vue.nextTick在动态更新iframe的src中的使用:https://codeleading.com/article/63673310260/ 当iframe中的地址src需要动态改变时,需要使用Vue.nextTick来切换地址src,否则DOM的地址不会实现更新,而是保持上一次的src。在数据变化后要执行的某个操作,而这个操作需要使用随数据改变......
  • vue入门——???06days
    案例回顾:点击显示小电影案例-按钮点击事件-axios.get().then(res=>{res.data#响应体的内容})-v-for循环---》div#2计算属性-必须要有返回值,返回值当做属性的值-方法当属性用-computed中-它依赖的变量发生变......
  • 【js手写】手写目录
    实现防抖(debounce)和节流(throttle)函数  https://www.cnblogs.com/lishuxuan/p/17339575.html实现call函数,apply函数,bind函数  https://www.cnblogs.com/lishuxuan/p/17339575.html实现js对象扁平化   https://www.cnblogs.com/lishuxuan/p/17356804.html实现深拷贝函......
  • dremio+nessie+dbt+ cube.js 实现简单数据服务
    以前我简单写过关于dremio与cube.js集成的,随着dremio官方自己维护了一个dbt的adapter以及nessie方便的类似git的多版本元数据服务的提供,将这几个集成在一起是一个很不错的选择,尤其是希望实现自己的headlessbi服务,同时利用dbt强大的数据建模能力,可以实现数据模型开发的工......
  • 少见但非常好用的js写法技巧。
    1.使用flatMap数组方法 flatMap() 本质上是 map()和 flat() 的组合,区别在于 flatMap 只能扁平1级,flat可以指定需要扁平的级数,flatmap比分别调用这两个方法稍微高效一些。constarr=[1,2,[4,5],6,7,[8]];console.log(arr.flatMap((element)=>element));......
  • vue 高德地图异步引用
    先建立一个文件,引入高德  gDMapLoader.jsconstak='4e9f15de14b05fd8f19e1d8fbe91f0a3'exportdefaultfunctionload(){returnnewPromise(function(resolve,reject){if(window.AMap){resolve(window.AMap)}else{varscript=doc......
  • 未经授权访问 .js
    流程顺序:后台管理登陆地址→后台主页地址→fuzz测试出用户管理列表接口→直接调接口。。全程黑盒。那么接下来我逆着来推理下逻辑:首先是拿到某后台管理登录的网址 接着查看html源码,发现首页地址,http://xxx/index直接访问,访问302,然后大哥来......
  • 如何构建一个 NodeJS 影院微服务并使用 Docker 部署
    如何构建一个NodeJS影院微服务并使用Docker部署前言如何构建一个NodeJS影院微服务并使用Docker部署。在这个系列中,将构建一个NodeJS微服务,并使用DockerSwarm集群进行部署。以下是将要使用的工具:NodeJS版本7.2.0MongoDB3.4.1DockerforMac1.12.6在尝试......
  • js 垃圾回收机制
    一、概述垃圾回收机制是为了防止内存的泄漏(已经不需要的某一块内存还一直存在着),垃圾回收机制就是不停歇的寻找这些不再使用的变量,并且释放掉他所指向的内存。2、变量的生命周期变量被声明、赋值(修改)、读取、不需要时释放,是变量的生命周期。js中的变量分为局部变量和全局变量。......
  • nextjs14连接MySQL
     第一步npminstallmysql2第二步新建一个db.js db.jsimportmysqlfrom"mysql2/promise";exportasyncfunctionquery({query,values=[]}){constdbconnection=awaitmysql.createPool({host:process.env.MYSQL_HOST,post:process.env.MY......