咏竹莉
where there is a will,there is a way

 

em定义字体大小时以父级的字体大小为基准;定义长度单位时以当前字体大小为基准

         例父级font-size: 14px; 则子级font-size:1emfont-size:14px; 若定义长度时,子级的字体大小如果为14px,则子级width: 2emwidth: 24px 

rem以根元素的字体大小为基准。例如html的font-size:14px,  则子级1rem = 14px

 

%: 以父级的单位为基准。 计入父级 width:200px, height:200px; 则子级width: 50%; height:50%;width: 100px; height: 100px;

 

vw 和 vh: 基于视口的宽度和高度, 例如视口宽度为1000px, 则60vw = 600px

vmin和vmax vmin为当前vwvh中较小的一个值; vmax为较大的一个值,例如视口宽度375px, 视口高度812px,  则100vmin = 375px; 100vmax = 812px;

 

 

移动端布局总结:

1.  移动端布局的方式使用rem和flex。flex布局比较灵活,但是字体大小不好控制,我们使用rem 和 媒体查询控制字体的大小,媒体查询视口的代销,然后不同的视口上设置html的font-size

2. 可单独制作移动端页面也可以响应式pc移动端共用一个页面。

 

移动端布局中怎样初始化根元素的字体大小:

1. js 初始化字体大小

页面开头引入这段代码,用于动态计算font-size

(假设你需要的1rem  = 20px)

 

(function(){
  var html = document.documentElement;
  function onWindowResize () {
      html.style.fontSize = html.getBoundingClientRect().width / 20 + 'px';      
     } 
   window.addEventListener('resize', onWindowResize);
   
   onWindowResize();
})()

 

 

· document.documentElement: 获取document的根元素

· html.getBoundingClientRect().width:  获取html的宽度(窗口的宽度)

· 监听windowresize事件

 

2.  媒体查询

//不过有一点比较麻烦就是得知道设备的宽度,这种方法不太智能,不过性能方面肯定最高。

@media screen and (min-width: 320px) {
    html {
        font-size: 50px;
    }
}

@media screen and (min-width: 360px) {
    html {
        font-size: 56px;
    }
}

 

 

能源项目

最近写pc项目简单使用了rem, 以3840px为设计稿, 刚开始为了方便换算,将html的font-size设计成了10px, 则子元素 3.6rem即代表36px的字体大小

css:

根元素

html { font-size: 10px; }

子元素

.item h4{
    width: 100%;
    height: 5rem;
    line-height: 5rem;
    background: url("../images/ol_bg.png") no-repeat;
    background-size: 100% 100%;
    padding-left: 9rem;
    font-size: 3.6rem;   // font-size 3.6rem 代表子元素字体大小为36px
    
  
}

 

后又兼容了1440px的分辨率, 我使用的是媒体查询功能,此时只改变根元素字体大小即可,计算方式 1440/3840 * 10  = 3.75 , 所以

css: 

@media screen and (max-width: 1680px) {
    html { font-size: 3.75px;  }
}

 

如果使用js去动态设计字体大小,则换算公式应该是 ,动态计算的好像有点绕,需要多理解

(function(){
  var html = document.documentElement;
  function onWindowResize () {
    html.style.fontSize = html.getBoundingClientRect().width / 384 + 'px';   // 此处除以384是因为以3840px设计稿为基准,前面为了方便计算使得1rem = 10px , 所以 3840 / 384 = 10px 即是前面html的基础值
  }
  window.addEventListener('resize', onWindowResize);

  onWindowResize();
})()

 

 

以下是淘宝使用的js

    //我一直在用这个 绝对好用 还可以meta都不用写 js会判断如果没有则创建一个。
    (function (win) {
        var ratio, scaleValue, renderTime,
                document = window.document,
                docElem = document.documentElement,
                vpm = document.querySelector('meta[name="viewport"]');

        if (vpm) {
            var tempArray = vpm.getAttribute("content").match(/initial\-scale=(["']?)([\d\.]+)\1?/);
            if (tempArray) {
                scaleValue = parseFloat(tempArray[2]);
                ratio = parseInt(1 / scaleValue);
            }
        } else {
            vpm = document.createElement("meta");
            vpm.setAttribute("name", "viewport");
            vpm.setAttribute("content", "width=device-width, initial-scale=1, user-scalable=no, minimal-ui");
            docElem.firstElementChild.appendChild(vpm);
        }

        win.addEventListener("resize", function () {
            clearTimeout(renderTime);
            renderTime = setTimeout(initPage, 300);
        }, false);

        win.addEventListener("pageshow", function (e) {
            e.persisted && (clearTimeout(renderTime), renderTime = setTimeout(initPage, 300));
        }, false);

        "complete" === document.readyState ? document.body.style.fontSize = 12 * ratio + "px" : document.addEventListener("DOMContentLoaded", function () {
            document.body.style.fontSize = 12 * ratio + "px";
        }, false);

        initPage();

        function initPage() {
            var htmlWidth = docElem.getBoundingClientRect().width;
            htmlWidth / ratio > 540 && (htmlWidth = 540 * ratio);
            win.rem = htmlWidth / 16;
            docElem.style.fontSize = win.rem + "px";
        }
    })(window);

    //以上两种方法都行,还适用于雪碧图。同上的计算方法即可。当然也不是非得分成16份。可以是人一份,只不过计算时替换16就可以了。还有就是计算比较麻烦,不过你如果习惯sacss less css编译写法就很简单了 定义变量,引用直接/变量即可。

 

posted on 2021-04-07 17:03  咏竹莉  阅读(312)  评论(0)    收藏  举报