之前写了一篇rem布局的文章,今天拿出来发现已经过时了。于是再来写一遍!
2018.10.24更新
首先在html里面设置一下视口:
<meta name="viewport" content="initial-scale=1.0, maximum-scale=1.0, user-scalable=no" />
然后在你的页面引入下面的js,用来检查用户的设备dpr。我们根据不同的dpr来动态修改html根元素的fontsize。(我们知道rem是依据根元素来计算的)
(function flexible (window, document) {
var docEl = document.documentElement
var dpr = window.devicePixelRatio || 1
// adjust body font size
function setBodyFontSize () {
if (document.body) {
document.body.style.fontSize = (12 * dpr) + 'px'
}
else {
document.addEventListener('DOMContentLoaded', setBodyFontSize)
}
}
setBodyFontSize();
// set 1rem = viewWidth / 10
function setRemUnit () {
var rem = docEl.clientWidth / 10
docEl.style.fontSize = rem + 'px'
}
setRemUnit()
// reset rem unit on page resize
window.addEventListener('resize', setRemUnit)
window.addEventListener('pageshow', function (e) {
if (e.persisted) {
setRemUnit()
}
})
// detect 0.5px supports
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))
好了!以上两步就能实现自适应布局了。
最后以pad 768*1024的逻辑像素为例子。我们将整个屏幕的宽度分为10rem,这样就得出1rem = 76.8px;假如我的设计稿有一个620px * 640px的div元素,那我们转换为rem就是:620 / 76.8 rem* 640 / 76.8 rem ≈ 8.07rem * 8.33rem 。但是这样在实际开发中不利于计算,我们可以借助sass来帮我们做:
$baseFontSize:76.8px; //以768px的pad宽度为基准
@function toRem($px){
@return $px/$baseFontSize * 1rem;
}
div{
width: toRem(620px);
height: toRem(640px);
}
以上就是我的全部内容。如有遗漏,欢迎评论留言。