热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

图文并茂让你必须弄懂viewport

请先确保阅读第一篇了解概念:图文并茂带你弄懂物理分辨率、分辨率、物理像素、逻辑像素、dpr、ppi,否则此文可能阅读困难。目录不得不说的屏幕尺寸必须

请先确保阅读第一篇了解概念:图文并茂带你弄懂物理分辨率、分辨率、物理像素、逻辑像素、dpr、ppi,否则此文可能阅读困难。


目录

不得不说的屏幕尺寸

必须说说窗户尺寸

视口viewport问题引出

放大

缩小

hr-toc" />

不得不说的屏幕尺寸

这里我得盗一下图,来好好说说这些概念

简单的说就是你的显示器的分辨率用物理像素描述的,而横向和纵向的分辨率值可以用screen.width/height打印出来。它们是显示器的功能,而不是浏览器的功能。不管窗口放大缩小,screen.width/height是不会变的。(IE7、8是例外,均以CSS像素为单位进行测量)。除非设置分辨率,让LED液晶板重新划分物理像素点,否则就认为分辨率不变。

 


必须说说窗户尺寸

浏览器窗口里面的宽度和高度可以用window.innerWidth/innerHeight描述,单位是CSS像素。

既然说是CSS像素,肯定缩放之后会有变化,如图

Console窗口的改变相当于改变浏览器显示大小。如果放大,窗口中的可用空间会减少,并 window.innerWidth/Height通过减少来反映出来。(Opera是一个例外,Opera window.innerWidth/Height 不会在用户放大时减小:它们以设备像素为单位进行度量。这在台式机上很烦人,但在移动设备上却很致命)

注意:测量的宽度和高度包括滚动条。它们也被视为内部窗口的一部分,这主要是出于历史原因。

 


视口viewport问题引出

移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域,在具体一点,就是浏览器上(也可能是一个app中的webview)用来显示网页的那部分区域,但viewport又不局限于浏览器可视区域的大小,它可能比浏览器的可视区域要大,也可能比浏览器的可视区域要小。

如果有这么一个页面,PC端显示如下,图片大小是200px*200px(CSS像素)

移动端

我们打开标尺Show rulers发现,物理视口的物理像素是375px。若不清楚物理像素和CSS像素可见前篇图文并茂带你弄懂分辨率、物理像素、逻辑像素、dpr、ppi

它将PC页面缩小到一个手机屏幕的可视范围,原理是怎么样的呢?我们用下面的图来说说

移动设备上的浏览器都会把自己默认的viewport设为980px或1024px(也可能是其它值,这个是由设备自己决定的),这里是980px。这个是CSS像素。横向980个CSS像素必须显示在横向375个物理像素点上。这样1个物理像素横向上不得不显示980/375≈2.61个CSS像素,所以1个物理像素显示2.61×2.61个CSS像素,也就是我们看到的缩小效果。缩小之后一个物理像素现在重叠了2.61*2.61≈6.8个CSS像素,强行缩小显示在移动端,看起来会太小,体验很不友好。


放大

现在我们加上meta标签,初始缩放比为1(等于没有缩放),比如iphone6 的初始宽度的物理像素为375px,1CSS像素占1个物理像素,所以CSS像素最大显示也是375px。

下图是显示200px×200px(CSS像素)的图片,在缩放比为1的显示情况。

右下角盒子模型中的像素是CSS像素,切记

我们改为,现在缩放比是2,缩放的是CSS像素。我要好好说说这个例子。

原来1个CSS像素表示1个物理像素,此时横向上1个CSS像素表示2个物理像素。以横向为例,看起来被截断了,要显示完整宽度需要视口宽度是400px(物理像素),这里只有375个物理像素点,故被"截断"。

横向的解释:可以看到因为放到了2倍,所以横向的375px变为了187.5px(取整为187),也就是说原来横向375个物理像素点需要375个CSS像素点,现在375个物理像素点只需要187个CSS像素点就可以覆盖,横向1个CSS像素就覆盖了2个物理像素点。

纵向的解释:纵向也是放大2倍,原来缩放比为1的时候纵向只需要290个物理像素,现在纵向需要580个物理像素,纵向的1个CSS像素覆盖了2个物理像素点。这里html的高度(CSS像素)始终是290px,放大后CSS像素没变,而纵向覆盖的物理像素变成了2倍。


缩小

初始缩放比为0.5

如果初始缩放比为1,那么布局的宽度就是和视口viewport的宽度是一样的,即initial-scale=1等同于width%3Ddevice-width%E7%9A%84%E9%97%AE%E9%A2%98">viewport" cOntent=">

 initial-scale=1 解决了 iphone、ipad的横竖屏不区分毛病,viewport" cOntent=">等同于

但是为了适应各种设备,还是要写成user-scalable%3Dno%2C%20maximum-scale%3D1%2C%20minimum-scale%3D1%E7%9A%84%E9%97%AE%E9%A2%98">user-scalable=no, maximum-scale=1, minimum-scale=1的问题

一般来说,我们在移动端是不让用户缩放的。

现在混合Hybrid app那么多,为了看起来更像原生开发,也不会让用户缩放,如果不让缩放,看起来是原生开发,如果用户能缩放,一看就是网页,体验不好,有可能和手机的快捷手势冲突

那么不让缩放可以有2种写法

最大缩放比为1,最小缩放比为1

不允许用户缩放(IOS的safari中,即使你写的 user-scalable=no,用户照样可以缩放)

同样的,为了保证兼容性,把三者都写上

最后视口最标准的写法如下


width设置布局视口的宽度,为一个正整数,不要加px单位,或字符串"width-device"
initial-scale设置页面的初始缩放值,为一个数字,可以带小数
minimum-scale允许用户的最小缩放值,为一个数字,可以带小数
maximum-scale允许用户的最大缩放值,为一个数字,可以带小数
height设置布局视口的高度,请忽略,基本没用过
user-scalable是否允许用户进行缩放,值为"no"或"yes", no 代表不允许,yes代表允许

如何打印视口宽度

PC端

一般讨论视口就是说移动端,和PC端无关,但是这里还是说一下效果

PC端的 window.innerWidth 和 document.documentElement.clientWidth 打印的是显示宽度(CSS像素),缩放就看得到区别,验证是CSS像素

没做视口viewport适配的显示效果

做了视口适配的效果(比如百度)

兼容性的方案:

var viewWidth = document.documentElement.clientWidth || window.innerWidth;

即可获取视口宽度,如果做了视口适配,这个打印出来就是和屏幕宽度一样的值,比如这里的375个CSS像素,如果不做视口适配,这个打印出来就是默认视口宽度(和机型相关),比如980个CSS像素

 

配套演示代码可自行下载调试

https://gitee.com/lcy0515/viewport/

或 https://download.csdn.net/download/qq_34115899/12379615

 

参考文章:

https://www.quirksmode.org/mobile/viewports2.html

https://www.cnblogs.com/2050/p/3877280.html

 

关注、留言,我们一起学习。

 

===============Talk is cheap, show me the code================


推荐阅读
  • 当前,众多初创企业对全栈工程师的需求日益增长,但市场中却存在大量所谓的“伪全栈工程师”,尤其是那些仅掌握了Node.js技能的前端开发人员。本文旨在深入探讨全栈工程师在现代技术生态中的真实角色与价值,澄清对这一角色的误解,并强调真正的全栈工程师应具备全面的技术栈和综合解决问题的能力。 ... [详细]
  • 在PC端,视口指的是浏览器的可视区域,其宽度和浏览器窗口的宽度保持一致。在CSS标准文档中,视口也被称为初始包含块,它是所有 ... [详细]
  • Framework7:构建跨平台移动应用的高效框架
    Framework7 是一个开源免费的框架,适用于开发混合移动应用(原生与HTML混合)或iOS&Android风格的Web应用。此外,它还可以作为原型开发工具,帮助开发者快速创建应用原型。 ... [详细]
  • 在需要对iPhone进行全面备份时,有时会遇到电脑无法识别设备的情况。本文将详细分析导致这一问题的可能原因,并提供有效的解决方案。 ... [详细]
  • 本文详细解析了 Yii2 框架中视图和布局的各种函数,并综述了它们在实际开发中的应用场景。通过深入探讨每个函数的功能和用法,为开发者提供了全面的参考,帮助他们在项目中更高效地利用这些工具。 ... [详细]
  • C#中实现高效UDP数据传输技术
    C#中实现高效UDP数据传输技术 ... [详细]
  • 教育类应用程序:提升学习效率的专业工具
    2019年,多家独角兽企业高薪聘请Python工程师,这引发了对高效学习工具的关注。以Duolingo为例,其“边玩边学”的模式为语言学习提供了新思路。类似地,错题本作为一种有效的学习方法,能够帮助学生记录和复习易错题目,从而提高学习效率。教育类应用程序通过整合这些先进的学习策略和技术手段,正逐渐成为提升学生学习效果的重要工具。 ... [详细]
  • 在iOS平台上,应用的流畅操作体验一直备受赞誉。然而,过去开发者往往将更多精力集中在功能实现上,而对性能优化的关注相对较少。本文深入探讨了iOS应用性能优化的关键要点与实践方法,旨在帮助开发者提升应用的响应速度、降低功耗,并改善整体用户体验。通过具体案例分析和技术解析,文章提供了实用的优化策略,包括代码层面的改进、资源管理优化以及界面渲染效率的提升等。 ... [详细]
  • 本文详细解析了如何利用Appium与Python在真实设备上执行测试示例的方法。首先,需要开启手机的USB调试功能;其次,通过数据线将手机连接至计算机并授权USB调试权限。最后,在命令行工具中验证设备连接状态,确保一切准备就绪,以便顺利进行测试。 ... [详细]
  • 安卓和ios是什么意思安卓和iOS是移动设备上的两款操作系统。安卓英文名为Android,是美国谷歌公司基于Linux内核开发的操作系统。iOS原名iPhoneOS,是由美国苹果公 ... [详细]
  • IhaveaniPhoneappwithaCorePlotgraph.Ihaveabuttonplacednexttothegraphwhichcallssca ... [详细]
  • iOS9中的WebKit 与 Safari带来的惊喜
    iOS9中的WebKit与Safari带来的惊喜-每个用过UIWebView的iOS开发者对其诸多的限制和有限的功能也深有感触。悻然,自iOS8推出WebKit框架后将改变这一窘境 ... [详细]
  • 1.html页面如何使用swiper对swiper不熟练的小伙伴们可能不知道怎么开始使用它,那么下面就让我来简单讲述一下关于swiper的使用流程,这 ... [详细]
  • 获取 苹果UDID 序列号
    UDID是什么?UDID是由子母和数字组成的40个字符串的序号,用来区别每一个唯一的iOS设备,包括iPhones,iPads,以及iPodtouches,这些编码看起来是随机的,实际上是 ... [详细]
  • 植物大战僵尸(转载)
    植物大战僵尸(转载) ... [详细]
author-avatar
kanlikanliti_627
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有