(翻译)第三种viewport-ideal viewport

news/2025/6/19 17:17:48

原文:http://www.quirksmode.org/mobile/metaviewport/#t10

第三种viewport

多年前 我提到了移动端的浏览器有两种viewport:visual viewport很layout viewport。如果有必要可以重读这几篇文章。文章
我假设这两个viewport的知识大家已经掌握了。

ideal viewport

结果表明存在第三种viewport,我把他叫做ideal viewport。这个viewport能将设备上的页面设置能最理想的尺寸。因此,每种设备的ideal viewport的尺寸是不一样的。

在老的便宜的没有retina屏幕的机型上,ideal viewport跟物理像素一致,但这不是必须的。更新物理像素更高的设备保持旧的ideal viewport,因为这是最理想最适合设备的。

直到iphone4s,不管是否有retina屏,他的ideal viewport都是320x480。因为320x480对于在这种iphone上的页面来说,是最理想的。

关于idealviewport 最重要的两点内容:

  1. layout viewport能被设置成ideal viewport。width=device-width和initial-scale=1指令可以做到。

  2. 所有的scale指令都是相对于ideal viewport的。无视layout viewport设置了多少,所以maximum-scale=3意味着最大的缩放值是ideal viewport的300%

寻找ideal viewport

读取到ideal viewport的值在某些情况下是有用的。
是的,你可以读取到。给页面设置一个如下显示的meta标签,然后使用document.documentElement.clientWidth读取到当前设备的ideal viewport。

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

如果上面这个方法你不能选择而导致你不能读取到ideal viewport的值,我希望screen.width可以帮助到你,但是只有BlackBerry能给出正确的信息。其他浏览器会得出不同的无用的信息。

开放的问题:screen.width应该取得ideal viewport的值吗
赞成:这个属性至少应该取得有用的信息
反对:ideal viewport 跟物理像素一样无用

Alt text

layout viewport

在呈现页面之前,浏览器需要知道layout viewpoint的宽是多少。这个viewport的值是相对于css声明来计算的,例如width:20%

在没有任何指令的情况下,移动端浏览器会自己选择一个默认值,大部分是980px。这无关对错,只是浏览器供应商自己的选择。

当你在meta viewport标签里设置了width=400或者其他任何数值,layout viewport会被设置成这个值,我们已经知道了。

然而Android WebKit’s and IE 的最小layout viewport是320px,当设置的值小于320,会自动变为ideal viewport的值。

有一种情况是layout viewport跟ideal viewport的值相同,这发生在设置了width=device-width or initial-scale=1。这是复杂的,因为safari和ie10有一些bugs,使用inittial-scale也是有陷阱的,但是这是普通的规则。

最小、最大的尺寸

最大的layout viewport的宽度是10000像素,我不是十分相信这个数字,因为浏览器不会允许你缩小到这个数值,到目前为止我是接受这个官方数字的。

最小的layout viewport的值大约是1/10的ideal viewport,这也是最大的缩放等级。(layout viewport 永远不会变的比最小的visual viewport还要小)例外:Android WebKit and IE最小的layout viewport不会小于320px

缩放

zoom缩放是狡猾的。理论上听起来很简单:决定用户缩放的缩放因素包含两个方面:

  1. 我们不能直接读取缩放因素,取而代之的是我们不得不读取与缩放因素互相关联的visual viewport的宽度。
    所以最小的缩放因素决定了最大的visual viewport的宽度,反之亦然。

  2. 结果表明所有的缩放因素都是相对于ideal viewport的,不管当前的layout viewport的值是多少。

然后就是关于名字的讨论,用Apple的语言来讲,zoom就是scale,类似meta viewport的指令initial-scale, minimum-scale, and maximum-scale,其他浏览器厂商被迫遵从为了保持对已经兼容了iphone的页面的兼容性。

这三个指令预示着缩放因素,initial-scale=2意味着缩放到200%的ideal viewport的宽度。

公式

首先让我们定义公式:

visual viewport width = ideal viewport width / zoom factor
zoom factor = ideal viewport width / visual viewport width

因此,ideal viewport为320px设置了缩放值2我们会得到160px的的visual viewport。layout viewport的宽度不参与计算。

最小、最大的缩放因素

浏览器支持的最小和最大的缩放因素是多少呢?

首先会有一个限制,visual viewport永远不会比layout viewport要宽,所以大多数情况下最下的缩放因素为ideal viewport width / layout viewport width

initial-scale

设置initial-scale指令实际上做了两件事:

  1. 把页面的初始缩放因素设置了一个有意义的值,是相对于ideal viewport进行计算的,产生了visual viewport的宽度。

  2. 根据刚刚计算得到的visual viewport的宽度值去设置layout viewport 的宽度值。

让我们看看一台竖屏的iphone(译者:4s),我们设置initial-scale=2,并且不设置其他的指令。这个指令将visual viewport的宽设置为160px(320 /2),这应该不会让你感到惊讶。这就是缩放指令工作的方式。

然而,这个指令同样让layout viewport的宽设置为160px,所以我们有一个缩放值最小状态下160px宽的页面。(visual viewport 不会变的比layout viewport更大,所以不能再缩小了)

但是这没什么意义,如果要问我的意见我可能会说:完全没有任何意义。然而,毫无疑问的是浏览器的行为就是这样的。

浏览器bugs

对于安卓,明显的,安卓允许在其值等于1的情况下,initial-scale去设置layout viewport的宽。并且不能设置width的值。所以只有在没有其他指令的情况下initial-scale=1的设置会启到作用。

对于IE,他提供了错误的ideal viewport(320x320和不是320x480),而且IE假装所有initial-scale的值都为1,所有对于IE来讲设置initial-scale的值是无用的。

指令的混淆

因为initial-scale能设置layout viewport的宽,你现在可以创建一个有争议的指令

<meta name="viewport" coontent="initial-scale=1, width=400">

现在会发生什么?浏览器得到混淆的指令,我们再回到4s上,

  1. initial-scale=1告诉浏览器设置layout viewport的宽为320px

  2. width=400告诉浏览器设置layout viewport 的宽为400px

翻译文章!经验有限,慎用!


https://dhexx.cn/news/show-2998773.html

相关文章

单元测试-Socket服务端(简单测试)

前言 一般修德有道的高僧都有这样的明悟:"看山是山&#xff0c;看水是水&#xff1b;看山不是山&#xff0c;看水不是水&#xff1b;看山只是山&#xff0c;看水只是水"。其实道理都是相通的&#xff0c;可是我们都易“犯当局者迷”的错误。下面我通过程序员的角度&…

android remoteview 缓存,关于RemoteView的一点愚见(实现桌面小部件)

RemoteView中的应用除了有通知栏的自定义之外&#xff0c;还有桌面小部件也是通过RemoteView以及AppWidgetProvider来完成的。实际上AppWidgetProvider是一个广播&#xff0c;即继承于BroadcastReceiver。public class AppWidgetProvider extends BroadcastReceiver那么我们其实…

如果有一些引用存在于标记中,则不会重命名这些引用,要继续吗

VS2005&#xff0c;在设计模式下对控件重命名&#xff08;改名&#xff09;时发现一个问题&#xff0c; 提示错误信息“如果有一些引用存在于标记中,则不会重命名这些引用,要继续吗&#xff1f;” 无论选择是或者否都无法重命名。 解决办法&#xff1a; 方法一&#xff1a;撤换…

(05)odoo数据库和业务操作

以一个例子开头* To-do 向导 # 配置文件 __openerp_.py: { name: To-do Tasks Management Assistant, description: Mass edit your To-Do backlog., author: Daniel Reis, depends: [todo_user], data: [todo_wizard_view.xml], } __init_…

make: `clean' is up to date

今天在编译程序时&#xff0c;make -f test.mak clean 报"clean is up to date"&#xff0c;怎么也编译不通过。 实在想不通&#xff0c;一个make clean 居然都不通过&#xff0c;折腾了半天才发现&#xff0c;原来是在编译目录下居然有一个名为"clean"…

html把保留图片改为提交按钮,如何制作图片按钮,并为图片按钮添加提交表单和重置表单功能...

网页中有表单&#xff0c;表单的默认按钮样式不是很好看&#xff0c;很多人为了美观使用图片做按钮。今天中国在一、图片按钮的制作方法1、 定义图像形式的提交按钮。2、用CSS把图片设为按钮的背景3、作用&#xff0c;设置其background样式提示&#xff1a;需要把按钮的宽高设的…

Nodejs 服务器端与客户端之间的操作

Nodejs 服务器端与客户端之间的操作 这是一个小的程序引用。通过客服端执行程序。服务端接受程序并打印文本 服务器端 Server.js //nodejs Serverweb服务器 var qs require(querystring);require(http).createServer(function(req,res){var body ;//获取数值req.on(data,fun…

ubuntu如何安装pthread?

由于学习多线程编程&#xff0c;所以用到pthread&#xff0c;但是man的时候却发现没有pthread函数库的手册页&#xff0c;然后安装 $sudo apt-get install glibc-doc 安装以后&#xff0c;发现还是有很多函数不全&#xff0c;只有一小部分pthread的函数&#xff0c;使用man -k …

[转]C++异常处理 14

有可能发生在一个f i n a l l y块、一个异常过滤器、或一个异常处理程序里。当发生这种情况时&#xff0c;系统压栈异常。回忆一下G e t E x c e p t i o n I n f o r m a t i o n函数。这个函数返回EXCEPTION_ POINTERS结构的地址。E X C E P T I O N _ P O I N T E R S的E x …

html跟随鼠标代码,跟随鼠标特效代码

网页特效---跟随鼠标的棉花糖BGCOLOR"#FFFFFF" VISIBILITY"SHOW" TOP"10" LEFT"10" NAME"a0">CLIP"0,0,3,3" BGCOLOR"#FFFFFF" VISIBILITY"SHOW" TOP"10" LEFT"10"NA…