已知:

1、浏览器默认的字号是16px,html{font-size: 87.5%;}(16*0.875 = 14px)。

2、css中的单位换算:rem 与 px 的换算为 px = rem * 设置的根节点字号。

3、注意,html 字体大小最小为 12px;如果设置为10px,则换算后的 px 依然按照 12px 计算

待搞清楚

思路:html的font-size设置为:网页宽度/设计稿宽度*10 px,css设置时就按照设计稿的大小,如宽为10px,css设置成1rem。这样,html的fong-size就相当于等比放大缩小的系数*10。

在网页加载完成后运行如下代码。designWidth是参考的设计稿的网页宽度(我的一般参考375px),maxWidth是设计稿的最大网页宽度,一般为750。运行该函数后,将设计稿的px对应成css的rem就好。比如设计稿中font-size:10px,css为font-size:1rem。

除此之外,在网页代码的头部,加入一行viewport元标签<meta name="viewport" content="width=device-width,initial-scale=1.0,maximum-scale=1.0,minimum-scale=1.0,user-scalable=no">

//设置html的font-size
function resizeRem(designWidth, maxWidth) {
    var doc = document,
        win = window,
        docEl = doc.documentElement,
        remStyle = document.createElement("style"),
        tid;
    function refreshRem() {
        var width = docEl.getBoundingClientRect().width;
        maxWidth = maxWidth || 540;
        width > maxWidth && (width = maxWidth);
        var rem = width * 10 / designWidth;
        remStyle.innerHTML = 'html{font-size:' + rem + 'px;}';
    }
    if (docEl.firstElementChild) {
        docEl.firstElementChild.appendChild(remStyle);
    } else {
        var wrap = doc.createElement("div");
        wrap.appendChild(remStyle);
        doc.write(wrap.innerHTML);
        wrap = null;
    }
    //要等 wiewport 设置好后才能执行 refreshRem,不然 refreshRem 会执行2次;
    refreshRem();
    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 = "16px";
    } else {
        doc.addEventListener("DOMContentLoaded", function (e) {
            doc.body.style.fontSize = "16px";
        }, false);
    }
}

最新文章

  1. prompt() 方法,弹框带输入框
  2. ff
  3. Laravel5做权限管理
  4. php示例代码之 使用PHP的MySQL标准函数
  5. Servlet之HttpServletResponse和HttpServletRequest
  6. Redis入门 – Jedis存储Java对象 - (Java序列化为byte数组方式)
  7. [DB2]实现项目多数据库切换(上)--环境部署
  8. 值得关注的 10 个 Python 英文博客
  9. 在自己电脑上建立SVNserver
  10. 运行一个Hadoop Job所需要指定的属性
  11. linux系统各种乱码问题
  12. hello随笔
  13. QT 14 线程使用
  14. (zhuan) Deep Deterministic Policy Gradients in TensorFlow
  15. alpha通道与混合技术
  16. java System.arraycopy()
  17. 关于form表单提交到Servlet的时候出现tomcat启动错误的解决方法
  18. Xshell如何设置,当连接断开时保留Session,保留原文字
  19. JSSDK微信自定义分享朋友圈
  20. cocos2d-x中CCEditbox导出到lua

热门文章

  1. linux常用命令精讲
  2. Vuex从入门到精通
  3. pyCharm中下载包的速度慢的解决方案
  4. Redis网络模型究竟有多强
  5. Young&#39;s theorem杨氏定理
  6. MS17-010漏洞复现(永恒之蓝)
  7. Spark详解(08) - Spark(3.0)内核解析和源码欣赏
  8. P8474 「GLR-R3」立春
  9. 代码小DEMO随笔---不经过后端接口,JS上传文件读取文件,展示到页面提供下载功能
  10. C 语言输出100至200之间的质数(素数)