Sass基础——Rem与Px的转换
rem
是CSS3中新增加的一个单位值,他和em
单位一样,都是一个相对单位。不同的是em
是相对于元素的父元素的font-size
进行计算;rem
是相对于根元素html
的font-size
进行计算。这样一来rem
就绕开了复杂的层级关系,实现了类似于em
单位的功能。
Rem的使用
前面说了em
是相对于其父元素来设置字体大小的,这样就会存在一个问题,进行任何元素设置,都有可能需要知道他父元素的大小,在我们多次使用时,就会带来无法预知的错误风险。而rem
是相对于根元素<html>
,这样就意味着,我们只需要在根元素确定一个参考值,这个参考值设置为多少,完全可以根据您自己的需求来定。
假设就使用浏览器默认的字号16px
,来看一些px
单位与rem
之间的转换关系:
| px | rem |
------------------------
| 12 | 12/16 = .75 |
| 14 | 14/16 = .875 |
| 16 | 16/16 = 1 |
| 18 | 18/16 = 1.125 |
| 20 | 20/16 = 1.25 |
| 24 | 24/16 = 1.5 |
| 30 | 30/16 = 1.875 |
| 36 | 36/16 = 2.25 |
| 42 | 42/16 = 2.625 |
| 48 | 48/16 = 3 |
-------------------------
如果你要设置一个不同的值,那么需要在根元素<html>
中定义,为了方便计算,时常将在<html>
元素中设置font-size
值为62.5%
:
html {
font-size: 62.5%; /* 10 ÷ 16 × 100% = 62.5% */
}
相当于在<html>
中设置font-size
为10px
,此时,上面示例中所示的值将会改变:
| px | rem |
-------------------------
| 12 | 12/10 = 1.2 |
| 14 | 14/10 = 1.4 |
| 16 | 16/10 = 1.6 |
| 18 | 18/10 = 1.8 |
| 20 | 20/10 = 2.0 |
| 24 | 24/10 = 2.4 |
| 30 | 30/10 = 3.0 |
| 36 | 36/10 = 3.6 |
| 42 | 42/10 = 4.2 |
| 48 | 48/10 = 4.8 |
-------------------------
由于rem
是CSS3中的一个属性,很多人首先关注的就是浏览器对他的支持度,我截了一张caniuse对rem
属性的兼容表:
从上图可以清楚的知道,rem
在众多浏览器中都已得到很好的支持,如果您的项目不用考虑IE低版本的话,你就可以放心的使用了,如果您的项目在IE低版本中还占有不少的比例,那么你还在担心使用rem
不能兼容,而不敢使用。其实是没有必要的,可以针对低版本的IE浏览器做一定的处理:
html { font-size: 62.5%; }
body { font-size: 14px; font-size: 1.4rem; } /* =14px */
h1 { font-size: 24px; font-size: 2.4rem; } /* =24px */
这样一来解决了IE低版本的不能兼容的问题,但生出另一个不足地方,就是增加了代码量。必竟鱼和熊掌很多时候不能兼得嘛。
如果你想更深入的了解rem
如何使用,建议您阅读:
- CSS3的REM设置字体大小——viaw3cplus
- FONT SIZING WITH REM——viaJonathan Snook
- There’s more to the CSS rem unit than font sizing——viacss-tricks
- In Defense Of Rem Units——viaMatthew Lettini
- Font sizing with rem could be avoided——viaHarry
- 响应式十日谈第一日:使用 rem 设置文字大小——via一丝
为什么要使用rem
像em
单位一样,在Responsive设计中使用rem
单位非常有用。虽然他们都是相对单位,但使用rem
单位可以避开很多层级的关系。因为em
是相对于他的父元素的font-size
,而rem
是相对于根元素<html>
。比如说h1
设置了font-size
为1rem
之后,只要不重置html
的font-size
大小,无论他的父元素设置多大,对h1
都不会有任何的影响。
Sass中rem
的使用
在CSS中,实现px
和rem
转换非常简单,但每次使用都需进行计算。虽然在html
中设置font-size:62.5%;
会给大家带来便利,但终究有些烦人,也不是长远之计。既然我们学习了Sass,就应该思考如何让Sass来帮助我们做这些计算的工作。接下来介绍如何使用Sass实现px
和rem
之间的计算。
rem
在@function
中的使用
Sass中也可以像使用em
一样,实现px
转换为rem
。这个过程也同样是通过Sass的@function
方法来实现。
根据rem
的使用原理,可以知道px
转rem
需要在html
根元素设置一个font-size
值,因为rem
是相对于html
根元素。在Sass中定义一个px
转rem
的函数,先要设置一个默认变量:
$browser-default-font-size: 16px !default;//变量的值可以根据自己需求定义
而且需要在html
根元素中显示的声明font-size
:
html {
font-size: $browser-default-font-size;
}
然后通过@function
来实现px
转为rem
计算:
@function pxTorem($px){//$px为需要转换的字号
@return $px / $browser-default-font-size * 1rem;
}
定义好@function
之后,实际使用中就简单多了:
//SCSS
html {
font-size: $browser-default-font-size;
}
.header {
font-size: pxTorem(12px);
}
//CSS
html {
font-size: 16px; }
.header {
font-size: 0.75rem; }
不过定义的这个函数pxTorem()
虽然实现了px
转换成rem
的计算,但不能同时服务于多个属性值的计算:
.header {
font-size: pxTorem(12px);
margin: pxTorem(5px 10px);//同时计算多个值将报错
}
如果这样使用,编译的时候将会报错:
>>> Change detected to: /Users/airen/Sites/testSass/style.scss
error style.scss (Line 4: Undefined operation: "5px 10px/16px times 1rem".)
这也就是说,如果样式同时需要设置多个属性值的时候,pxTorem()
变得就局限性太大,换句话说,这个函数仅适合运用在具有单个属性值的属性上,例如font-size
。如果要强行使用,只能同时使用多个pxTorem()
:
//SCSS
.header {
font-size: pxTorem(12px);
margin: pxTorem(5px) pxTorem(10px) pxTorem(15px);
border: pxTorem(1px) solid #f36;
}
//CSS
.header {
font-size: 0.75rem;
margin: 0.3125rem 0.625rem 0.9375rem;
border: 0.0625rem solid #ff3366; }
Sass中mixin
实现rem
除了使用@function
实现px
转换成rem
之外,还可以使用Sass中的mixin
实现px
转rem
功能。
font-size
是样式中常见的属性之一,我们先来看一个简单mixin
,用来实现font-size
的px
转rem
:
@mixin font-size($target){
font-size: $target;
font-size: ($target / $browser-default-font-size) * 1rem;
}
在实际使用中,可以通过@include
调用定义好的@mixin font-size
:
//SCSS
.footer {
@include font-size(12px);
}
//CSS
.footer {
font-size: 12px;
font-size: 0.75rem; }
可实际中,这个mixin
太弱小了,根本无法实现我们需要的效果,因为我们很多样式属性中他可不只一个属性。为了实现多个属性能设置多值,就需要对mixin
做出功能扩展:
@mixin remCalc($property, $values...) {
$max: length($values);//返回$values列表的长度值
$pxValues: '';
$remValues: '';
@for $i from 1 through $max {
$value: strip-units(nth($values, $i));//返回$values列表中的第$i个值,并将单位值去掉
$browser-default-font-size: strip-units($browser-default-font-size);
$pxValues: #{$pxValues + $value * $browser-default-font-size}px;
@if $i < $max {
$pxValues: #{$pxValues + " "};
}
}
@for $i from 1 through $max {
$value: strip-units(nth($values, $i));
$remValues: #{$remValues + $value}rem;
@if $i < $max {
$remValues: #{$remValues + " "};
}
}
#{$property}: $pxValues;
#{$property}: $remValues;
}
在这个remCalc()
中定义了两个参数$property
和$values...
。其中$property
表示的是样式属性,而$values...
表示一个或者多个属性值。
注:在上面定义的remCalc
中使用了下自定义的函数strip-units
,主要用来去除单位,详细的请参阅Sass基础——PX to EM Mixin和@function一文中的strip-units
函数定义方法。
px
转rem
的mixin
定义完成后,就可以通过@include
来引用:
//SCSS
.wrapper {
@include remCalc(width,45);
@include remCalc(margin,1,.5,2,3);
}
//CSS
.wrapper {
width: 720px;
width: 45rem;
margin: 16px 8px 32px 48px;
margin: 1rem 0.5rem 2rem 3rem; }
在实际使用中取值有一点非常重要在remCalc()
取的$values
值为rem
值。
总结
在这篇文章中,简单介绍了在Sass中如何定义@function
和@mixin
来实现px
转换成rem
的计算。希望大家能在这篇文章中找到自己需要的灵感。
如需转载,烦请注明出处:http://www.w3cplus.com/preprocessor/sass-px-to-rem-with-mixin-and-function.html
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
原文: https://www.w3cplus.com/preprocessor/sass-px-to-rem-with-mixin-and-function.html © w3cplus.com
Sass基础——Rem与Px的转换的更多相关文章
- rem与px的转换
rem与px的转换 引用自http://caibaojian.com/rem-and-px.html A-A+ 前端博客•前端开发教程•rem•3702View0 rem是相对于根元素<html ...
- Rem与Px的转换[转载]
原文:http://www.w3cplus.com/preprocessor/sass-px-to-rem-with-mixin-and-function.html rem是CSS3中新增加的一个单位 ...
- 转: rem与px的转换
rem是相对于根元素<html>,这样就意味着,我们只需要在根元素确定一个参考值,这个参考值设置为多少,完全可以根据您自己的需求来定.· 我们知道,浏览器默认的字号16px,来看一些px单 ...
- 移动端适配方案以及rem和px之间的转换
背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉MM会给我们一个psd文件,称之为视觉稿. 对于移动端开发而言,为了做到页面高清的效果,视觉稿的规范 ...
- 自动把网页px单位转换成rem
自动把网页px单位转换成rem 首先在你的项目开发环境中安装2个插件 然后在vue.config.js文件引入并重新启动服务器 这样就配置成功了,一起看看效果
- vue换算单位px自动转换rem
cnpm i postcss-px2rem --save cnpm install px2rem-loader --save 2.配置px2rem build目录下vue-loader.conf.js ...
- EM vs REM vs PX,为什么你不应该”只用px“”
Actually this artical is from other person's opnion ,i just put it into chinese,and this means a ver ...
- 使用em和rem替代px
rem是指根元素的字体大小,默认情况下html的字体大小为:16px=1rem.而em是相对单位,是基于它的祖先元素计算的. 如果我们不指定html和body的字体大小,要得到12px的rem需要这样 ...
- android 手机屏幕有关的几个工具(屏幕宽高,dp和px互相转换)
平时适配页面时经常会需要根据屏幕的宽高来设置控件的大小,很多时候在代码中还会需要dp和px互相转换. 今天把最常用的几个记录一下,经测试包括2.3 ~ 5.0之间的版本都可用,其他版本未测,不过应该也 ...
随机推荐
- ny20 吝啬的国度
吝啬的国度 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 在一个吝啬的国度里有N个城市,这N个城市间只有N-1条路把这个N个城市连接起来.现在,Tom在第S号城市,他有 ...
- 使用 Elasticsearch 实现博客站内搜索
Reference: http://www.open-open.com/lib/view/open1452046497511.html 一直以来,为了优化本博客站内搜索效果和速度,我使用 bing ...
- Disable Maven Nature和disable workspace resolution
1.Disable Maven Nature myeclipse更新maven的时候,手抖了一下,点上了Disable Maven Nature,然后工程右键菜单中的Maven栏就不见了! 其实这是把 ...
- Java 日期处理类库Joda-Time简介
http://www.ibm.com/developerworks/cn/java/j-jodatime.html 登录 (或注册) 中文 IBM 技术主题 软件下载 社区 技术讲座 搜索 devel ...
- Android——Button的颜色
.xml <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android ...
- linux异步通知
简述 linux下异步方式有两种:异步通知和异步IO(AIO),aio请参考:linux异步IO--aio 异步通知的含义是:一旦设备就绪,则主动通知应用程序,这样应用程序就不需要查询设备状态,准确称 ...
- Ubuntu14.04使用DEB安装Mysql5.7
下载deb-bundle包 1.mysql下载页面 2.解压 安装(注意安装顺序) 安装顺序如下: 1.mysql-common_5.7.10-1ubuntu14 ...
- [转]Python与设计模式
一.创建类设计模式 前言 什么样的程序员是一个好的程序员?学会很多门编程语言,就是一个好的程序员了么?事实上,学会一门编程语言不是一件很难的事,而“学会”一门编程语言是非常难的一件事.前一个“会”强调 ...
- Hbase 学习(二)各种filter
各种filter 今天的主题是Filter,hbase客户端查询的时候,自定义查询filter. 直接上例子吧,不多说别的了,第一个例子是RowFilter的. Scan scan = new Sca ...
- 推断iframe里的页面载入完毕
//推断iframe是否载入完毕,RMid为iframe的ID document.getElementById("RMid").onload = function () { ale ...