你可能不知道的viewport
概述
前几天偶然看到一个pc端网页,发现用手机打开竟然同比缩放了,作为一个前端从业者,我自然想要弄清它到底是怎么缩放的。之后查了它的meta信息,css和js,发现没有任何兼容手机端的代码,那它到底是怎么缩放的呢?百思不得其解,最后无意中看别人说viewport的默认值是980px,才知道原来是viewport的锅。
于是我深入的复习了一下viewport相关知识,把心得记录下来,供以后开发时参考,相信对其他人也有用。
基础概念
本来看了移动前端开发之viewport的深入理解,但是仍然有一些概念不理解,于是去看了PPK大神对于viewport的研究(第一篇,第二篇,第三篇),算是理清了。
首先从css像素和实际像素说起,css像素就是我们写的css的像素,如果没有进行任何缩放的话,css像素就和实际像素是一样的,如果用浏览器对页面进行了缩放,那么css像素不变,实际像素会根据缩放比例变化。
值得一提的是,缩放是个很重要的概念,在pc端的网页一般没有进行缩放,所以1px的css像素常常等于1px的实际像素。
- 取viewport宽高,用document.documentElement.clientWidth和document.documentElement.Height。
- 取设备宽高,用screen.width和screen.height。
- 取窗口可视区域宽高,用window.innerWidth和window.innerHeight。
- 取可视区域偏移量,用window.pageXOffset和window.pageYOffset。
viewport宽高
viewport宽高是用document.documentElement.clientWidth和document.documentElement.Height来取到的。细心观察可以发现,document.documentElement就是html元素,而document.documentElement.clientWidth就是html的宽度。
我们知道,css里面的包含块的宽度会自动延伸至父元素的宽度,所以最外层包含块的宽度会延伸到body的宽度,而body的宽度会延伸到html的宽度,那html的宽度延伸到什么宽度呢?答案是viewport的宽度!所以可以用html的宽度来度量viewport的宽度。
另外,这里有一个小坑,就是html的宽度是可以修改的,但是即使修改了html的宽度,document.documentElement.clientWidth和document.documentElement.Height的值仍然是viewport的宽高,这是html元素的这2个属性的不同之处。
那当我们改了html的宽度之后,怎么获得html的宽高呢?方式是利用document.documentElement.offsetWidth和document.documentElement.offsetHeight.
移动端viewport
明白了上面viewport的宽高机制之后就很好理解移动端的viewport了。
移动端由于设备的像素很小,所以如果不进行缩放的话,就只能看到pc端网页的部分内容,所以移动端浏览器在兼容的时候,会对页面进行缩放,但是为了避免在缩放的时候页面发生重排和重绘,浏览器就有2个viewport,一个是我们常说的viewport,它用来放置页面,它的默认值宽度是980px;另一个是可视区域的visual viewport,它是移动端的可视区域,用来放大或缩小。
在pc端,我们常说的viewport就等于可视区域的visual viewport,所以css像素和实际像素比是1比1。
在移动端,由于放置页面的viewport的宽度默认为980px,但是设备的宽度常常小于980px,所以可视区域的viewport会对它进行缩放,直到页面内容的宽度正好达到屏幕的宽度。所以我们用手机端看到的pc端页面都是已经缩放过的(如果页面没有设置viewport的话)。
注意,有些情况下,可视区域的viewport的宽度不会等于放置页面的viewport的宽度。比如有一个页面,我们设置它的最外层包含块的最小宽度为1250px,那么放置页面的viewport的宽度仍是默认值980px,但是可视区域的viewport的宽度会达到1250px。
那怎么得到可视区域的缩放比例呢?它等于设备的宽度除以可视区域的宽度,即:screen.width/window.innerWidth。(注意不是viewport的宽度)
其他宽度信息也可以按照上面列出的方法来取。
修改viewport
如果是专门为移动端做的页面,那么常常要设置viewport,使它的两个viewport都等于设备宽度。代码如下:
<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
viewport的其它设置方法可以参考:移动前端开发之viewport的深入理解
你可能不知道的viewport的更多相关文章
- 你可能不知道的7个CSS单位
如果你是一名前端开发工程师,一般px和em使用频率比较高.但是今天本文的重点是介绍一些我们使用很少.甚至么有听说的单位. 一.重温em <style type="text/css&qu ...
- 您可能不知道的CSS元素隐藏“失效”以其妙用——张鑫旭
一.CSS元素隐藏 在CSS中,让元素隐藏(指屏幕范围内肉眼不可见)的方法很多,有的占据空间,有的不占据空间:有的可以响应点击,有的不能响应点击.后宫选秀——一个一个看. { display: non ...
- 你所不知道的setInterval
在你所不知道的setTimeout记载了下setTimeout相关,此篇则整理了下setInterval:作为拥有广泛应用场景(定时器,轮播图,动画效果,自动滚动等等),而又充满各种不确定性的这set ...
- 你所不知道的setTimeout
JavaScript提供定时执行代码的功能,叫做定时器(timer),主要由setTimeout()和setInterval()这两个函数来完成.它们向任务队列添加定时任务.初始接触它的人都觉得好简单 ...
- 你可能不知道的陷阱, IEnumerable接口
1. IEnumerable 与 IEnumerator IEnumerable枚举器接口的重要性,说一万句话都不过分.几乎所有集合都实现了这个接口,Linq的核心也依赖于这个万能的接口.C语言的 ...
- 你真的会玩SQL吗?你所不知道的 数据聚合
你真的会玩SQL吗?系列目录 你真的会玩SQL吗?之逻辑查询处理阶段 你真的会玩SQL吗?和平大使 内连接.外连接 你真的会玩SQL吗?三范式.数据完整性 你真的会玩SQL吗?查询指定节点及其所有父节 ...
- 你所不知道的linq(二)
上一篇说了from in select的本质,具体参见你所不知道的linq.本篇说下from...in... from... in... select 首先上一段代码,猜猜结果是什么? class P ...
- swift与OC之间不得不知道的21点
swift与OC之间不得不知道的21点 自6月的WWDC大会上由苹果的大神Chris Lattner向我们首次展示swift至今已经大半年时间了,虽然绝大部分软件公司代码里还都见不到一丁点swif ...
- 你所不知道的15个Axure使用技巧
你有用原型开发工具吗?如果有,那你用的是Axure还是别的? 从以前就喜欢使用Axure,主要是觉得它能清楚的表达设计的思路,还有交互的真实再现,能让看的人一目了然,昨天看了这篇博文,便更加确定Axu ...
随机推荐
- Ado.net之连接数据库
一.Ado.net的核心 Ado.net的核心为两组重要的类,一个负责处理软件内部的实际数据(DataSet),另一个负责与外部数据系统通信(DataProvider) DataSet:包含一个或多个 ...
- 为datagrid、treegrid增加右键表头菜单,用于显示或隐藏列,注意:冻结列不在此菜单中
var createGridHeaderContextMenu = function(e, field) { e.preventDefault(); var grid = $(this);/* gri ...
- LAMP架构
LAMP(linux,apache,mysql,php)是linux系统下常用的网站架构模型,用来运行PHP网站.(这得apache是httpd服务),这些服务可以安装同意主机上,也可以安装不同主机上 ...
- Linux下chkconfig命令介绍
一.引论 chkconfig命令检查.设置系统的各种服务.这是Red Hat公司遵循GPL规则所开发的程序,它可查询操作系统在每一个执行等级中会执行哪些系统服务, 其中包括各类常驻服务.谨记chkco ...
- eclipse修改工作目录颜色
转载请注明本地址,http://blog.csdn.net/u013173247/article/details/41676495 经常用Eclipse的朋友都应该清楚,Eclipse的白背景不知道晃 ...
- Linux - 操作系统的发展史
操作系统的发展史(科普章节) 目标 了解操作系统的发展历史 知道 Linux 内核及发行版的区别 知道 Linux 的应用领域 01. 操作系统的发展历史 1.1 Unix 1965 年之前的时候,电 ...
- javascript实现文字逐渐显现
下面是文字逐渐显现的JS代码<pre id="wenzi"></pre><div style="display:none" id= ...
- RFID数据清洗与数据清洗的区别
RFID数据清洗和一般数据清洗的不同: RFID数据清洗已经跨越到硬件范畴!造成脏数据的原因是硬件原理和硬件所处环境本身!要提高RFID数据清洗能力,就必须同时研究技术原理和环境本身之间的互动关系,而 ...
- 13. pt-ioprofile
pt-ioprofile 直接运行即可,对系统有影响,慎用!!! read:从文件中读出数据.要读取的文件用文件描述符标识,数据读入一个事先定义好的缓冲区. write:把缓冲区的数据写入文件中. p ...
- ubuntu,day 2 ,退出当前用户,创建用户,查找,su,sudo,管道符,grep,alias,mount,tar解压
本节内容: 1,文件权限的控制,chmod,chown 2,用户的增删和所属组,useradd,userdel 3,用户组的增删,groupadd,groupdel 4,su,sudo的介绍 5,别名 ...