Html5移动端页面自适应布局详解(阿里rem布局)

在移动设备上进行网页的重构或开发,首先得搞明白的就是移动设备上的viewport,通读网上的各种对于viewport的解释之后

大概viewport可以理解为三种

1。layout viewport ,也就是这个浏览器默认的viewport

2。visual viewport  , 浏览器可视区域viewport

3。 ideal viewport  ,移动设备的理想viewport

通俗点讲,pc端css中的1px并不会等于移动端,原理很简单,举个例子说

通过chrome浏览器可以知道,一个Iphone 6 plus是414*736,而pc端的页面动辄几千px以上,所以css中的1px并不等于设备的1px

这也就意味着设备的1px等于多个csspx,也就是1px:Npx的关系

具体的解释我就不多说了,想要深入理解,可以跳转移动前端开发之viewport的深入理解

下面讲怎么设置viewport

1 <meta name="viewport" content="width=device-width, initial-scale=1 user-scalable=0">

为了达到理想移动设备viewport,可以用meta标签对viewport进行控制

而meta标签内可以有很多的属性,具体如下

width 设置layout viewport  的宽度,为一个正整数,或字符串"width-device"
initial-scale 设置页面的初始缩放值,为一个数字,可以带小数
minimum-scale 允许用户的最小缩放值,为一个数字,可以带小数
maximum-scale 允许用户的最大缩放值,为一个数字,可以带小数
height 设置layout viewport  的高度,这个属性对我们并不重要,很少使用
user-scalable 是否允许用户进行缩放,值为"no"或"yes", no 代表不允许,yes代表允许

那么要得到ideal viewport就必须把默认的layout viewport的宽度设为移动设备的屏幕宽度。因为meta viewport中的width能控制layout viewport的宽度,所以我们只需要把width设为width-device这个特殊的值就行了

那么通过各大网友的测试,宽度都是竖屏时ideal viewport的宽度

但是这句话并不是所有浏览器都兼容的,那么为了使浏览器都有一个ideal viewport,content="initial-scale=1通过这句话使缩放比例为1

ideal viewport的效果就能正常实现了,这里我也是知其然而不知其所以然,具体的内容也可以通过跳转移动前端开发之viewport的深入理解我就不多解释了

下面上一个简单的移动端布局

  1 <!DOCTYPE html>
  2 <html lang="en">
  3
  4 <head>
  5     <meta charset="UTF-8">
  6     <title>Document</title>
  7     <meta name="viewport" content="width=device-width, initial-scale=1 user-scalable=0">
  8     <script>
  9         //通过window.screen.width获取屏幕的宽度
 10         var offWidth = window.screen.width / 30; //这里用宽度/30表示1rem取得的px
 11         document.getElementsByTagName("html")[0].style.fontSize = offWidth + ‘px‘; //把rem的值复制给顶级标签html的font-size
 12     </script>
 13     <style>
 14         /*偷个懒就直接全局初始化了*/
 15
 16         * {
 17             padding: 0;
 18             margin: 0;
 19         }
 20         /* 布局需求,上下都间隔*/
 21         div {
 22             margin: 0.833333333rem 0;
 23         }
 24         /* 去处a标签的下划线*/
 25         a {
 26             text-decoration: none;
 27         }
 28
 29         .one {
 30             width: 30rem;
 31             /*100/720*30*/
 32             height: 4.166666667rem;
 33             /*图片宽750,高100*/
 34             background: url("./img/head.png");
 35             background-size: contain;
 36         }
 37
 38         .two {
 39             width: 30rem;
 40             /*400/720*30*/
 41             height: 16.6666667rem;
 42             /*图片宽750,高400*/
 43             background: url("./img/top1.jpg");
 44             background-size: contain;
 45         }
 46
 47         .three {
 48             width: 30rem;
 49             height: 5.875rem;
 50             /*图片宽750,高141*/
 51             background: url("./img/top2.jpg");
 52             background-size: contain;
 53         }
 54
 55         .four {
 56             width: 28.33333333rem;
 57             height: 13.16666667rem;
 58             /*图片宽750,高316*/
 59             background: url("./img/top3.jpg") no-repeat;
 60             background-size: contain;
 61             margin-left: 0.833333333rem;
 62             position: relative;
 63         }
 64
 65         span {
 66             position: absolute;
 67             display: block;
 68             width: 8.33333333rem;
 69             height: 2rem;
 70             line-height: 2rem;
 71             text-align: center;
 72             background: #fff;
 73             right: 0.833333333rem;
 74             bottom: 0.833333333rem;
 75             font-size: 0.95833333rem;
 76             color: red;
 77             cursor: pointer;
 78         }
 79
 80         .five {
 81             width: 28.33333333rem;
 82             height: 13.16666667rem;
 83             /*图片宽750,高316*/
 84             background: url("./img/top4.jpg") no-repeat;
 85             background-size: contain;
 86             margin-left: 0.833333333rem;
 87         }
 88     </style>
 89
 90 </head>
 91
 92 <body>
 93     <div class="one"></div>
 94     <div class="two"></div>
 95     <div class="three"></div>
 96     <div class="four">
 97         <a href=""><span>25元起</span></a>
 98     </div>
 99     <div class="five"></div>
100 </body>
101
102 </html>

可以看到,我每个div里面都使用的rem这个代替了px单位

没错就是用这两句句话来进行改变的

 var offWidth = window.screen.width / 30;

document.getElementsByTagName("html")[0].style.fontSize = offWidth + ‘px‘;

就拿第一个div里的height和width来举例

width: 30rem;
100/720*30
height: 4.166666667rem;
图片宽750,高100

由于给的图里面第一块是720px宽,100px的高,web端我可以直接这么写,但是手机上肯定不行啊,因为屏幕只有这么宽

缩放比例必须是正好才行

通过window.screen.width,就已经获取了屏幕宽,那么/30就是宽度分成30份,既然我宽度是满屏,那么width=30rem

宽度有了,720是30rem,那么100是多少rem很好求了,完全是数学问题,100/720*30得到4.1666666667无限循环小数

本着小数越多就越精确的原则,我们取到小数点后面的9位,当然你喜欢20位也可以,不过好像浏览器并不支持

其他的div里的width和height也是以此类推,就不再重复说明了

还有一个图片显示的问题,要想图片按比例缩放,就要用到background-size:contain

效果如下

我们可以翻转以下,看看宽度是不是满屏的,如图

时间: 2024-08-24 19:36:40

Html5移动端页面自适应布局详解(阿里rem布局)的相关文章

Android 布局详解 -三表格布局(TableLayout)以及重要属性

三表格布局(TableLayout)以及重要属性             TableLayout跟TableRow 是一组搭配应用的布局,TableLayout置底,TableRow在TableLayout的上方,而Button.TextView等控件就在TableRow之上,别的,TableLayout之上也可以零丁放控件.TableLayout是一个应用错杂的布局,最简单的用法就仅仅是拖沓控件做出个界面,但实际上,会经常在代码里应用TableLayout,例如做出表格的结果.本文首要介绍Ta

Android 布局详解

Android 布局详解 1.重用布局 当一个布局文件被多处使用时,最好<include>标签来重用布局. 例如:workspace_screen.xml的布局文件,在另一个布局文件中被重复使用三次,那么可使用如下的布局代码: <LinearLayout androd:layout_width=”fill_parent” androd:layout_height=”fill_parent” > <!-- 引用三次workspace_screen --> <incl

html5移动端页面分辨率设置及相应字体大小设置的靠谱使用方式

对于动端网页编写CSS网上有很多介绍的文章,但在实际使用过程中还是会纠结. 网上的资料太多,且大多都是技术介绍型,特别是针对android上,网上写的各种麻烦,各种复杂,各种不接地气儿... 我在做移动端网页时,总是和美工设计的页面有出入,主要还是由于双方对移动端HTML5实现页面还了解还不够. 今天就研究一下各大互联网公司对于移动端页面的处理方式. 主要研究对象:BAT(度娘,阿狸,企鹅)这几家的移动端网站或webapp 主要研究点:viewport的设置,字体的设置,图片原始宽高设置 汝甚吊

圣杯布局,双飞翼布局详解

圣杯布局和双飞翼布局解决的问题是一样的,都是用来解决左右定宽,中间自适应的三栏布局,中间栏要放在文档流前面以优先渲染. 圣杯布局和双飞翼布局:三栏全部加上float:left,左右两栏加上负margin,以形成三栏布局. 圣杯布局:大的div设置padding-left和padding-right,左右两个div用相对布局position: relative,加上right和left属性.双飞翼布局:中间div内加一层标签,在设置内层标签的margin html圣杯布局: <div class=

android布局详解

http://blog.163.com/zhangzheming_282/blog/static/117920962013072502787/ AbsoluteLayout——绝对布局   必须设置   android:layout_x="30px"  android:layout_y="50px"一般不推荐用 FrameLayout———— 已层叠的方式显示,第一个添加的组件放在最底层,最后添加到框架中得试图显示的最顶层,上一层会覆盖下一层的控件. <Scr

【div+css网页布局详解】

前言: 网页布局是制作一个网页的第一步也是最重要的一步,今天来详细谈一下使用div+css布局的方法. 用dw编写网页的时候是可以通过两种方法的,一是图形界面,二是代码,初学的话可以用图形界面,学的差不多的时候使用代码更能提高效率. 因为现在css3和之前css2有较大改动,咱们先从css2的说起吧. (笔者采用的是dreamweaver cs6,破解版下载地址:http://www.aa25.cn/download/954.shtml) 一.单列布局 一个网页编写手先要搭一个框架,就像下图样:

EXTJS常用布局详解

ExtJS的容器组件都可以通过设置layout参数来选择布局改变显示风格, 它的有效值有: absolute:控制位置,accordion:手风琴布局,anchor:控制大小,border:边界式布局,card:卡片布局,column:列布局,fit:填充式布局,form:表单布局,table:表格式布局 一共9种,在这里简单总结一下 absolute:Absolute布局的目的是为了扩展布局的属性,使得布局更容易使用 accordion:accordion布局也称手风琴布局,在accordio

New UI-布局之LinearLayout(线性布局)详解

New UI-布局之LinearLayout(线性布局)详解  --转载请注明出处:coder-pig,欢迎转载,请勿用于商业用途! 小猪Android开发交流群已建立,欢迎大家加入,无论是新手,菜鸟,大神都可以,小猪一个人的 力量毕竟是有限的,写出来的东西肯定会有很多纰漏不足,欢迎大家指出,集思广益,让小猪的博文 更加的详尽,帮到更多的人,O(∩_∩)O谢谢! 小猪Android开发交流群:小猪Android开发交流群群号:421858269 新Android UI实例大全目录:http://

Anatomy of a Program in Memory—剖析内存中的一个程序(进程的虚拟存储器映像布局详解)

(进程的虚拟存储器映像布局详解) 前言:原文来自于http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/ 这里只是对其进行翻译,并且重构了原文中的图片.译注则是我增加的内容,用来解释原文或提出问题:由于个人水平有限,译文和译注中的错误之处还请广大坛友提出指正,不胜感激. 下面采用分段中英对照的方式列出内容: Memory management is the heart of operating systems; i