之前开发手机应用,对webapp做适配的时候,不免要用到meta标签中的viewport属性;下面就稍做一些自己的理解,以便以后查阅。
-
应用方法:
通常就是在head中添加一段常规代码:
<meta name=”viewport” content=”width=device-width, initial-scale=1, maximum-scale=1″>
参数:
width:控制 viewport 的大小,可以指定的一个值,如果 600,或者特殊的值,
如 device-width 为设备的宽度(单位为缩放为 100% 时的 CSS 的像素)。
height:和 width 相对应,指定高度。
initial-scale:初始缩放比例,也即是当页面第一次 load 的时候缩放比例。
maximum-scale:允许用户缩放到的最大比例。
minimum-scale:允许用户缩放到的最小比例。
user-scalable:用户是否可以手动缩放 -
为什么要用
考虑到手机物理尺寸,屏幕分辨率,DPI还有开发者对自己产品设计出的Width,这些林林总总的因素的不同,产生了不同的设备上,会出现产品显示不全,错位,缩放;为了避免这种情况发生,safari率先定义了meta--viewport标签,作用就是让设计者手动的定义浏览器的width,DPI的大小,进而来适配不同的物理尺寸和不同分辨率的机型;
先说一下物理尺寸、DPI、分辨率之间的关系:
分辨率就是一个面积;它定义的是在固定的物理尺寸内,所容纳的像素点。
DPI:指每英寸长度上的点数,可以细分为:水平英尺内的像素点,和竖直英尺内的像素点,如果用每平方英尺
计算,就是一英寸中所包含的像素。
物理尺寸:显而易见,这三者的计算方式,其实就是一个面积的计算。物理尺寸=分辨率/DPI
譬如:一个设备最大具有320像素*480像素,它的像素值就是320*480=15万,这就是一台15万像素的设备,当它的DPI是:300 dpi,就表示屏幕上水平和垂直的方向上每英寸的长度上都有300个点.屏幕的实际高度要用像素数目和dpi结合起来算才能得出.也就是说用像素/竖直DPI=机器高度(英寸)
- 扩展
一般viewport都会结合css3中的media query 进行对机器的适配工作。 -
阅读
A pixel is not a pixel is not a pixel
A tale of two viewports — part one
引用一博客中遇到的问题,有待于自己今后验证:
但我要做的一个应用却恰恰相反,需要利用viewport,利用缩放。不论真实分辨率是多少,无论物理尺寸是多少,我都希望在浏览器里,能有统一的分辨 率,同时也不允许用户缩放。我用来测试的设备有:iphone4、ipad2、htc的g11、不知道什么厂商的aquos phone(android系统)、华硕的android pad、dell的winphone然后我一路遇到了如下问题:
1)如果不显示地设置viewport,那么width的默认为980。如果页面的所有元素宽度都小于980,此时width为980,如果页面最 宽的位置超过980,那么width等于最大宽度。总之,默认能将整个页面从左到右显示出来。如果设置了viewport,比如,只单纯地设置了 user-scalable=no,例如<meta name="viewport" content="user-scalable=no" />,那么ios下width还是按980显示(即默认就会通过dpi缩放),但android和winphone下却不会再缩放了,浏览器分辨率 和真实设置分辨率一致。
2)对于ios设备,设置width可以生效,但对于android,设置width并不会生效。ios设备,缩放的比率即dpi是通过你设置的 width和设置真实分辨率自动计算的,而android下你设置width无效,你能设置的是一个特殊的字段target-densitydpi,关于 target-densitydpi可以参考一下这篇文章:http://hi.baidu.com/j_fo/blog/item /748361279ebccd18908f9d7d.html。也就是说,有三个变量:浏览器width、设备真实width、dpi。 我们简单地用个公式来表达它们之间的关系吧(并非真实关系,简单说明用) 设备真实width * dpi = 浏览器width,这里的三个变量,设备真实width是个我们不能操作的已知值,另外两个变量我们可以设置一个来影响另一个,在ios中,我们能改的是 浏览器width,dpi自动生成,而在android中,我们能改的是dpi,浏览器width自动生成。对于android,无论我们如何设置 width,也不会对浏览器width产生影响。
ps:这里我另外再说一个奇怪的问题:在htc的g11里(htc的手机我只有这一个,别的没有测),如果设置了dpi而不显示地设置width, 则user-scalable=no不生效,即是说:<meta name="viewport" content="target-densitydpi=300,user-scalable=no" />,无法阻止用户缩放屏幕。我们需要显示地设置一下width值,仅管这个值对android下的浏览器分辨屏并不产生任何影响(对ios还是会 产生影响的),我们仍然要设置它,而且这个值一定要大于320,如果小于等于320,也无法使user-scalable=no生效。这个问题只在htc 的g11手机上出现,在aquos phone没有这个问题。兼容android真是件头痛的事 @_@,未来还不知道有多少坑呢。而在winphone上,结果就更奇怪了:我给viewport的width设一个大于480的值,user- scalable=no就失效了,而设一个小于480的值,user-scalable=no能生效。但无论我给viewport的width设多少值, 对winphone真正显示的width却并不产生我预期的影响,通过target-densitydpi也没有影响。设置width,如果小于480的 话,屏幕会缩放,但缩小的比例却和我预期完全不一样,我不知道它是按照什么规律缩放的。不知道这是winphone的问题,还是dell实现的问题。
3)这一条和上一条应该是直接相关的:ios设备在横竖屏时,会自动调整dpi,无论横屏还是竖屏,都能保证浏览器width等于viewport 中设置的值,所以横竖屏的时候,页面里显示的内容的大小是会自动缩放产生变化的。而android手机在横竖屏的时候,不会改变dpi,在横竖屏的时候, 网页不会产生缩放。也正因此,ios可以保证横竖屏页面都不会产生滚动条,满屏显示,而android却无法保证这一点,横着满屏则竖着无法满屏,反之亦 然。
4)对于ios设备,如果width显示定义了,而页面最宽的位置超过width的话,width无效,仍按最宽的宽度来显示(不会有滚动条)。但 此时会出现一个很奇怪的问题,当你将手机横竖屏切换几次之后,会发现你的页面自动放大了,出现了滚动条,但其实放大后的宽度其实和你设的width也并没 有关系。为了防止这种情况出现,你需要将width的宽度设置得比页面最宽的地方更大,或者相同。
相关推荐
什么是Viewport 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤 到很小的窗口中(这样会破坏没有针对手机浏览器优化的网页的布局)...
viewport响应式模板
"Viewport Auto-Snap" 是一个专门针对3D视图操作的工具或脚本,它旨在提升3D建模和设计过程中的工作效率。在3D建模软件中,视口是用户观察、操作3D模型的主要界面,而"Auto-Snap"功能则是指自动对齐或捕捉,通常用于...
`ViewPort3D` 是WPF中的关键组件,用于在2D屏幕上显示3D场景。在这个主题中,我们将深入探讨如何使用`ViewPort3D`以及相关的`Helix Toolkit`库来实现3D模型的缩放、旋转和平移。 首先,`ViewPort3D`是WPF 3D框架中...
在Windows Presentation Foundation (WPF) 中,ViewPort3D 是一个强大的组件,它允许开发者创建丰富的3D图形用户界面。这个组件是WPF 3D功能的核心,它为3D对象提供了一个显示区域,并提供了对3D场景进行交互的能力...
在移动Web开发中,`viewport` 和 `Android Webview` 是两个至关重要的概念。`viewport` 是一个虚拟的浏览区域,决定了网页在不同设备上的显示方式,尤其是对于智能手机和平板电脑这样的小屏幕设备。而`Android ...
【前端开源库-viewport-list】是一个专为前端开发者设计的工具库,它的主要功能是提供一个设备视区的列表,帮助开发者更好地理解和处理不同设备在渲染网页时的可见区域,即视口。在Web开发中,视口是浏览器用于显示...
其中,`postcss-px-to-viewport` 是一个非常实用的前端开源工具,它允许我们将传统的像素单位(px)自动转换为基于视口的单位(vw、vh、vmin、vmax),以适应各种屏幕尺寸,从而实现更加灵活的布局。 首先,我们...
本节介绍 Ext的Border布局以及如何创建一个Viewport。 1、Viewport介绍: Viewport 是一类特殊的容器。它创建后会自动填充到整个页面区域,并能自动适应页面缩放。一般作为用用程序全局容器使用。 2、Border布局...
【标题】"图文并茂让你必须弄懂viewport配套示例代码.rar"的资源是一份针对网页开发中的关键概念——“视口”(viewport)的详细教程。这份压缩包包含了一个HTML示例页面(视口--viewport.html)、一个链接到相关...
`Viewport3D` 包含两个主要组成部分:`Viewport3DVisual` 和 `Model3DGroup`。`Viewport3DVisual` 是显示3D内容的容器,而 `Model3DGroup` 则用于组织3D模型和效果。 要构建3D模型,我们通常会用到以下几种3D元素:...
【前端项目-viewport-units-buggyfill.zip】是一个专门针对前端开发的项目,其核心目的是确保在旧版的WebKit(如Safari、Chrome的老版本)和Trident(IE浏览器)中,视区单位(viewport units)如 vh (viewport ...
viewport 视口 窗口 GDI 坐标 映射方式定义了Windows如何将GDI函数中指定的逻辑坐标映射为设备坐标。 Windows有关映射模式的一些术语:逻辑坐标所在的坐标系称为"窗口",将设备坐标所在的坐标系称为"视口"。
ember-in-viewport, 在 viewport @ 60FPS,检测Ember视图或者组件是否为 ember-in-viewport检测Ember视图或者组件是否位于 viewport @ 60 FPS 。美国船厂建立和维护收费 ,请与我们联系,咨询专家 Ember.js 。读取 ...
一个功能强大的viewport程序实例,可以满足你多种需要调节。
[Bootstrap_3][中文]_02._Bootstrap原理,@media_與_viewport
fabricjs-viewport, 在fabricjs中,允许缩放和viewport操作 fabricjs-viewport fabricjs中viewport和缩放的简单实现。不更改数据模型,因此缩放/抓取后画布上的所有对象都不会更改支持触摸屏设备支持自由绘制模式第...
在OpenGL中,视口(Viewport)是屏幕上的一个矩形区域,用于将三维场景投影到二维屏幕上。本篇文章将深入探讨如何在OpenGL中实现四个独立的视图交互控制,以及涉及到的关键技术。 首先,理解OpenGL的投影和视图概念...
标题"前端开源库-postcss-px-to-viewport.zip"指出这是一个关于前端开发的开源库,具体是PostCSS插件——Postcss-px-to-viewport。PostCSS是一个工具,允许开发者通过编写JavaScript插件来转换CSS代码,以实现各种...