zoukankan      html  css  js  c++  java
  • 手机端页面自适应解决方案—rem布局

    相信很多刚开始写移动端页面的同学都要面对页面自适应的问题,当然解决方案很多,比如:百分比布局,弹性布局flex(什么是flex),也都能获得不错的效果,这里主要介绍的是本人(不是本人,我只是搬运工,末尾有彩蛋)在实践中用的最顺手最简单的布局方案——rem(什么是rem)布局

    rem布局非常简单,首页你只需在页面引入这段原生js代码就可以了

        (function (doc, win) {
            var docEl = doc.documentElement,
                resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
                recalc = function () {
                    var clientWidth = docEl.clientWidth;
                    if (!clientWidth) return;
                    if(clientWidth>=640){
                        docEl.style.fontSize = '100px';
                    }else{
                        docEl.style.fontSize = 100 * (clientWidth / 640) + 'px';
                    }
                };
    
            if (!doc.addEventListener) return;
            win.addEventListener(resizeEvt, recalc, false);
            doc.addEventListener('DOMContentLoaded', recalc, false);
        })(document, window);

    如何使用?

    这是rem布局的核心代码,这段代码的大意是:
    如果页面的宽度超过了640px,那么页面中html的font-size恒为100px,否则,页面中html的font-size的大小为: 100 * (当前页面宽度 / 640)
    于是,问题来了,为什么要这样?别急,我先来一一回答

    1. 为什么是640px?
      对于手机屏幕来说,640px的页面宽度是一个安全的最大宽度,保证了移动端页面两边不会留白。注意这里的px是css逻辑像素,与设备的物理像素是有区别的。如iPhone 5使用的是Retina视网膜屏幕,使用2px x 2px的 device pixel 代表 1px x 1px 的 css pixel,所以设备像素数为640 x 1136px,而它的CSS逻辑像素数为320 x 568px。
      如果要切移动端页面,你可以先把效果图宽度等比例缩放到640px,很好用。
    2. 为什么要设置html的font-size?
      rem就是根元素(即:html)的字体大小。html中的所有标签样式凡是涉及到尺寸的(如: height,width,padding,margin,font-size。甚至,left,top等)你都可以放心大胆的用rem作单位。
      如果你把html的font-size设为20px,前面说过,rem就是html的字体大小,那么1rem = 20px。
      此时,此时宽60px,高40px的元素样式就这样设置如下  ↓
       3rem;
      height: 2rem;

      那要是宽55px,高37px呢?然后经过换算,,设置如下 ↓

       2.75rem;
      height: 1.85rem;

      是不是发现这换算起来有点麻烦啊,,,(当然,你要是心算帝请无视)
      如果我们一开始把html的font-size设为100px呢?此时1rem = 100px,那么上面的宽55px,高37px的元素样式就可以这么设置 ↓

       0.55rem;
      height: 0.37rem;

      是不是换算起来简单多了?!
      (当然可能有同学问,为什么不一开始把html的font-size设为1px呢,这样换算起来也简单,答:浏览器一般都有最小字体限制,比如谷歌浏览器,最小中文字体就是12px,所以实际上没有办法让1rem=1px。)
      根据上面的js代码,如果页面宽度低于640px,那么页面中html的font-size也会按照(当前页面宽度/640)的比例变化。这样,页面中凡是应用了rem的作尺寸单位的元素都会随着页面变化而等比例缩放了!

    3. 都哪些情况可以用rem布局?
      大部分情况下都可以用rem布局这个方法,当然具体还要看情况而定。拿我们公司项目举例,只有底部的导航不用rem,而是用的flex布局。因为导航点击最多,所以给它一个固定的大小(其实就是高度固定,宽度自适应的方案)。大家可以看看淘宝的这个手机页面 淘宝手机站,基本就是这种感觉,底部导航和顶部搜索框用的高固定,宽自适应的方案,其余的部分基本都是随着浏览器宽度变化在等比例缩放。

    最终页面代码首页代码大致如下

    <!DOCTYPE html>
    <html lang="en">
    <head> 
     <meta charset="UTF-8">  
     <meta name="viewport" content="width=device-width,minimum-scale=1.0,maximum-scale=1.0,user-scalable=no">  
    <script>   
    (function (doc, win) {
            var docEl = doc.documentElement,
                resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
                recalc = function () {
                    var clientWidth = docEl.clientWidth;
                    if (!clientWidth) return;
                    if(clientWidth>=640){
                        docEl.style.fontSize = '100px';
                    }else{
                        docEl.style.fontSize = 100 * (clientWidth / 640) + 'px';
                    }
                };
    
            if (!doc.addEventListener) return;
            win.addEventListener(resizeEvt, recalc, false);
            doc.addEventListener('DOMContentLoaded', recalc, false);
        })(document, window);
    </script> 
     /*你引进的资源*/
    <title>标题</title> 
    </head>
    <body>
     /*你的代码*/
    </body>
    </html>

    rem布局实践应用


    Iphone 6 下页面效果

    Iphone 4 下页面效果
     
    你们期待的本人终于出现啦~~~~哈哈哈哈~~~~
    用这代码实践了下,感觉不错,之前我是用百分比的布局制作页面,主要说说实践的一些心得体会:
    1、如果你整个页面都是图片形式,建议用百分比布局
     
    2、如果涉及到文字及高度问题时,建议用以上所说的rem布局,因为不管百分比呀、媒体查询呀、什么鬼布局呀,本人都无法解决文字及高度屏幕自适应的办法,媒体查询简直不是人写的,工作量太大了。网上也有人使用视区相关单位vw,vh,感兴趣的可以度娘下。
     
    3、以上使用100px作为恒值,但本人在实践中时,当我图片高度小于139px时,它会在图片下方填充空白直至139px,百思不得其解,这139的高度到底是什么鬼,有知道的麻烦您解释下。于是,本人用了20px作为恒值。
    JS代码:
    (function (doc, win) {
        var docEl = doc.documentElement,
            resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
            recalc = function () {
                var clientWidth = docEl.clientWidth;
                if (!clientWidth) return;
                if(clientWidth>640){
                    docEl.style.fontSize = '20px';
                }else{
                    docEl.style.fontSize = 20 * (clientWidth / 640) + 'px';
                }
            };
    
        if (!doc.addEventListener) return;
        win.addEventListener(resizeEvt, recalc, false);
        doc.addEventListener('DOMContentLoaded', recalc, false);
    })(document, window);

    CSS主体样式:

    .wrap{max-width:640px; min-width:320px; margin:0 auto; overflow:hidden;}
    .wrap img{max-width:100%;}

    有人写rem布局时,会在css样式里也写恒值,我也试着写了下,但怎么改变大小都起不了作用,so....这个css恒值html{font-size:20px;},并没有什么卵用。都是JS在控制字体大小,可有可无,不信你试试

     

    但当你的主体样式宽度设置为100%时,建议把判断语句给删除,让界面中的字体大小完全自适应,如下:

    JS代码:

    (function (doc, win) {
        var docEl = doc.documentElement,
            resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
            recalc = function () {
                var clientWidth = docEl.clientWidth;
                if (!clientWidth) return;
                docEl.style.fontSize = 20 * (clientWidth / 640) + 'px';
            };
    
        if (!doc.addEventListener) return;
        win.addEventListener(resizeEvt, recalc, false);
        doc.addEventListener('DOMContentLoaded', recalc, false);
    })(document, window);

    CSS代码:

    .wrap{width:100%; overflow:hidden;}
    .wrap img{width:100%;}

    以上是本人实践所得,要是你们还有更高深的自适应布局,希望你们能告诉我,谢谢!!!

  • 相关阅读:
    An Introduction to C & GUI Programming -----Simon Long 学习笔记 6
    An Introduction to C & GUI Programming -----Simon Long 学习笔记 5
    An Introduction to C & GUI Programming -----Simon Long 学习笔记 4
    An Introduction to C & GUI Programming -----Simon Long 学习笔记 3
    An Introduction to C & GUI Programming -----Simon Long 学习笔记 2
    替罪羊树 (Scapegoat Tree)
    Miller-Rabin 质数检测
    杜教筛
    狄利克雷卷积&莫比乌斯反演
    取整函数的性质
  • 原文地址:https://www.cnblogs.com/zlmlovem/p/5987086.html
Copyright © 2011-2022 走看看