美文网首页🐋成员文章 菲麦前端程序员
利用rem实现网页的等比适配

利用rem实现网页的等比适配

作者: 小虫巨蟹 | 来源:发表于2017-03-27 15:24 被阅读311次

可能是理解viewport最好的方式说过使用viewport来实现等比适配的例子,本文来讲讲等比适配的另一种方式

推导

拿到一个宽度为vWidth的视觉稿
设设备屏幕宽度为dWidth
在视觉稿上量得一个元素的宽度为eleVWidth
那么要实现按照宽度等比适配,在各种设备中元素的实际宽度X将满足公式

    //等比
    eleVWidth/vWidth = X/dWidth;

    //我们的目的是求X
    X = (eleVWidth/vWidth)dWidth;

拿到视觉稿之后,eleVWidth和vWidth都已经固定了,但是dWidth在不同的设备中确实不同的,而且需要实际运行的时候我们才能拿到dWidth,这个时候就要利用rem的特性了,我们通过阻塞运行的js动态设置rem,使得rem=dWdith/10,套入刚才的公式:


    X=(eleVWidth/vWidth)*10*rem

    //体现在css中
    .className {
        width: (eleVWidth/vWidth)*10 rem
    }

为什么设置是dWdith/10呢?方便计算而已,当然也可以除以别的基数,但是尽量不要让rem太小,有兼容性问题

动态设置rem

这段css需要放在body标签的开始位置,因为rem值要尽可能早的设置成功,避免无谓的重排重绘(有些设备中若元素样式已经生效,动态改变rem未必能起作用,所以这个动作更需要提前)

    <body>
        <script>
        (function() {
            var ua = window.navigator.userAgent;
            var docEl = document.documentElement;
            var html = document.querySelector('html');
            var isAndorid = /Android/i.test(ua);
            var dpr = window.devicePixelRatio || 1;
            var rem = docEl.clientWidth / 10;

            // 设置 rem 基准值
            html.style.fontSize = rem + 'px';

            // Nexus 5 上 rem 值不准,
            // 如:设置100px,getComputedStyle 中的值却为 85px,导致页面错乱
            // 这时需要检查设置的值和计算后的值是否一样,
            // 不一样的话重新设置正确的值
            var getCPTStyle = window.getComputedStyle;
            var fontSize = parseFloat(html.style.fontSize, 10);
            var computedFontSize = parseFloat(getCPTStyle(html)['font-size'], 10);
            if (getCPTStyle && Math.abs(fontSize - computedFontSize) >= 1) {
                html.style.fontSize = fontSize * (fontSize / computedFontSize) + 'px';
            }

            // 设置 data-dpr 属性,留作的 css hack 之用
            html.setAttribute('data-dpr', dpr);

            // 安卓平台额外加上标记类
            if (isAndorid) {
                html.setAttribute('data-platform', 'android');
            }
        })();
        </script>
        ...
    </body>

css中应该怎么写

如果每在视觉稿上量出一个值,在写到样式文件之前都得通过那个公司计算一翻,那绝对不是一个好策略,我们希望量到啥就写啥

使用less,sass等css预处理器的函数

    //设计稿为640
    @function rem($val) {
        @return $val/64 * 1rem;;
    }

    //设计稿为750
    @function rem750($val) {
        @return $val/75 * 1rem;
    }

    //使用
    .className {
        width: @rem(100);
    }

也可以使用webpack-loader,change-rem-loader,这个loader代码做的事也是上述的转化计算(写一个webpack loader并不复杂,你可以自己写一个符合自己情况的loader)

    'use strict';
    module.exports = function(source) {
        source = source.replace(/rem(\d*)\((.*?)\)/g, function(match, type, value) {
            var divVal;

            // 不做 try catch,及早发现错误以免造成故障
            switch (type) {
                // 1080宽度的设计稿,rem1080(value)
                case '1080':
                    divVal = 108;
                    break;
                    // 默认为750宽度的设计稿,rem(value)
                case '750':
                    divVal = 75;
                    break;
                default:
                    divVal = 64;
            }

            return (value / divVal).toFixed(6) + 'rem';
        });
        return source;
    }

这样之后,我们css同样可以这样写(如何让loader起作用不是本文的范围)

    .className {
        width: rem(100);
    }

也许你的工程技术栈里面,使用的不是webpack,也没有使用less、sass等预处理器,那你可以根据你的实际情况去寻找一种预处理方案,只要达到推导公式的效果就可以了。
什么?没有合适的方案,那你是时候充充电了

菲麦前端专题,汇聚前端好文,邀您关注!

相关文章

  • 利用rem实现网页的等比适配

    在可能是理解viewport最好的方式说过使用viewport来实现等比适配的例子,本文来讲讲等比适配的另一种方式...

  • rem字体适配

    用rem来写网页,可以实现调整根字体大小,整个网页等比例变化,省去了后期维护的麻烦。访问我的博客查看。 rem字体...

  • 等比适配的最后一个补丁

    此前分享过两篇关于等比适配的文章(Viewport And Rem),分别介绍了按照宽度进行等比适配的两种具体实。...

  • js+rem动态计算font-size的大小,适配各种设备!

    需求: 在不同的移动终端设备中实现,UI设计稿的等比例适配。 方案: 布局排版都用rem做单位,然后不同宽度的屏,...

  • html----rem结合vw布局

    1.rem rem是相对于根元素的字体大小的单位 rem能等比例适配所有的屏幕,根据html的字体的大小来控制re...

  • React 配置 rem (移动端适配)

    移动端适配方案介绍 在移动端中,为了设配不同的设备,通常使用rem来做适配。 rem是通过根元素进行适配的,网页中...

  • CSS3的REM设置字体大小

    1.使用rem来设置Web页面的字体大小; 2.rem是相对于根元素 ; 3.rem能等比例适配所有屏幕 4.在根...

  • 了解真实的『REM』手机屏幕适配

    了解真实的『REM』手机屏幕适配rem 作为一个低调的长度单位,由于手机端网页的兴起,在屏幕适配中得到重用。 使用...

  • 移动端适配方案

    @description 该方法是用于移动端适配功能, 结合淘宝的适配方案flexible + rem 实现适配,...

  • Rem.js 适配不同分辨率终端设置

    代码一 代码二 上面两种代码都可以实现适配不同分辨率,展示效果 引用rem.js文件,在不同终端下都能够等比例的缩放

网友评论

本文标题:利用rem实现网页的等比适配

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