We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
CSS3新增的一个相对单位rem(root em,根em)。rem是相对于根节点(或者是html节点)。如果根节点设置了font-size:10px;那么font-size:1.2rem;字体大小等于12px。
想想看,因为rem是一个相对单位,那么只要根节点的font-size属性随着屏幕自适应,那么下面通过rem设置的单位便可以达到自适应的目的! 当我们拿到设计稿的时候,主要会将视觉稿分成100份(主要为了以后能更好的兼容vh和vw),而每一份被称为一个单位a。同时1rem单位被认定为10a。就相当于1rem可以定为宽度为屏幕的10%。那么针对一个750px宽的设计稿,我们可以算出:
1a = 7.5px 1rem = 75px
那么这个设计稿也就被分成了10rem份。此时淘宝开源库lib-flexible会为根节点的html和body元素设置一个data-dpr和font-size两个属性。其中dpr在IOS内会根据不同型号的机器动态的计算生成,大多数机型的data-dpr=2但是对于安卓来说,由于其机型特别复杂多样,dpr会全部设置成1。 font-size = 1rem,对于一个750的设计稿来说,font-size=75px,而这个就是rem的基准值。这样一来,对于视觉稿上的元素尺寸换算,只需要原始的px值除以rem基准值即可。例如此例视觉稿中的图片,其尺寸是176px * 176px,转换成为2.346667rem * 2.346667rem。
lib-flexible
data-dpr
font-size
data-dpr=2
font-size = 1rem
font-size=75px
if (!dpr && !scale) { var isAndroid = win.navigator.appVersion.match(/android/gi); var isIPhone = win.navigator.appVersion.match(/iphone/gi); var devicePixelRatio = win.devicePixelRatio; if (isIPhone) { // iOS下,3和3以上的屏,用3倍的方案,2用2倍方案,其余的用1倍方案 if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) { dpr = 3; } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){ dpr = 2; } else { dpr = 1; } } else { // 其他设备下,仍旧使用1倍的方案 dpr = 1; } scale = 1 / dpr; }
flexible实际上就是能过JS来动态改写meta标签,代码类似这样:
flexible
meta
var metaEl = doc.createElement('meta'); var scale = 1 / dpr; metaEl.setAttribute('name', 'viewport'); metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no'); if (docEl.firstElementChild) { document.documentElement.firstElementChild.appendChild(metaEl); } else { var wrap = doc.createElement('div'); wrap.appendChild(metaEl); documen.write(wrap.innerHTML); }
对于使用webpack的来说,其实也是有一个postcss插件的px2rem,可以很轻松的配置相关属性,转换成相对于的rem单位。比如我们的.postcssrc 配置如下:
px2rem
.postcssrc
module.exports = { "plugins": { "postcss-px2rem": { baseDpr: 1, remUnit: 37.5, onePxComment: '1px', forcePxComment: '!px', keepComment: '!no', forcePxProperty: ['font-size'] // font-size强制使用px单位 } } }
前面大家都见证了如何使用rem来完成H5适配。那么文本又将如何处理适配。是不是也通过rem来做自动适配。
显然,我们在iPhone3G和iPhone4的Retina屏下面,希望看到的文本字号是相同的。也就是说,我们不希望文本在Retina屏幕下变小,另外,我们希望在大屏手机上看到更多文本,以及,现在绝大多数的字体文件都自带一些点阵尺寸,通常是16px和24px,所以我们不希望出现13px和15px这样的奇葩尺寸。
如此一来,就决定了在制作H5的页面中,rem并不适合用到段落文本上。所以在Flexible整个适配方案中,考虑文本还是使用px作为单位。只不过使用[data-dpr]属性来区分不同dpr下的文本字号大小。
[data-dpr]
配置完成之后,在实际使用时,你只要像下面这样使用:
.selector { width: 150px; height: 150px; font-size: 12px; border: 1px solid #ddd; }
px2rem处理之后将会变成:
.selector { width: 2rem; height: 2rem; border: 1px solid #ddd; } [data-dpr="1"] .selector { font-size: 12px; } [data-dpr="2"] .selector { font-size: 28px; } [data-dpr="3"] .selector { font-size: 42px; }
因为不同的dpr,屏幕会缩成不同比例,所以这里的字号会根据dpr进行相应的放大。举个例子,如果data-dpr = 2 那么页面的viewport会被缩小,所以字号需要相应的乘以比例进行放大。
data-dpr = 2
The text was updated successfully, but these errors were encountered:
No branches or pull requests
有了上篇文章的介绍相关基础单位,我们可以大致了解了viewport,dpr 之类的概念。这次主要记录一下手套的移动适配方案rem
什么是rem
CSS3新增的一个相对单位rem(root em,根em)。rem是相对于根节点(或者是html节点)。如果根节点设置了font-size:10px;那么font-size:1.2rem;字体大小等于12px。
如何处理视觉稿
想想看,因为rem是一个相对单位,那么只要根节点的font-size属性随着屏幕自适应,那么下面通过rem设置的单位便可以达到自适应的目的!
当我们拿到设计稿的时候,主要会将视觉稿分成100份(主要为了以后能更好的兼容vh和vw),而每一份被称为一个单位a。同时1rem单位被认定为10a。就相当于1rem可以定为宽度为屏幕的10%。那么针对一个750px宽的设计稿,我们可以算出:
那么这个设计稿也就被分成了10rem份。此时淘宝开源库
lib-flexible
会为根节点的html和body元素设置一个data-dpr
和font-size
两个属性。其中dpr在IOS内会根据不同型号的机器动态的计算生成,大多数机型的data-dpr=2
但是对于安卓来说,由于其机型特别复杂多样,dpr会全部设置成1。font-size = 1rem
,对于一个750的设计稿来说,font-size=75px
,而这个就是rem的基准值。这样一来,对于视觉稿上的元素尺寸换算,只需要原始的px值除以rem基准值即可。例如此例视觉稿中的图片,其尺寸是176px * 176px,转换成为2.346667rem * 2.346667rem。lib-flexible 原理
1. 计算页面的dpr
2. 改写页面meta标签
flexible
实际上就是能过JS来动态改写meta
标签,代码类似这样:如何转换rem
对于使用webpack的来说,其实也是有一个postcss插件的
px2rem
,可以很轻松的配置相关属性,转换成相对于的rem单位。比如我们的.postcssrc
配置如下:1. 文本字号不建议使用rem
前面大家都见证了如何使用rem来完成H5适配。那么文本又将如何处理适配。是不是也通过rem来做自动适配。
显然,我们在iPhone3G和iPhone4的Retina屏下面,希望看到的文本字号是相同的。也就是说,我们不希望文本在Retina屏幕下变小,另外,我们希望在大屏手机上看到更多文本,以及,现在绝大多数的字体文件都自带一些点阵尺寸,通常是16px和24px,所以我们不希望出现13px和15px这样的奇葩尺寸。
如此一来,就决定了在制作H5的页面中,rem并不适合用到段落文本上。所以在Flexible整个适配方案中,考虑文本还是使用px作为单位。只不过使用
[data-dpr]
属性来区分不同dpr下的文本字号大小。配置完成之后,在实际使用时,你只要像下面这样使用:
px2rem处理之后将会变成:
因为不同的dpr,屏幕会缩成不同比例,所以这里的字号会根据dpr进行相应的放大。举个例子,如果
data-dpr = 2
那么页面的viewport会被缩小,所以字号需要相应的乘以比例进行放大。The text was updated successfully, but these errors were encountered: