大小屏适配

简介: 优化

方案一:lib-flexible

移动端适配:

一般而言,lib-flexible 并不独立出现,而是搭配 px2rem-loader 一起做适配方案,目的是 自动将 CSS 中的 px 转换成 rem。以下为它在 vue 中的使用

1、安装

npm install lib-flexible --save-dev

2、在 main.js 中引入 lib-flexible

// px2rem 自适应
import 'lib-flexible'

3、安装 px2rem-loader

npm install px2rem-loader --save-dev

4、配置 px2rem-loade

vue-cli 2.x版本

4.1、在 build/utils.js 中,找到 exports.cssLoaders,作出如下修改:

const px2remLoader = {
    loader: 'px2rem-loader',
    options: {
        remUint: 75 // 以设计稿 750 为例, 750 / 10 = 75
    }
}

4.2、找到 generateLoaders 中的 loaders 配置,作出如下:

// 注 释 掉 这 一 行 
// const loaders = options.usePostCSS ? [cssLoader,postcssLoader] : [cssLoader]
// 修改为 
const loaders = [cssLoader, px2remLoader]
if (options.usePostCSS) {
    loaders.push(postcssLoader)
}

vue-cli 3.x版本

在项目根目录新建文件 vue.config.js,然后如下配置:

module.exports = { 
    css: {
        loaderOptions: { css: {},
        postcss: {
                plugins: [ 
                    require('postcss-px2rem')({
                        // 以设计稿 750 为例, 750 / 10 = 75
                        remUnit: 75
                    }),
                ]
            }
        }
    },
};

重新 npm run dev,完

大屏适配

​ 假如我们屏幕尺寸要做以 3840 x 2160 为设计稿的适配,那么我们的 remUnit 的值则 改为 384。此时就需要修改源码啦!

1、找到源码

打开./node_modules/lib-flexible/flexible.js,找到如下片段源码:

function refreshRem(){ 
    var width = docEl.getBoundingClientRect().width;
    if (width / dpr > 540) { 
        width = 540 * dpr;
    }
    var rem = width / 10;
    docEl.style.fontSize = rem + 'px';
    flexible.rem = win.rem = rem;
}
解决:当屏幕宽度除以 dpr(dpr 是一个倍数,此处一般为 1) 大于 540 这个特定值的时候,那么就不再进行适配了问题

2、修改源码

假如我要适配的大屏幕尺寸是基于 3840 的设计稿, 而要求最小范围是 1980,最大为 5760,那么我们要修改的则变为

function refreshRem(){ 
    var width = docEl.getBoundingClientRect().width;
    if (width / dpr < 1980) { 
        width = 1980 * dpr;
    } else if (width / dpr > 5760) { 
        width = 5760 * dpr;
    }
    var rem = width / 10;
    docEl.style.fontSize = rem + 'px';
    flexible.rem = win.rem = rem;
}
注:修改完成后,重启项目,则会适配到相应的尺寸。此外还有一个提示,当脱离掉 node_modules 重新 npm install 项目依赖时还是需要重新修改一遍的!

方案二:监听浏览器的窗口大小

1、初始化的时候获得大屏幕的比例

2、把这个比例设置给CSS的scale变量

3、监听浏览器的窗口大小,将新的比例赋给scale变量

<div class="ScaleBox" ref="ScaleBox" >
    
mounted() {
    this.setScale(); 
    window.addEventListener("resize", this.setScale);
},
methods: {
    getScale() { 
        const { width, height } = this;
        let ww = window.innerWidth / width;
        let wh = window.innerHeight / height;
        return ww < wh ? ww : wh;
    },
    setScale() {
        this.scale = this.getScale();
        this.$refs.ScaleBox.style.setProperty("--scale", this.scale);
    },
}

#ScaleBox { 
  --scale: 1;
}
.ScaleBox {
    transform: scale(var(--scale)) ;
}

VUE 组件就封装

<template>
    <div class="wrap">
        <div class="ScaleBox" ref="ScaleBox" :style="{width, height}">
            <BigScreen></BigScreen>
        </div>
    </div>
</template>
<script>
export default { 
    name: "ScaleBox",
    props: { 
       width: {
           type: Number,
           default: 1920
       },
       height: {
           type: Number,
           default: 1080
       }
    },
    data() {
        return {
            scale: null
        };
    },
    mounted() {
        this.setScale();                                     window.addEventListener("resize", this.setScale);
    }, 
    methods: {
        // 获取较小比例的一条边, 这样较大比例的一条边就可以按照既定的比例缩放了, width 和 height 是设置的默认比例,window.innerWidth 和window.innerHeight 是大屏幕的缩放尺寸.
        getScale() { 
            const { width, height } = this;
            let ww = window.innerWidth / width;
            let wh = window.innerHeight / height;
            return ww < wh ? ww : wh;
        },
        setScale() {
            this.scale = this.getScale();
            this.$refs.ScaleBox.style.setProperty("--scale", this.scale);
        },
        debounce(fn, delay) {
            let delays = delay || 500;
            let timer;
            return function() {
                let th = this;
                let args = arguments;
                if (timer) { clearTimeout(timer);
            }
            timer = setTimeout(function() {
                timer = null;
                fn.apply(th, args);
            }, delays);
        };
    }
 }
};
</script>
<style >
#ScaleBox { 
    --scale: 1;
}
.wrap {
    background: #eee; width: 100%;
    height: 5000px;
}
.ScaleBox {
    transform: scale(var(--scale)) translate(-50%, -50%);
    display: flex;
    height: 100%;
    flex-direction: column;
    transform-origin: 0 0;
    position: absolute;
    left: 50%;
    top: 50%;
    transition: 0.3s;
    z-index: 999;
}
</style>
目录
相关文章
|
2月前
|
编解码
跨屏适配问题有哪些
跨屏适配问题有哪些
10 0
|
6月前
|
iOS开发
移动端iPhone系列适配问题的一些坑
移动端iPhone系列适配问题的一些坑
53 0
|
10月前
|
iOS开发
IPhone X 以上 ”下巴“ 的适配
IPhone X 以上 ”下巴“ 的适配
217 0
|
12月前
|
小程序
如何让你的小游戏适配不同尺寸的手机屏幕
本文主要内容:教你如何对游戏中的 UI,背景以及内容进行不同尺寸屏幕的适配,让你的小游戏在各种尺寸的屏幕上,都展示出最好的一面。 如果你没有任何的游戏开发经验,欢迎观看我的“人人都能做游戏”系列视频教程,它会手把手的教你做出自己的第一个小游戏。
356 0
|
12月前
|
XML 设计模式 缓存
优酷折叠屏适配下——从测试的角度思考折叠屏适配问题
优酷折叠屏适配下——从测试的角度思考折叠屏适配问题
299 0
|
12月前
|
编解码 自然语言处理 前端开发
PC端高倍屏适配方案实践
随着PC端屏幕的发展,PC端也逐步出现了更高倍数的屏幕,相对于手机端的Retina屏,PC端也出现了多倍数适配的要求,本文主要是PC端高倍屏幕适配方案的一个实践总结,希望能给对PC端有适配高倍屏幕需求的同学有一些思路的启发和借鉴
120 0
|
12月前
|
API 开发工具 UED
优酷折叠屏适配上——整体思路与实现
优酷折叠屏适配上——整体思路与实现
381 0
|
编解码 前端开发
基本的移动端适配
一个项目一般拥有移动端和pc端的产品图 我们为了减少工作量会在开发pc端时同时使它适配移动端
82 2
|
XML 编解码 API
让你的应用完美适配平板
其实标题有点吹牛逼了,谁也不敢说能完美适配平板,只能说尽力去做,包括显示和使用的各个方面尽力去做,才有可能在更多的平板设备上更加完美的运行起来,因为安卓的设备实在是太多了,之前手机在卷,现在平板也一样在卷。。。
291 0
让你的应用完美适配平板
ADI
|
前端开发 iOS开发
[分享] 移动端适配iPhoneX方案
[分享] 移动端适配iPhoneX方案
ADI
87 0