写移动端页面都要面对页面自适应的问题,当然解决方案很多,比如:百分比布局,弹性布局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端大屏监控及移动端布局的解决方案——REM与VW布局相结合的方式。 #### 布局历史概述 - **静态布局**:早期网页设计中普遍采用的方法,使用固定单位如`px`来指定元素的大小与位置,但在...
总结来说,本文通过介绍rem单位、viewport元标签、JavaScript脚本的编写和使用Sass/Less预处理器的优势,为开发人员提供了实现手机端页面宽度自适应的一套完整解决方案。这套方案不仅考虑到了不同设备的特性,而且...
手淘的`lib-flexible`库是另一种流行的移动端自适应解决方案。它可以轻松地将设计稿的像素值转换为基于`rem`的CSS值,适应不同分辨率的屏幕。 首先,你需要通过npm安装`lib-flexible`: ```bash npm i lib-...
随着手机型号的多样化,前端开发者面临着如何实现跨设备自适应布局的挑战。在这样的背景下,`rem`单位应运而生,成为解决这一问题的关键技术。`rem`(root em)是一种相对单位,它基于根元素(通常是`html`元素)的...
因此,使用REM(root em)单位结合SCSS预处理器成为一种高效且流行的响应式网页设计解决方案。 REM单位相对于根元素(html)的字体大小进行计算。例如,如果根元素字体大小为10px,那么1rem就等于10px,2rem就等于...
本解决方案针对“移动端手机和平板适配”提供了实践性的方法,已经在生产环境中得到了实际应用。 在H5移动端开发中,适配方案通常涉及以下几个关键技术点: 1. **响应式设计(Responsive Design)**:响应式设计是...
总结来说,移动端REM布局适配方案相比viewport缩放,提供了更灵活、更精确的布局解决方案。通过动态计算html的font-size,并将设计稿尺寸转换为REM单位,开发者可以创建出高度一致且适应各种屏幕尺寸的H5活动页。而...
Vue3 移动端适配解决方案是针对现代前端框架 Vue3 的一项技术实践,旨在确保在不同设备和屏幕尺寸上提供良好的用户体验。Vue3 提供了更强大的功能和更高的性能,但移动端适配是一个挑战,因为移动设备的屏幕尺寸、...
综上所述,这个"267"源码包是一个完整的前端开发解决方案,涵盖了HTML5、CSS3和JavaScript技术,尤其强调自适应和响应式设计,对于开发者来说,这是一个很好的起点,无论是学习还是快速构建多设备兼容的网站都非常...
这个模板基于Vue2,利用了lib-flexible和postcss-plugin-px2rem这两个关键工具,实现像素单位(px)到相对单位(rem)的自动化转换,从而达到页面元素在不同分辨率屏幕上的自适应布局。 lib-flexible是阿里巴巴团队...
在这个模板中,可能采用了媒体查询(Media Queries)、弹性网格布局(Flexible Grid)、相对单位(如em和rem)以及可伸缩的图片和视频等技术,确保无论是在桌面电脑、平板还是手机上,用户都能获得一致且舒适的浏览...
【仿UC网址导航源代码】是一款基于HTML技术开发的手机网址导航系统,旨在提供一个简洁易用、无需数据库的解决方案。这款源码以其高度自适应的设计,能够在不同类型的移动设备上展现出良好的显示效果,为用户提供了...
响应式网页设计是一种现代网页开发技术,它使得...综上所述,"洗衣店服务展示响应式网页模板"是一个全方位的解决方案,涵盖了设计、开发和用户体验的多个层面,旨在为洗衣店创建一个功能齐全且视觉吸引人的在线平台。