开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第11天,点击查看活动详情
rem
rem是一个相对长度单位 先学习什么是 绝对长度单位 和 相对长度单位
绝对长度单位
绝对长度单位的大小是固定
- px 像素
- pt 点
- in 英寸
- cm 厘米
- 1in = 2.54cm = 25.4 mm = 101.6q = 72pt = 6pc = 96px
相对长度单位
相对长度单位的大小是会相对于某一个值而改变的
-
% 百分比 一般都是相对于父元素
-
em 相对于自身的
font-size -
rem 相对于 根元素
html标签的fontsizehtml{ font-size: 100px; } div{ width: 1rem;/* width:100px */ height: 1rem;/* height:100px */ }
淘宝适配方案flexible.js
原理
引入淘宝的js文件,通过js实现根据屏幕大小动态修改 根标签 html 的字体大小,当html标签的fontsize被修改时,页面中使用了rem单位的css会自动发生变化
- 当屏幕宽度为 640px 时,
html的字体大小为 64px - 当屏幕的宽度为 375px 时
html的字体大小为 37.5px - 当屏幕的宽度为 320px 时,
html的字体大小为 32px
实现原理
-
flexible.js把 屏幕宽度分10rem如 当 375px = 10 rem, 当 640px = 10 rem -
1rem = 37.5px 或者 1 rem = 64px
-
1px = 1rem / 37.5px 或者 1px = 1rem / 64rem
-
当要实现 100px 宽高 div 时,按照公式 将 px 替换成 rem 单位即可。
width:100px; // 375px width:100 * 10rem / 屏幕宽度 => width:100 * 10rem / 375 = 2.6666rem
使用步骤
-
复制以下代码 放在head标签中
<script> (function flexible(window, document) { var docEl = document.documentElement; var dpr = window.devicePixelRatio || 1; function setBodyFontSize() { if (document.body) { document.body.style.fontSize = 12 * dpr + "px"; } else { document.addEventListener("DOMContentLoaded", setBodyFontSize); } } setBodyFontSize(); function setRemUnit() { var rem = docEl.clientWidth / 10; docEl.style.fontSize = rem + "px"; } setRemUnit(); window.addEventListener("resize", setRemUnit); window.addEventListener("pageshow", function(e) { if (e.persisted) { setRemUnit(); } }); if (dpr >= 2) { var fakeBody = document.createElement("body"); var testElement = document.createElement("div"); testElement.style.border = ".5px solid transparent"; fakeBody.appendChild(testElement); docEl.appendChild(fakeBody); if (testElement.offsetHeight === 1) { docEl.classList.add("hairlines"); } docEl.removeChild(fakeBody); } })(window, document); </script> -
按照公式
1px=10rem/屏幕宽度将css中的px替换成rem单位即可 如在less,利用less的除法功能width: 100px; width:100rem /37.5 ;