你可能不知道的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 ...
随机推荐
- autolayout后获取frame
autolayout设置完layout立即用frame拿对应的值可能拿不准,因为autolayout设置完布局后布局引擎并不会马上去更改布局,而是将布局标记为待更新,此时可以用的方法有两种,一是延时0 ...
- Delphi中Chrome Chromium、Cef3学习笔记(一)
原文 http://blog.csdn.net/xtfnpgy/article/details/46635225 官方下载地址:https://cefbuilds.com/ CEF简介: 嵌入 ...
- 牛客网-乌龟跑步-(四维dfs)
链接:https://ac.nowcoder.com/acm/problem/15294来源:牛客网 题目描述 有一只乌龟,初始在0的位置向右跑. 这只乌龟会依次接到一串指令,指令T表示向后转,指令F ...
- Linux下安装Anaconda
Anaconda官方下载地址: https://www.anaconda.com/download/ >>bash xxxxxx.sh >>reboot >>sud ...
- mysql_day04
MySQL-Day03回顾1.索引 1.普通索引 index 2.唯一索引(UNI,字段值不允许重复,但可以为NULL) 1.创建 1.字段名 数据类型 unique 2.unique(字段名), u ...
- 小强学渲染之OpenGL的CPU管线
读到这里,应该对OpenGL渲染管线有了初步简单了解.下面着重分析CPU管线,即逻辑控制中心做了什么,这部分还是容易理解的.如下图: 一,将数据加载到显存中. 这是由GPU是访问显存中的数据决定的.因 ...
- 算法练习LeetCode初级算法之树
二叉树的前序遍历 我的解法:利用递归,自底向下逐步添加到list,返回最终的前序遍历list class Solution { public List<Integer> preorderT ...
- 顶级项目孵化的故事系列——Kylin的心路历程【转】
现在已经名满天下的 Apache Kylin,是 Hadoop 大数据生态系统不可或缺的一部分,要知道在 Kylin 项目早期,可是以华人为主的开源团队,一路披荆斩棘经过几年的奋斗,才在 Apache ...
- 移动端(处理边距样式)reset.css
移动端reset.css,来自张鑫旭网站的推荐,下载地址:https://huruqing.gitee.io/demos/source/reset.css 代码 /* html5doctor.com ...
- 796. Rotate String旋转字符串
[抄题]: We are given two strings, A and B. A shift on A consists of taking string A and moving the lef ...