rem适配布局
@
1. rem基础#
rem单位#
rem (root em)是一个相对单位,类似于em,em是父元素字体大小。不同的是rem的基准是相对于html元素的字体大小。
比如,根元素(html)设置font-size=12px; 非根元素设置width:2rem; 则换成px表示就是24px。
/* 根html font-size 设为 12px
确定了单位数值比(此时:12px = 1rem)
页面的所有标签若用到rem单位 都根据这个比例
*/
html {
font-size: 12px;
}
/*
此时 div 的字体大小就是 24px */
div {
font-size: 2rem;
}
rem的优势:父元素文字大小可能不一致, 但是整个页面只有一个html,可以很好来控制整个页面的元素大小。
cssrem#
cssrem:px 转换rem vscode插件
-
使用注意点
使用过程简单,再输入css像素单位时会出现提示框提示转换为rem
默认的html字体大小为16px,若这当前设备(设计稿)的字
html font-size
的大小不是16px,要到vscoe的设置里手动修改Cssrem:Root Font Size
的大小。
2. rem适配方案#
rem实际开发适配方案#
① 按照设计稿与设备宽度的比例,利用 CSS3媒体查询 动态计算并设置html
根标签的font-size
大小。
② CSS 中,设计稿元素的宽、高、相对位置等取值,按照同等比例换算为 rem 为单位的值。
rem 适配方案技术使用(2019年市场主流)#
方案1:#
- less
- 媒体查询
- rem
方案思路:
-
确定设计稿的尺寸
设计稿常见尺寸宽度
设备 常见宽度 iphone4\5 640px iphone6\7\8 750px Android 常见320px、 360px、 375px、 384px、 400px、 414px、 500px、 720px ,大部分4.7~5寸的安卓设备为720px 一般情况下,以一套或两套效果图适应大部分的屏幕,放弃极端屏或对其优雅降级,牺牲一些效果现在基本以750为准。
-
确定不同屏幕尺寸下的
html
字体大小。html字体大小 = 屏幕宽度 / 屏幕划分的份数
屏幕划分的份数:10、15、20等(划分标准不一 )
-
页面元素大小单位
px
转换为rem
单位。页面元素rem值 = 页面元素值(px) / html font-size字体大小
-
通过媒体查询实现不同屏幕尺寸下的
html font-size
的大小变换。
方案2(flexible.js)#
- flexible.js
- rem
1.简洁高效的rem适配方案flexible.js
-
简介
手机淘宝团队出的简洁高效 移动端适配库
-
功能
该适配库的js文件做了预处理,原理是把当前设备划分为10等份,但是不同尺寸的设备下,比例还是一致的。(所谓的比例:
当前屏幕的宽度 / 当前html font-size
恒等于10) -
使用
由于该适配库自动定义好了不同尺寸设备下的
html font-size
的大小,所以可以不用手动的通过媒体查询定义,简化了开发。- 确定好当前页面的
hmtl font-size
,当前设备页面(设计稿)的宽度/10 - 页面里的元素大小单位转换为rem
- 确定好当前页面的
-
flexible.js源码解析
(function flexible(window, document) { // 获取的html 的根元素 var docEl = document.documentElement // dpr 物理像素比 var dpr = window.devicePixelRatio || 1 // adjust body font size 设置我们body 的字体大小 function setBodyFontSize() { // 如果页面中有body 这个元素 就设置body的字体大小 if (document.body) { document.body.style.fontSize = (12 * dpr) + 'px' } else { // 如果页面中没有body 这个元素,则等着 我们页面主要的DOM元素加载完毕再去设置body // 的字体大小 document.addEventListener('DOMContentLoaded', setBodyFontSize) } } setBodyFontSize(); // set 1rem = viewWidth / 10 设置我们html 元素的文字大小 function setRemUnit() { var rem = docEl.clientWidth / 10 docEl.style.fontSize = rem + 'px' } setRemUnit() // reset rem unit on page resize 当我们页面尺寸大小发生变化的时候,要重新设置下rem 的大小 window.addEventListener('resize', setRemUnit) // pageshow 是我们重新加载页面触发的事件 window.addEventListener('pageshow', function(e) { // e.persisted 返回的是true 就是说如果这个页面是从缓存取过来的页面,也需要从新计算一下rem 的大小 if (e.persisted) { setRemUnit() } }) // detect 0.5px supports 有些移动端的浏览器不支持0.5像素的写法 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))
作者:Hong•Guo
出处:https://www.cnblogs.com/ghnb1/p/15754805.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix