响应式布局用px还是rem(rem与px的屏幕自适应争夺战)

响应式布局用px还是rem(rem与px的屏幕自适应争夺战)

昨天文章中,有粉丝评论说现在移动设备那么多,使用rem的方式会比我的自适应的方式更好。于是我就查询资料,对着两方面进行了对比和验证。

先来说一下rem的适应方式的基本原理:简单来说,rem就是用根元素的字体大小作为单位来进行布局的方式。这样相当于有了一个全局的参考系,不用单独针对某一部分去进行特别处理,根据调整字体的大小达到自适应的目的。展示效果就是等比缩放。像素计算公式

1rem = 1px * html.fontsize(仅为逻辑公式,看懂就好)

具体参考如下:

通过css来实现适应变化

<!DOCTYPE html> 
<html> 
	<head> 
		<meta charset="utf-8" /> 
		<title>无标题文档</title> 
		<style> 
			.abc{ height:3rem;width:30rem; border:1px solid #000; margin:0 auto} 
			html {
				font-size : 20px;
			}
			@media only screen and (min-width: 401px){
				html {
					font-size: 25px !important;
				}
			}
			@media only screen and (min-width: 600px){
				html {
					font-size: 26.75px !important;
				}
			}
			@media only screen and (min-width: 800px){
				html {
					font-size: 30px !important; 
				}
			}
			@media only screen and (min-width: 1000px){
				html {
					font-size: 35px !important; 
				}
			}
			@media only screen and (min-width: 1200px){
				html {
					font-size: 40px !important; 
				}
			}
		</style> 
	</head> 
	<body> 
		<div >CSS实例:DIV宽度会随浏览器宽度变化,改变浏览器宽度</div> 
	</body> 
</html> 

通过js来实现,提供一个具体方法逻辑,试验的过程大家自行完成

function(designWidth, maxWidth) {
	var doc = document,
	win = window,
	docEl = doc.documentElement,
	remStyle = document.createElement("style"),
	tid;
	function refreshRem() {
		var width = docEl.getBoundingClientRect().width;
		maxWidth = maxWidth || 540;
		width>maxWidth && (width=maxWidth);
		var rem = width * 100 / designWidth;
		remStyle.innerHTML = 'html{font-size:' + rem + 'px;}';
	}
	if (docEl.firstElementChild) {
		docEl.firstElementChild.appendChild(remStyle);
	} else {
		var wrap = doc.createElement("div");
		wrap.appendChild(remStyle);
		doc.write(wrap.innerHTML);
		wrap = null;
	}
	//要等 wiewport 设置好后才能执行 refreshRem,不然 refreshRem 会执行2次;
	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);
	}
};

个人观点:

rem的兴起主要是由于移动互联网的兴起,移动设备由于分辨率不会产生变化,是rem发挥功能最佳场所。《淘宝产品十年事》这本书里,作者把产品分为大致三种类型:平台型、垂直型、网站型,这点我非常的认同。

这三类产品中,网站型产品和垂直型产品是用户体验统一性很高的,可以通过有效地方式获得数据,分析用户行为,选择合适的方法。rem的布局方式更适应此类开发。

平台型产品目前主要还是pc端使用居多,用户调研困难,业务复杂,产品负责人较多,开拓过程中产品需求变化较多,使用前端必备:自适应所有分辨率的神技中样式分类的方式在界面上的改动更灵活。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发表评论

登录后才能评论