视口(viewport)原理详解之第二部分(移动端浏览器)
一、移动端浏览器的问题
当我们把移动端浏览器和桌面浏览器比较时,最明显的差异就是尺寸。移动端浏览器尺寸要比桌面屏幕小得多,移动浏览器最多差不多也就400px。最重要的问题集中在我们的CSS上,特别是viewport的尺寸。当我们把桌面浏览器的尺寸复制到我们移动端时,效果无疑是可怕的(要么太小看不清,要么只能显示局部)。
我们来看我们上节经常拿来举例的width:10%的侧边栏。如果移动端浏览器和桌面浏览器设置的完全一样,侧边栏最多也就40px,这就太窄了。
一种解决方式是专门为移动端写一个网页,但无疑成本开销会很大。
二、可视视口和布局视口(visual viewport and the layout viewport)
解决上述问题一个明显方案是扩大viewport,这就需要将视口分成两个:视觉视口和布局视口。
在 Stack Overflow上看到一个解释很好:
Imagine the layout viewport as being a large image which does not change size or shape. Now image you have a smaller frame through which you look at the large image. The small frame is surrounded by opaque material which obscures your view of all but a portion of the large image. The portion of the large image that you can see through the frame is the visual viewport. You can back away from the large image while holding your frame (zoom out) to see the entire image at once, or you can move closer (zoom in) to see only a portion. You can also change the orientation of the frame, but the size and shape of the large image (layout viewport) never changes.
可视视口就是展示在屏幕上的部分,用户可能滑动来改变可视区域,或者缩放来改变可视区域的大小。
但是CSS布局,特别是百分度长宽,是根据布局视口来计算的,无疑比可视视口大很多。
因此,html元素最初是占据布局视口的空间,你的CSS也是根据此来编辑。这就确定了你的网站布局方式跟在桌面浏览器保持一致。
三、理解布局视口
为了理解布局视口的尺寸,我们将网页缩小到充满整个移动浏览器窗口。这时屏幕的尺寸就是布局视口的尺寸。
因此,视口布局的长宽就等于在屏幕上展示的尺寸。当用户放大时,这些尺寸保持不变。
布局视口宽度总是不变的。如果你旋转你的手机,可视视口改变,但浏览器为了适应这个旋转,会放大一些可视宽度,但布局视口大小依然不变。
四、测量布局视口
document.documentElement.clientWidth
和 -Height
旋转影响高度,但不影响宽度。
五、测量可视视口
window.innerWidth/Height,很显然,这些指标随着缩放而改变。
不幸的是,不同浏览器差别很大。
六、屏幕
在桌面浏览器中,screen.width/height可以得到屏幕尺寸。但是实际上开发者也没必要关心。
七、滑动距离(Scrolling offset)
如果你想知道可视视口相对布局视口的位置,你可以用 window.pageX/YOffset
八、html元素
用document.documentElement.offsetWidth/Height可以获得html元素的大小。
九、媒体查询
媒体查询的工作方式跟桌面浏览器一样。width/height相对于布局视口,device-width/height相对于设备大小。
十、事件对象下的相关属性
pageX/Y相对于页面。
clientX/Y相对于可视视口。screenX/Y相对于设备代销。显然,这两者用起来是一样的,screenX/Y作用不大。
十一、Meta viewport
最后我们来讨论 <meta name="viewport" content="width=320">,最初是从苹果上起源,后来被大多浏览器复制。它对于布局视口调整大小是很有意义的。
想想你创建了一个页面但是没给元素宽度。现在他们被拉伸到布局视口宽度的100%,大多浏览器缩小来侠士所有布局,如下所示:
所有用户都将立刻放大,但是大多浏览器都会保持元素宽度不变,之久使得文本很难阅读。
现在我们将heml元素宽度设为{width: 320px},html元素缩水,其他元素占据320px。
现在我们设置<meta name="viewport" content="width=320">,状态就对了。
你可以设置布局宽度为任何尺寸,包括device-width。
注意,viewport中的with,scale针对的是布局视口
视口(viewport)原理详解之第二部分(移动端浏览器)的更多相关文章
- 【动画消消乐】HTML+CSS 自定义加载动画:清新折叠方块效果 063(附源码及原理详解)
前言 Hello!小伙伴! 非常感谢您阅读海轰的文章,倘若文中有错误的地方,欢迎您指出- 自我介绍ଘ(੭ˊᵕˋ)੭ 昵称:海轰 标签:程序猿|C++选手|学生 简介:因C语言结识编程,随后转入计算机专 ...
- 块级格式化上下文(block formatting context)、浮动和绝对定位的工作原理详解
CSS的可视化格式模型中具有一个非常重要地位的概念——定位方案.定位方案用以控制元素的布局,在CSS2.1中,有三种定位方案——普通流.浮动和绝对定位: 普通流:元素按照先后位置自上而下布局,inli ...
- SSL/TLS 原理详解
本文大部分整理自网络,相关文章请见文后参考. SSL/TLS作为一种互联网安全加密技术,原理较为复杂,枯燥而无味,我也是试图理解之后重新整理,尽量做到层次清晰.正文开始. 1. SSL/TLS概览 1 ...
- 锁之“轻量级锁”原理详解(Lightweight Locking)
大家知道,Java的多线程安全是基于Lock机制实现的,而Lock的性能往往不如人意. 原因是,monitorenter与monitorexit这两个控制多线程同步的bytecode原语,是JVM依赖 ...
- [转]js中几种实用的跨域方法原理详解
转自:js中几种实用的跨域方法原理详解 - 无双 - 博客园 // // 这里说的js跨域是指通过js在不同的域之间进行数据传输或通信,比如用ajax向一个不同的域请求数据,或者通过js获取页面中不同 ...
- 【转】VLAN原理详解
1.为什么需要VLAN 1.1 什么是VLAN? VLAN(Virtual LAN),翻译成中文是“虚拟局域网”.LAN可以是由少数几台家用计算机构成的网络,也可以是数以百计的计算机构成的企业网络.V ...
- [No0000126]SSL/TLS原理详解与WCF中的WS-Security
SSL/TLS作为一种互联网安全加密技术 1. SSL/TLS概览 1.1 整体结构 SSL是一个介于HTTP协议与TCP之间的一个可选层,其位置大致如下: SSL:(Secure Socket La ...
- Storm概念、原理详解及其应用(一)BaseStorm
本文借鉴官文,添加了一些解释和看法,其中有些理解,写的比较粗糙,有问题的地方希望大家指出.写这篇文章,是想把一些官文和资料中基础.重点拿出来,能总结出便于大家理解的话语.与大多数“wordcount” ...
- JSPatch实现原理详解<二>
本文转载至 http://blog.cnbang.net/tech/2855/ 距离上次写的<JSPatch实现原理详解>有一个月的时间,在这段时间里 JSPatch 在不断地完善和改进, ...
随机推荐
- 201521123014《Java程序设计》第1周学习总结
201521123014 java第一周总结 1.本周学习总结 刚认识这一门新语言,我就充满了好奇心,想看看Java和学过C语言,C++有什么区别.在这一周的学习中,我认识到,对于初学者而言,Java ...
- Resharper 修改命名空间
1. 使用Reshared 右键->Refactor->Rename 修改所有文件的命名空间(鼠标移动到对应类的命名空间) 2.修改类库中的命名空间 包括程序集信息 右键->属性 3 ...
- 配置使用sourcemap调试vue源码爬坑
环境: Google Chrome V72.0.3626.109 vue-dev V 2.6.10 爬坑的乐趣就不说了(我恨啊),以下说一下出坑要点 1. 在vue-dev的package.json ...
- HDU2212 DFS 2016-07-24 13:52 56人阅读 评论(0) 收藏
DFS Problem Description A DFS(digital factorial sum) number is found by summing the factorial of eve ...
- nodejs async
官网:https://github.com/caolan/async 流程控制:简化十种常见流程的处理集合处理:如何使用异步操作处理集合中的数据工具类:几个常用的工具类 流程控制 详细说明:http: ...
- Delphi Language Overview
Delphi is a high-level, compiled, strongly typed language that supports structured and object-orient ...
- 梯度下降VS随机梯度下降
样本个数m,x为n维向量.h_theta(x) = theta^t * x梯度下降需要把m个样本全部带入计算,迭代一次计算量为m*n^2 随机梯度下降每次只使用一个样本,迭代一次计算量为n^2,当m很 ...
- Thread in depth 4:Synchronous primitives
There are some synchronization primitives in .NET used to achieve thread synchronization Monitor c# ...
- 一起学习MVC(4)Controllers的学习
控制器Controllers Controllers为控制器文档,AccountControllers内的方法对应View→Account下的cshtml文件. 我们看到Aco ...
- PLSQL(PL/SQL)集成Team Foundation Server (TFS),实现数据库代码的版本管理
PL/SQL是面向Oralcle数据库的集成开发环境,是众多Oracle数据库开发人员的主要工具.由于PL/SQL(百度百科)不仅是一种SQL语言,更是一种过程编程语言,在项目实施过程中,会积累大量除 ...