rem em vh和vw移动端M站初探

A

首先看了好几篇帖子 这个勤劳爱思考的老哥早在三四年前已经写的特别好了,借鉴了许多不同的代码也有自己的观点(主要在于评论里)https://segmentfault.com/a/1190000003690140.

B

rem和em很容易混淆,其实两个都是css的单位,并且也都是相对单位,现有的em,css3才引入的rem,在介绍rem之前,我们先来了解下em: em作为font-size的单位时,其代表父元素的字体大小,em作为其他属性单位时,代表自身字体大小——MDN
比起到处写死的px值,em似乎更有张力,改动父元素的字体大小,子元素会等比例变化,但其复杂的计算让人诟病,甚至有人做了个px和em的计算器,不同节点像素值对应的em值,
在这里插入图片描述
em做弹性布局的缺点还在于牵一发而动全身,一旦某个节点的字体大小发生变化,那么其后代元素都得重新计算, rem作用于非根元素时,相对于根元素字体大小;rem作用于根元素字体大小时,相对于其出初始字体大小——MDN
rem取值分为两种情况,设置在根元素时和非根元素时,举个例子:

/* 作用于根元素,相对于原始大小(16px),所以html的font-size为32px*/
html{font-size:2rem}
/* 作用于非根元素,相对于根元素字体大小,所以为64px */
p{font-size:2rem}
C
Rem布局原理

rem布局的本质是等比缩放,一般是基于宽度,我们将屏幕宽度平均分成100份,每一份的宽度用x表示,x = 屏幕宽度 / 100,如果将x作为单位,x前面的数值就代表屏幕宽度的百分比

p{width:50x}/* 屏幕宽度的50% */

页面元素随着屏幕宽度等比变化,我们需要上面的x单位,css中并没有这样的单位,有rem,通过rem,可以实现x
通过上面对rem的介绍,可以发现,如果子元素设置rem单位的属性,通过更改html元素的字体大小,就可以让子元素实际大小发生变化

/* 作用于根元素,相对于原始大小(16px),所以html的font-size为32px*/
html{font-size:2rem}
/* 作用于非根元素,相对于根元素字体大小,所以为64px */
p{font-size:2rem}

如果让html元素字体的大小,恒等于屏幕宽度的1/100,那1rem和1x就等价了

html{fons-size:width/100}
p{width:50rem}
/* 50rem = 50x = 屏幕宽度的50% */

如何让html字体大小一直等于屏幕宽度的百分之一呢? 可以通过js来设置,一般需要在页面dom ready、resize和屏幕旋转中设置

document.documentElement.style.fontSize=document.documentElement.clientWidth/100+'px';
D
比Rem更好的方案 Vh和Vw

x等于屏幕宽度的百分之一,css3带来了rem的同时,也带来了vw和vh
vw —— 视口宽度的 1/100;vh —— 视口高度的 1/100 —— MDN
单位x吗,根据定义可以发现1vw=1x,有了vw我们完全可以绕过rem这个中介了,下面两种方案是等价的,可以看到vw比rem更简单,毕竟rem是为了实现vw么

/* rem方案 */
html{fons-size:width/100}
p{width:15.625rem}
/* vw方案 */
p{width:15.625vw}
vw还可以和rem方案结合,这样计算html字体大小就不需要用js了
html{fons-size:1vw}
/* 1vw = width / 100 */
p{width:15.625rem}

另外,在使用弹性布局时,一般会限制最大宽度,比如在pc端查看我们的页面,此时vw就无法力不从心了,因为除了width有max-width,其他单位都没有,而rem可以通过控制html根元素的font-size最大值,而轻松解决这个问题

em是弹性布局的一种实现方式,弹性布局可以算作响应式布局的一种,但响应式布局不是弹性布局,弹性布局强调等比缩放,100%还原;响应式布局强调不同屏幕要有不同的显示,比如媒体查询

E

经过大型项目实践,下面这段CSS是最好的基于rem和vm和calc实践代码:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值