在 PC 端,视口指的是浏览器的可视区域,其宽度和浏览器窗口的宽度保持一致。在 CSS 标准文档中,视口也被称为初始包含块,它是所有 CSS 百分比宽度推算的根源,给 CSS 布局限制了一个最大宽度。

而移动端则较为复杂,它涉及到三个视口:布局视口(Layout Viewport)、视觉视口(Visual Viewport)和理想视口(Ideal Viewport)。

本文主要讨论移动端中的视口。

1. 基本概念

1.1 两种像素

像素是计算机屏幕中显示特定颜色的最小区域。屏幕中的像素越多,同一范围内能看到的内容就越多。或者说,当设备尺寸相同时,像素越密集,画面就越精细。

那么,当我们在 CSS 中为一个元素设置属性 width: 250px; 时,会发生什么?这个元素的宽度究竟是多少像素呢?

事实上,这里已经涉及了两种不同的像素:物理像素和 CSS 像素。

物理像素(设备像素,device pixels)

指的是设备屏幕的物理像素,任何设备的物理像素数量都是固定的。

CSS 像素(CSS pixels)

是 CSS 和 JS 中使用的一个抽象概念。它和物理像素之间的比例取决于屏幕的特性(是否为高密度)以及用户进行的缩放,由浏览器自行换算。

在 Apple 的视网膜屏(Retina)中,每 4 个像素为一组,渲染出普通屏幕中一个像素显示区域内的图像,从而实现更为精细的显示效果。此时, 250px 的元素跨越了 500 个物理像素的宽度。

如果用户进行了放大,那么一个 CSS 像素还将跨越更多的物理像素。

1.2 三种视口

移动端浏览器通常宽度是 240px~640px,而大多数为 PC 端设计的网站宽度至少为 800px,如果仍以浏览器窗口作为视口的话,网站内容在手机上看起来会非常窄。

因此,引入了布局视口、视觉视口和理想视口三个概念,使得移动端中的视口与浏览器宽度不再相关联。

布局视口(layout viewport)

一般移动设备的浏览器都默认设置了一个 viewport 元标签,定义一个虚拟的布局视口(layout viewport),用于解决早期的页面在手机上显示的问题。iOS, Android 基本都将这个视口分辨率设置为 980px,所以 PC 上的网页基本能在手机上呈现,只不过元素看上去很小,一般默认可以通过手动缩放网页。

布局视口的宽度/高度可以通过 document.documentElement.clientWidth / Height 获取。

可以看到,默认的布局视口宽度为 980px。如果要显式设置布局视口,可以使用 HTML 中的 meta 标签:

<meta name="viewport" content="width=400">

布局视口使视口与移动端浏览器屏幕宽度完全独立开。CSS 布局将会根据它来进行计算,并被它约束。

视觉视口(visual viewport)

视觉视口是用户当前看到的区域,用户可以通过缩放操作视觉视口,同时不会影响布局视口。

视觉视口和缩放比例的关系为:

当前缩放值 = 理想视口宽度 / 视觉视口宽度

所以,当用户放大时,视觉视口将会变小,CSS 像素将跨越更多的物理像素。

理想视口(ideal viewport)

布局视口的默认宽度并不是一个理想的宽度,于是 Apple 和其他浏览器厂商引入了理想视口的概念,它对设备而言是最理想的布局视口尺寸。显示在理想视口中的网站具有最理想的宽度,用户无需进行缩放。

理想视口的值其实就是屏幕分辨率的值,它对应的像素叫做设备逻辑像素(device independent pixel, dip)。dip 和设备的物理像素无关,一个 dip 在任意像素密度的设备屏幕上都占据相同的空间。如果用户没有进行缩放,那么一个 CSS 像素就等于一个 dip。

用下面的方法可以使布局视口与理想视口的宽度一致:

<meta name="viewport" content="width=device-width">

实际上,这就是响应式布局的基础。

2. 视口的设置

我们可以使用视口元标签(viewport meta 标签)来进行布局视口的设置。

<meta name="viewport"content="width=device-width,initial-scale=1.0,maximum-scale=1">

下面是每个属性的详细说明:

属性名 取值 描述
width 正整数或device-width 定义视口的宽度,单位为像素
height 正整数或device-height 定义视口的高度,单位为像素,一般不用
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 定义是否允许用户手动缩放页面,默认值 yes

有几点值得注意:

  • viewport 标签只对移动端浏览器有效,对 PC 端浏览器是无效的
  • 当缩放比例为 100% 时,dip 宽度 = CSS 像素宽度 = 理想视口的宽度 = 布局视口的宽度
  • 单独设置 initial-scale 或 width 都会有兼容性问题,所以设置布局视口为理想视口的最佳方法是同时设置这两个属性
  • 即使设置了 user-scalable = no,在 Android Chrome 浏览器中也可以强制启用手动缩放

3. 一倍图、二倍图、三倍图

MacBook Pro 视网膜屏(Retina)显示器硬件像素是 2880px 1800px。当设置屏幕分辨率为 1920px1200px 的时候,理想视口的宽度值是 1920px, 那么 dip 的宽度值就是 1920px。其与理想视口宽度的比值为1.5(2880/1920),这个比值叫做设备像素比:

逻辑像素宽度 * 设备像素比 = 物理像素宽度

设备像素比可以通过 window.devicePixelRatio 来获取,或者使用 CSS 中的 device-pixel-ratio

下面是常见的设备像素比:

  • 普通密度桌面显示屏:devicePixelRatio = 1
  • 高密度桌面显示屏(Mac Retina):devicePixelRatio = 2
  • 主流手机显示屏:devicePixelRatio = 2 or 3

对于一张 100px * 100px 的图片,通过 CSS 设置其宽高:

{width:100px;height:100px;
}

在普通显示屏的电脑中打开是正常的,但假设在手机或 Retina 屏中打开,按照逻辑分辨率来渲染,他们的 devicePixelRatio = 2,那么就相当于拿 4 个物理像素来描绘 1 个电子像素。这等于拿一个2倍的放大镜去看图片,图片就会变得模糊。

这时,就需要使用 @2x 甚至 @3x 图来避免图片的失真。

结尾

学习html5、css、javascript这些基础知识,学习的渠道很多,就不多说了,例如,一些其他的优秀博客。但是本人觉得看书也很必要,可以节省很多时间,常见的javascript的书,例如:javascript的高级程序设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。

资料领取方式:戳这里免费获取

设计,是每位前端工程师必不可少的一本书,边看边用,了解js的一些基本知识,基本上很全面了,如果有时间可以读一些,js性能相关的书籍,以及设计者模式,在实践中都会用的到。

资料领取方式:戳这里免费获取

web前端开发h5,2021中高级前端面试题合集相关推荐

  1. 2020中高级前端面试题合集

    2020中高级前端面试题合集 "全方位总结一下所遇到的面试题目,与大家共同学习,也是对自己的一次总结" 文章同步到我的公众号<前端小时>,欢迎大家关注! 01 前言 2 ...

  2. 中高级前端面试题合集

    2020是不平凡的一年,这一年里发生许多事情,大家也都知道.对于互联网行业来说也是一次重大的打击,也有一些企业在这次疫情中倒闭了,所以可能对于今年2020年毕业的同学来说是一次很大的考验,也关乎我们的 ...

  3. 前端面试题合集(持续更新中......)

    HTML.CSS 1.元素水平垂直居中 • 定位偏移 top,left为50%,margin-left,margin-top自身的-50% • 定位平移 top,left,bottom,right为0 ...

  4. 2020-2021前端面试题合集,面试题附答案

    近几年,随着技术和政策的变化,国内对技术人才的需求也是翻天覆地的变化. 为什么转行前端呢? 对于很多毕业学生来说,前端开发工程师行业需求大.待遇好.不限门槛.政策优,成为了很多大学生的就业发展选择. ...

  5. 最新初中级前端面试题合集一,你确定不看一看嘛

    本文的面试题目是比较新的前端题目,适用于初中级的面试者,题目都是面试中高概率的题,也真诚的希望大家能够找到一个好的公司,希望这些真的对大家有用!谢谢,我会不断更新,希望大家能学到知识,进入心仪的公司. ...

  6. web开发者工具,261页前端面试题宝典,通用流行框架大全

    开头 Web前端开发基础知识学习路线分享,前端开发入门学习三大基础:HTML.CSS.JavaScript.除此之外还要学习数据可视化.Vue.React.Angular相关框架,熟练运用框架提升开发 ...

  7. web前端入门到实战:SCSS 常用属性合集

    Scss 文档太多了,但还是耐心看完了,总结自己常用的一些语法. 1.规则嵌套 Sass 允许将一套 CSS 样式嵌套进另一套样式中,内层的样式将它外层的选择器作为父选择器,例如: #main p { ...

  8. web前端开发,2021年最新

    前言 基础知识是前端一面必问的,如果你在基础知识这一块翻车了,就算你框架再好,无济于事,因为对方就不会再给你展示的机会,千万不要因为基础错过了自己心怡的公司. (本篇文章可能只是适用于刚毕业的同学或者 ...

  9. 2021 字节前端面试题汇总

    自我介绍.项目介绍 (1)怎么学习前端的,看了哪些书 (2)实现左中右三栏布局,左右固定宽度,中间自适应 (3)var. let. const的区别(重点) (4)看代码说输出 var length ...

最新文章

  1. 寻找孪生素数(当p为素数时,p+2也为素数)
  2. 隐藏讨厌的桌面挂载卷图标
  3. 浅谈RAID写惩罚(Write Penalty)与IOPS计算
  4. htmlunit爬虫工具使用--模拟浏览器发送请求,获取JS动态生成的页面内容
  5. 【腾讯面试题】Nginx
  6. 疯子的算法总结(七) 字符串算法之 manacher 算法 O(N)解决回文串
  7. 利用C语言实现计算机图像处理的方法
  8. go语言mysql删除记录_MySQL数据库删除操作-Go语言中文社区
  9. 【生物】基因编辑研究方向全面盘点,一文带你了解基因魔剪的前世今生
  10. 英特尔:把基带卖给苹果 完全是高通逼的
  11. 众包专访:告别接包黑历史,来到开源中国众包接包小记
  12. 智鼎逻辑推理题及答案_2019最新玛氏笔试真题节选(含答案及解析)
  13. android 自动语音提醒,Android 语音播报实现方案
  14. html挪车隐藏手机,挪车电话轻易泄露你的隐私!车主这样做才能万无一失!
  15. 公众号内测算法推荐引争议,却有小号因此阅读增长20倍
  16. 股权融资的A、B、C、D轮
  17. DNA binding motif比对算法
  18. 为了caffe(四)学习人家的文章
  19. 终朝睡在鸿蒙窍,南怀瑾老师:话头——答叔、珍两位质疑的信
  20. linux系统下创建anaconda新环境及问题解决

热门文章

  1. 《STK基础教程》首发
  2. 雷达技术与仿真实现(一)
  3. ZCMU计算机网络期中(1-计算机网络概论,网络体系结构与网络协议,物理层)
  4. 【附源码】计算机毕业设计JAVA罪犯信息管理系统
  5. maxwell 与matlab,Maxwell 与Simulink协同仿真
  6. android usb rndis驱动,usb绑定rndis驱动下载-RNDIS驱动工具 2.0.1.1 最新版 - 河东下载站...
  7. 【WebSocket 第一篇】从一个WebSocket连接说起
  8. 君子有所为,有所不为
  9. 人工智能——DBSCAN密度聚类(Python)
  10. Vue开发环境搭建详细操作(NodeCnpmVue)