rem自适应布局的回顾总结

使用rem实现自适应布局,应该算是当前移动前端的一大趋势,有些人对此还有点迷惑,搞不懂rem是如何实现自适应布局,如何根据设计稿来调整rem的值?rem布局如何用雪碧背景图片?rem一定要加载JS吗?rem的根html font-size设置为多少合适?看看这篇文章,也许能帮到你。

这些问题整理来自之前发表过的文章,细心的读者也可以自己翻翻之前的内容找到答案,本文统一给个回复,如果对你有用,还请点个赞,谢谢!

rem自适应原理

rem是根据html的font-size大小来变化,正是基于这个出发,我们可以在每一个设备下根据设备的宽度设置对应的html字号,从而实现了自适应布局。更多介绍请看这篇文章:rem是如何实现自适应布局的

rem的值

目前有两种,一种是根据js来调整html的字号,另一种则是通过媒体查询来调整字号。

使用js

;(function(designWidth, maxWidth) {
	var doc = document,
		win = window;
	var docEl = doc.documentElement;
	var tid;
	var rootItem,rootStyle;

	function refreshRem() {
		var width = docEl.getBoundingClientRect().width;
		if (!maxWidth) {
			maxWidth = 540;
		};
		if (width > maxWidth) {
			width = maxWidth;
		}
		//与淘宝做法不同,直接采用简单的rem换算方法1rem=100px
		var rem = width * 100 / designWidth;
		//兼容UC开始
		rootStyle="html{font-size:"+rem+‘px !important}‘;
		rootItem = document.getElementById(‘rootsize‘) || document.createElement("style");
		if(!document.getElementById(‘rootsize‘)){
		document.getElementsByTagName("head")[0].appendChild(rootItem);
		rootItem.id=‘rootsize‘;
		}
		if(rootItem.styleSheet){
		rootItem.styleSheet.disabled||(rootItem.styleSheet.cssText=rootStyle)
		}else{
		try{rootItem.innerHTML=rootStyle}catch(f){rootItem.innerText=rootStyle}
		}
		//兼容UC结束
		docEl.style.fontSize = rem + "px";
	};
	refreshRem();

	win.addEventListener("resize", function() {
		clearTimeout(tid); //防止执行两次
		tid = setTimeout(refreshRem, 300);
	}, false);

	win.addEventListener("pageshow", function(e) {
		if (e.persisted) { // 浏览器后退的时候重新计算
			clearTimeout(tid);
			tid = setTimeout(refreshRem, 300);
		}
	}, false);

	if (doc.readyState === "complete") {
		doc.body.style.fontSize = "16px";
	} else {
		doc.addEventListener("DOMContentLoaded", function(e) {
			doc.body.style.fontSize = "16px";
		}, false);
	}
})(640, 640);

你可以把上面的代码内嵌到html的head中,换算比例是1rem=100px,为了计算方便,你可以在我的一个github项目下载完整的结构和一个压缩的js。

项目主页

上面代码中的关键代码是:

var width = docEl.getBoundingClientRect().width;
var rem = width * 100 / designWidth;
docEl.style.fontSize = rem + "px";
  • 第一行代码,获取移动设备的宽度,第二行,rem的值等于(设备的宽度)x100/(设计稿宽度),第三行,设置html的字号为第二行的值。
  • 有些人可能会注意到第二行代码跟淘宝的那个有所区别,区别就在于rem的换算比例,这里你可以任意改动为实际中的情况,比如有人喜欢用20px,那你可以将上面的100改为20,换算比例则改为1rem=20px。关于上面这段代码可以看之前的文章:Rem精简版实现自适应
  • 还有的人要用回淘宝的那个,那么第二行代码可以变为var rem = width/10; 换算比例则改为根据设计稿的宽度来调整了,假设我们的设计稿宽是640的,则html的字体大小则被设为64px.则相当于1rem=64px。具体实现请看之前的文章:rem自适应布局-flexible

使用媒体查询

说到底,上面的js代码不就是根据不同的设备调整对应的html字号嘛,那么我们根据实际的设备,来加上相应的字号不就行了吗?

我们知道html的默认字号是16px,则对应的设备下可以通过设置对应的font-size使其有一致的缩放比例。

html {
font-size: 62.5%
}

@media only screen and (min-width: 481px) {
html {
font-size:94%!important
}
}

@media only screen and (min-width: 561px) {
html {
font-size:109%!important
}
}

@media only screen and (min-width: 641px) {
html {
font-size:125%!important
}

body {
max-width: 640px
}
}

上面的代码则是通过1rem=20px来换算的,从哪里看出来呢?从最大的一个值640出发,假如你的设计稿是750的话,那你还要设计更多的媒体 查询,换算比例保持一致就可以了。那如果我想要换算比例为1rem=100呢?按照上面的规则,最大的值为:html:font- size:100/16*100%,其它的则按比例,比如480px,则为480/640*(100/16*100%)。

使用雪碧图

国内的很多人都提倡使用字体图标或者用SVG的方式来实现,但这些在小项目中明显是有点不实际。我通常使用下面两种方式。

  1. 第一种将背景图片切成一个,然后换算成base64.的方式,或者使用sass的方式转换,不过有弊端就是样式文件会增大,看个人衡量。
  2. 第二种则是通过背景图片的百分比精准定位,详情见这篇文章:CSS3背景图片百分比及应用
  3. 或者对于精准度不太高,其实使用rem定位也可以,就是要把相邻图片隔开些。

本文后面将继续更新关于rem实现自适应的相关问题,如果你有问题,还请留言给我。

原文链接:rem自适应布局的回顾总结 版权所有,转载时请注明出处,违者必究。
注明出处格式:前端开发博客 (http://caibaojian.com/rem-responsive-2.html)

时间: 2024-11-03 01:32:49

rem自适应布局的回顾总结的相关文章

移动端网页 rem 自适应布局

(function(doc , win){var DocElement = doc.documentElement;var RsizeEvent = 'orientationchange' in window ? 'orientationchange' : 'resize';function ResetSize(){var deviceWidth = DocElement.clientWidth;if(!deviceWidth){return false;}DocElement.style.fo

rem自适应布局

rem自适应原理 rem是根据html的font-size大小来变化,正是基于这个出发,我们可以在每一个设备下根据设备的宽度设置对应的html字号,从而实现了自适应布局.更多介绍请看这篇文章:rem是如何实现自适应布局的. rem的值 目前有两种,一种是根据js来调整html的字号,另一种则是通过媒体查询来调整字号. 使用js (function(designWidth, maxWidth) { var doc = document, win = window; var docEl = doc.

rem自适应布局(转)

原文链接:http://caibaojian.com/web-app-rem.html rem是什么? rem(font size of the root element)是指相对于根元素的字体大小的单位.简单的说它就是一个相对单位.看到rem大家一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位.它们之间其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算. rem的值 目前有两种,一种是根据js来调整html的字号,另一种

移动端rem自适应布局关键代码

function resi() { var html = document.querySelector("html"); var wW = document.body.clientWidth || document.documentElement.clientWidth; var maxW = 640; var minW = 320; if (wW > maxW) wW = maxW; var ratio = wW / minW; html.style.fontSize = 50

Rem自适应js---flexible.min.js

网上看到很多移动端适配的各种方法,由于原来工作中对rem的疏忽,所以决定重新学习rem~ 由于移动端特殊性,本文讲的是如何使用rem实现自适应,或叫rem响应式布局,通过使用一个脚本就可以rem自适应,不用再为各种设备宽度不同而烦恼如何实现自适应的问题. rem是相对于根元素<html>,这样就意味着,我们只需要在根元素确定一个px字号,则可以来算出元素的宽高.1rem=16px(浏览器html的像素,可以设定这个基准值),假如浏览器的html设为64px,则下面的元素则1rem=64px来运

关于使用rem单位,calc()进行自适应布局

关于css中的单位 大家都知道在css中的单位,一般都包括有px,%,em等单位,另外css3新增加一个单位rem. 其中px,%等单位平时在传统布局当中使用的比较频繁,大家也比较熟悉,不过px单位在进行自适应布局的过程当中则会有些力不从心,大部分的解决方案是使用%为单位配合@media媒介查询来进行自适应布局.不过还有另外一个css3新添加的单位也同样可以拿来进行自适应布局,在我看来这种方法也更加方便直观. em和rem 首先先介绍一下em,这个单位是根据其父元素的字体大小来进行计算的,即1e

关于使用rem单位、css函数calc()进行自适应布局

一.关于css中的单位 大家都知道在css中的单位,一般都包括有px,%,em等单位,另外css3新增加一个单位rem. 其中px,%等单位平时在传统布局当中使用的比较频繁,大家也比较熟悉,不过px单位在进行自适应布局的过程当中则会有些力不从心,大部分的解决方案是使用%为单位配合@media媒介查询来进行自适应布局. 不过还有另外一个css3新添加的单位也同样可以拿来进行自适应布局,在我看来这种方法也更加方便直观. 1.em和rem 首先先介绍一下em,这个单位是根据其父元素的字体大小来进行计算

微信小程序新单位rpx与自适应布局

rpx是微信小程序新推出的一个单位,按官方的定义,rpx可以根据屏幕宽度进行自适应,在rpx出现之前,web页面的自适应布局已经有了多种解决方案,为什么微信还捣鼓出新的rpx单位?在解释这个单位前,我们先简单了解一下目前的主流的自适应布局解决方案: 响应式(Responsive web design) rem 流式布局 scale伸缩布局 响应式 响应式布局的问题在于需要维护多个样式文件,维护成本太大,一般的移动H5页面都不会优先考虑. rem rem是近几年比较流行的方案,淘宝移动web端就是

静态布局、自适应布局、流式布局、响应式布局、弹性布局简析

近期学习,有很多感想,有时候看似相近的概念,其实意义却不相同.所以学习要针对不同的名词有明确的区分意识. 抽空时间,打算学习下display:flex;本以为就是一个小小的知识点,正式去研究的时候,才发现display:flex;有很多内容,能实现很多效果.比如三栏布局(左右两栏固定,中间栏自适应),圣杯布局. 后来想着经常听到流式布局,自适应布局,响应式布局,他们有什么区别呢,就去搜了许多内容查看,才发现每种布局都有优缺点和不同使用场景. 静态布局:给页面元素设置固定的宽度和高度,单位用px,