视口(viewport)代表当前可见的计算机图形区域。在Web浏览器术语中,通常与浏览器窗口相同,但不包括浏览器的UI, 菜单栏等——即指你正在浏览的文档的那一部分。

一般我们所说的视口共包括三种:布局视口、视觉视口和理想视口,它们在屏幕适配中起着非常重要的作用。

布局视口

布局视口(layout viewport):当我们以百分比来指定一个元素的大小时,它的计算值是由这个元素的包含块计算而来的。当这个元素是最顶级的元素时,它就是基于布局视口来计算的。

所以,布局视口是网页布局的基准窗口,在PC浏览器上,布局视口就等于当前浏览器的窗口大小(不包括borders 、margins、滚动条)。

在移动端,布局视口被赋予一个默认值,大部分为980px,这保证PC的网页可以在手机浏览器上呈现,但是非常小,用户可以手动对网页进行放大。

我们可以通过调用document.documentElement.clientWidth / clientHeight来获取布局视口大小。

视觉视口

视觉视口(visual viewport):用户通过屏幕真实看到的区域。

视觉视口默认等于当前浏览器的窗口大小(包括滚动条宽度)。

当用户对浏览器进行缩放时,不会改变布局视口的大小,所以页面布局是不变的,但是缩放会改变视觉视口的大小。

例如:用户将浏览器窗口放大了200%,这时浏览器窗口中的CSS像素会随着视觉视口的放大而放大,这时一个CSS像素会跨越更多的物理像素。

所以,布局视口会限制你的CSS布局而视觉视口决定用户具体能看到什么。

我们可以通过调用window.innerWidth / innerHeight来获取视觉视口大小。

理想视口

布局视口在移动端展示的效果并不是一个理想的效果,所以理想视口(ideal viewport)就诞生了:网站页面在移动端展示的理想大小。

如上图,我们在描述设备独立像素时曾使用过这张图,在浏览器调试移动端时页面上给定的像素大小就是理想视口大小,它的单位正是设备独立像素。

上面在介绍CSS像素时曾经提到页面的缩放系数 = CSS像素 / 设备独立像素,实际上说页面的缩放系数 = 理想视口宽度 / 视觉视口宽度更为准确。

所以,当页面缩放比例为100%时,CSS像素 = 设备独立像素,理想视口 = 视觉视口。

我们可以通过调用screen.width / height来获取理想视口大小。

Meta viewport

元素表示那些不能由其它HTML元相关元素之一表示的任何元数据信息,它可以告诉浏览器如何解析页面。

我们可以借助元素的viewport来帮助我们设置视口、缩放等,从而让移动端得到更好的展示效果。

上面是viewport的一个配置,我们来看看它们的具体含义:

Value 可能值 描述 width 正整数或device-width 以pixels(像素)为单位, 定义布局视口的宽度。 height 正整数或device-height 以pixels(像素)为单位, 定义布局视口的高度。 initial-scale 0.0 - 10.0 定义页面初始缩放比率。 minimum-scale 0.0 - 10.0 定义缩放的最小值;必须小于或等于maximum-scale的值。 maximum-scale 0.0 - 10.0 定义缩放的最大值;必须大于或等于minimum-scale的值。 user-scalable 一个布尔值(yes或者no) 如果设置为 no,用户将不能放大或缩小网页。默认值为 yes。

移动端适配

为了在移动端让页面获得更好的显示效果,我们必须让布局视口、视觉视口都尽可能等于理想视口。

device-width就等于理想视口的宽度,所以设置width=device-width就相当于让布局视口等于理想视口。

由于initial-scale = 理想视口宽度 / 视觉视口宽度,所以我们设置initial-scale=1;就相当于让视觉视口等于理想视口。

这时,1个CSS像素就等于1个设备独立像素,而且我们也是基于理想视口来进行布局的,所以呈现出来的页面布局在各种设备上都能大致相似。

缩放

上面提到width可以决定布局视口的宽度,实际上它并不是布局视口的唯一决定性因素,设置initial-scale也有肯能影响到布局视口,因为布局视口宽度取的是width和视觉视口宽度的最大值。

例如:若手机的理想视口宽度为400px,设置width=device-width,initial-scale=2,此时视觉视口宽度 = 理想视口宽度 / initial-scale即200px,布局视口取两者最大值即device-width 400px。

若设置width=device-width,initial-scale=0.5,此时视觉视口宽度 = 理想视口宽度 / initial-scale即800px,布局视口取两者最大值即800px。

获取浏览器大小

浏览器为我们提供的获取窗口大小的API有很多,下面我们再来对比一下:

  1. window.innerHeight:获取浏览器视觉视口高度(包括垂直滚动条)。
  2. window.outerHeight:获取浏览器窗口外部的高度。表示整个浏览器窗口的高度,包括侧边栏、窗口镶边和调正窗口大小的边框。
  3. window.screen.Height:获取获屏幕取理想视口高度,这个数值是固定的,设备的分辨率/设备像素比
  4. window.screen.availHeight:浏览器窗口可用的高度。
  5. document.documentElement.clientHeight:获取浏览器布局视口高度,包括内边距,但不包括垂直滚动条、边框和外边距。
  6. document.documentElement.offsetHeight:包括内边距、滚动条、边框和外边距。
  7. document.documentElement.scrollHeight:在不使用滚动条的情况下适合视口中的所有内容所需的最小宽度。测量方式与clientHeight相同:它包含元素的内边距,但不包括边框,外边距或垂直滚动条。

移动端布局三种视口_前端基础:必须要知道的移动端适配(4)——视口相关推荐

  1. 移动端布局三种视口_移动H5的meta视口标签、弹性布局原则和背景图片适配

    很多小伙伴对viewport的理解不是很透彻,于是这一篇重点聊聊viewport(视图)的知识点.以帮助大家更加容易理解移动端H5页面的适配方案. 解读移动H5适配最重要的html标签:meta视口标 ...

  2. 移动端布局三种视口_什么是视口?移动端浏览器中的3种视口

    视口(Viewport)是移动Web开发中一个非常重要的概念,最早是由苹果公司在推出iPhone手机时发明的,其目的是为了让iPhone的小屏幕尽可能完整显示整个网页.通过设置视口,不管网页原始的分辨 ...

  3. 移动端布局三种视口_移动端布局:视口viewport的理解

    移动端开发中,有一些基本概念需要理解清楚,才能更好的组织编程逻辑.在刚接触时,移动端视口的缩放和rem单位的缩放搞混淆了,弄得自己很蒙圈.所以仔细总结下自己的理解. 移动端的适配,我理解为两点: 第一 ...

  4. 移动端布局三种视口_移动端开发知识[系列] - 视口viewport

    移动端H5知识[系列] - 视口viewport HTML5学堂:移动端从2012年走到今日,已经占领了互联网的半壁江山.网站开发也从PC平台向移动端平台开发发展.作为一个优秀的前端开发者,除了能够处 ...

  5. 移动端布局三种视口_移动端适配之视口和meta标签

    这是关于移动端适配的第一篇文章,这篇文章主要介绍视口以及和视口有关的meta标签的使用. 不管三七二十一,我们先新建一个页面: 这不是一个demo *{margin: 0; padding: 0;} ...

  6. 手机HTML拼图验证,JS实现PC手机端和嵌入式滑动拼图验证码三种效果_气质_前端开发者...

    PC和手机端网站滑动拼图验证码效果源码,同时包涵了弹出式Demo,使用ajax形式提交二次验证码所需的验证结果值,嵌入式Demo,使用表单形式提交二次验证所需的验证结果值,移动端手动实现弹出式Demo ...

  7. 移动端布局(三) rem布局及原理

    什么是rem 首先来了解一下什么是em: 作为font-size的单位时,其代表父元素的字体大小,em作为其他属性单位时,代表自身字体大小. s1.s2.s5.s6的font-size和line-he ...

  8. 圣杯布局-三种实现方式,css经典布局

    圣杯布局:经典三栏布局,左右两边宽度固定,中间自适应 圣杯布局在前端构建页面是最常见的一种布局方式,也是前端面试中最常被问到的一问题,下面通过三种方式去实现圣杯布局!附代码!可以一对比一下哪种方式最便 ...

  9. 视频直播画中画效果(边角叠加、去背景、并列布局三种效果)

    阿酷TONY原创 2020-8-31 长沙 在直播过程,经常要用到画中画直播效果,画中画即两个画面或多个画面做叠加. 画中画直播如何操作?我整理了三种直播画中画的截图效果对比~~ 第1种:画中画直播效 ...

最新文章

  1. 关于“大数据”的15条干货思考
  2. python怎么输入列表元素每个元素占一行_如何对列表的每个元素执行操作并将结果放在Python的新列表中?...
  3. 【论文解读】AAAI21最佳论文Informer:效果远超Transformer的长序列预测神器!
  4. 考研数学(180°为什么等于π)
  5. Eclipse 的常见报错、警告和原因分析、解决方式以及相关操作快捷键小结(持续更新)
  6. 规范化之路(一) Checkstyle插件安装使用
  7. 设备 esp32_低功耗ESP32手持式袖珍显示屏
  8. for语句的执行过程_深入学习MySQL 01 一条查询语句的执行过程
  9. shutdown关机命令 C语言 关机程序(恶搞 )
  10. 小型微利企业税收筹划策略探析
  11. android studio 报错Permission is only granted to system apps
  12. requests爬取图片(百思不得其姐)
  13. RT-Thread系统 STM32 DAC设备改进,直接调用系统DAC驱动函数设置输出电压
  14. python编程大数据_学习Python编程挨着大数据什么事
  15. 回收站清空的文件怎么恢复?失易得这样恢复
  16. GPS定位基本原理浅析
  17. [转]JFFS2源代码情景分析Beta2
  18. 百人计划 美术 1.1 美术理论基础
  19. 16个tomcat面试题
  20. 含冰蓄冷空调的冷热电联供型微网多时间尺度优化调度(Matlab代码实现)

热门文章

  1. chrome 占用大量内存直到网页崩溃_Chrome吃内存太夸张!几招解决Chrome占内存硬伤...
  2. 解决E: 仓库 “http://ppa.launchpad.net/fcitx-team/nightly/ubuntu bionic Release” 没有 Release 文件。
  3. 什么是网络协议转换器?
  4. 如何从使用环境上区别光纤收发器?
  5. 光端机按照技术类型及接口种类是怎么分类的?
  6. 工业级以太网交换机与普通商用交换机相比,在性能上有哪些优势?
  7. 浅析二层工业交换机的特点
  8. 6 Approximation and fitting
  9. java 注解 属性 类型_收藏!你一定要知道的Java8中的注解
  10. fftw库在windows下的的编译和配置