rem是css3中新增加的长度单位,之前我们接触过em单位,em表示1em代表1个字体的宽度。而rem是根元素字体的大小,在网页中也就是设置的html根元素的字体大小。
html {
font-size: 16px;
}
/* html根元素的字体大小是16px,
* 那么 1rem = 1* 16px = 16px
* 2rem = 2 * 16px = 32px
*/
可以通过设置元素的宽高直接用rem单位,然后根据不同的屏幕的宽度设置不同的html字体的大小,来实现自动适配不同屏幕的目的。
1. 媒体查询改变根元素的字体大小
CSS3新增加了媒体查询功能,也就是可以根据设备媒体的属性做相关的判断,然后执行不同的CSS规则。 媒体查询细节参考。
/* 媒体查询以@media开头,然后后面可以跟上 判断的条件,比如:screen表示屏幕设备, and是并且的意思, min-width是最小宽度的意思。 */
@media screen and (min-width: 320px) {
html {font-size: 50px;}
}
@media screen and (min-width: 360px) {
html {font-size: 56.25px;}
}
@media screen and (min-width: 400px) {
html {font-size: 62.5px;}
}
@media screen and (min-width: 440px) {
html {font-size: 68.75px;}
}
@media screen and (min-width: 480px) {
html {font-size: 75px;}
}
@media screen and (min-width: 640px) {
html {font-size: 100px;}
}
以上参考代码的意思是: 根据CSS的媒体查询设备的屏幕的宽度,根据宽度的大小设置密集的html根元素的字体大小。
由于rem根据不同枚举的屏幕尺寸设置了不同的大小值,所以根据rem布局的元素会根据屏幕自动适配。
缺点:媒体查询不能完全枚举,毕竟android的屏幕尺寸碎片化严重,各种尺寸都有,不能完全覆盖,只能大体覆盖。如果想要精确覆盖要么通过js实现,要么用最新的浏览器已经支持的calc实现。
以上假设设计图是640像素。然后在640像素的设备上,1rem = 100px方便计算盒子的尺寸,可以直接口算。
2. js实现动态改变根元素的字体大小
通过js动态获取屏幕的宽度(document.clientWidth)
然后根据屏幕宽度动态计算出rem的实际值。
假设,640px的设备 1rem = 100px
公式: rem = document.clientWidth / 640 * 100px;
!(function(doc, win) {
var docEle = doc.documentElement,
evt = "onorientationchange" in window ? "orientationchange" : "resize",
fn = function() {
var width = docEle.clientWidth;
width = width < 320 ? 320 : width;
width = width > 640 ? 640 : width;
width && (docEle.style.fontSize = 100 * (width / 640) + "px");
};
win.addEventListener(evt, fn, false);
doc.addEventListener("DOMContentLoaded", fn, false);
}(document, window));
还有缩放自适应布局方式也是不错的
<meta charset="utf-8">
简单点说就是,开发的时候根据设计搞完全还原像素,然后根据屏幕的宽度通过js动态改变页面的缩放,恰好是理想视口的大小。
原理核心就是修改页面mate标签的缩放。
这样优点非常多,首先开发人员直接像素还原,开发效率很高,也没有移动端1像素的问题。也是推荐大家使用的方式。
当然缩放布局方式也可以跟rem等方式结合,比如淘宝的flexible方案就是利用页面的缩放和rem模拟vw的方案,使用起来非常简单,稍微有点不爽的就是要像素和rem之间要进行转换,不过还好可以通过cssrem
插件进行自动转换。
具体代码案例参考:https://github.com/amfe/article/issues/17
网友评论