`

手机端页面自适应解决方案—rem布局

阅读更多

写移动端页面都要面对页面自适应的问题,当然解决方案很多,比如:百分比布局,弹性布局flex(什么是flex),也都能获得不错的效果,这里主要介绍的是本人在实践中用的最简单的布局方案——rem布局

 

先了解下REM是相对单位,是相对HTML根元素。

 

rem布局非常简单,首页你只需在页面引入这段原生js代码就可以了

 (function (doc, win) {
        var docEl = doc.documentElement,
            resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',
            recalc = function () {
                var clientWidth = docEl.clientWidth;
                if (!clientWidth) return;
                if(clientWidth>=640){
                    docEl.style.fontSize = '100px';
                }else{
                    docEl.style.fontSize = 100 * (clientWidth / 640) + 'px';
                }
            };

        if (!doc.addEventListener) return;
        win.addEventListener(resizeEvt, recalc, false);
        doc.addEventListener('DOMContentLoaded', recalc, false);
    })(document, window);

 

①为什么是640px?
对于手机屏幕来说,640px的页面宽度是一个安全的最大宽度,保证了移动端页面两边不会留白。注意这里的px是css逻辑像素,与设备的物理像素是有区别的。如iphone 5使用的是Retina视网膜屏幕,使用2px x 2px的 device pixel 代表 1px x 1px 的 css pixel,所以设备像素数为640 x 1136px,而它的CSS逻辑像素数为320 x 568px。
如果要切移动端页面,你可以先把效果图宽度等比例缩放到640px,很好用。
②为什么要设置html的font-size?
rem就是根元素(即:html)的字体大小。html中的所有标签样式凡是涉及到尺寸的(如: height,width,padding,margin,font-size。甚至,left,top等)你都可以放心大胆的用rem作单位。
如果你把html的font-size设为20px,前面说过,rem就是html的字体大小,那么1rem = 20px。

(当然可能有同学问,为什么不一开始把html的font-size设为1px呢,这样换算起来也简单,答:浏览器一般都有最小字体限制,比如谷歌浏览器,最小中文字体就是12px,所以实际上没有办法让1rem=1px。)

 

rem自适应原理
rem是根据html的font-size大小来变化,正是基于这个出发,我们可以在每一个设备下根据设备的宽度设置对应的html字号,从而实现了自适应布局。

 

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

 

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

//code from http://caibaojian.com/rem-responsive-2.html
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使其有一致的缩放比例

参考网址:http://caibaojian.com/rem-responsive-2.html

 

 

字体建议使用px

建议描述性的字体使用px,如果有slogan之类大于48px的,可以使用rem

参考网址:http://caibaojian.com/flexible-js.html

升级版:http://www.jianshu.com/p/b00cd3506782

 

 

 

 

分享到:
评论

相关推荐

    PC、移动端自适应等比缩放布局方案

    本文将详细介绍一种适用于PC端大屏监控及移动端布局的解决方案——REM与VW布局相结合的方式。 #### 布局历史概述 - **静态布局**:早期网页设计中普遍采用的方法,使用固定单位如`px`来指定元素的大小与位置,但在...

    手机端页面rem宽度自适应脚本

    总结来说,本文通过介绍rem单位、viewport元标签、JavaScript脚本的编写和使用Sass/Less预处理器的优势,为开发人员提供了实现手机端页面宽度自适应的一套完整解决方案。这套方案不仅考虑到了不同设备的特性,而且...

    详解vue中移动端自适应方案

    手淘的`lib-flexible`库是另一种流行的移动端自适应解决方案。它可以轻松地将设计稿的像素值转换为基于`rem`的CSS值,适应不同分辨率的屏幕。 首先,你需要通过npm安装`lib-flexible`: ```bash npm i lib-...

    详解rem 适配布局

    随着手机型号的多样化,前端开发者面临着如何实现跨设备自适应布局的挑战。在这样的背景下,`rem`单位应运而生,成为解决这一问题的关键技术。`rem`(root em)是一种相对单位,它基于根元素(通常是`html`元素)的...

    手机端用rem+scss做适配的详解

    因此,使用REM(root em)单位结合SCSS预处理器成为一种高效且流行的响应式网页设计解决方案。 REM单位相对于根元素(html)的字体大小进行计算。例如,如果根元素字体大小为10px,那么1rem就等于10px,2rem就等于...

    移动端手机和平板适配解决方案

    本解决方案针对“移动端手机和平板适配”提供了实践性的方法,已经在生产环境中得到了实际应用。 在H5移动端开发中,适配方案通常涉及以下几个关键技术点: 1. **响应式设计(Responsive Design)**:响应式设计是...

    详解H5 活动页之移动端 REM 布局适配方法

    总结来说,移动端REM布局适配方案相比viewport缩放,提供了更灵活、更精确的布局解决方案。通过动态计算html的font-size,并将设计稿尺寸转换为REM单位,开发者可以创建出高度一致且适应各种屏幕尺寸的H5活动页。而...

    vue3移动端适配的解决方案(老方案)

    Vue3 移动端适配解决方案是针对现代前端框架 Vue3 的一项技术实践,旨在确保在不同设备和屏幕尺寸上提供良好的用户体验。Vue3 提供了更强大的功能和更高的性能,但移动端适配是一个挑战,因为移动设备的屏幕尺寸、...

    267_HTML手机电脑网站_网页源码移动端前端_H5模板_自适应响应式源码 (2).zip

    综上所述,这个"267"源码包是一个完整的前端开发解决方案,涵盖了HTML5、CSS3和JavaScript技术,尤其强调自适应和响应式设计,对于开发者来说,这是一个很好的起点,无论是学习还是快速构建多设备兼容的网站都非常...

    vue2移动端响应式模板

    这个模板基于Vue2,利用了lib-flexible和postcss-plugin-px2rem这两个关键工具,实现像素单位(px)到相对单位(rem)的自动化转换,从而达到页面元素在不同分辨率屏幕上的自适应布局。 lib-flexible是阿里巴巴团队...

    创意HTML5摄影工作室模板是一款支持手机端的响应式时尚摄影网站

    在这个模板中,可能采用了媒体查询(Media Queries)、弹性网格布局(Flexible Grid)、相对单位(如em和rem)以及可伸缩的图片和视频等技术,确保无论是在桌面电脑、平板还是手机上,用户都能获得一致且舒适的浏览...

    仿UC网址导航源代码

    【仿UC网址导航源代码】是一款基于HTML技术开发的手机网址导航系统,旨在提供一个简洁易用、无需数据库的解决方案。这款源码以其高度自适应的设计,能够在不同类型的移动设备上展现出良好的显示效果,为用户提供了...

    洗衣店服务展示响应式网页模板

    响应式网页设计是一种现代网页开发技术,它使得...综上所述,"洗衣店服务展示响应式网页模板"是一个全方位的解决方案,涵盖了设计、开发和用户体验的多个层面,旨在为洗衣店创建一个功能齐全且视觉吸引人的在线平台。

Global site tag (gtag.js) - Google Analytics