device Pixel & CSS Pixel

物理像素指显示设备上的物理像素点,比如HTC G11宽是480px,这的480是用物理像素衡量的。 CSS像素的话则指我们写页面时理解的那个像素单位。可以理解为是设备自己做了一层缩放,让2个物理像素代表一个我们css里说的像素,也就是dp(设备独立像素)的概念。行业内有个约定俗成的规范,即一般这个数值是320。 有的很高密度的手机略作了调整。

想知道设备的物理像素的话,一般去取 screen.width 就可以。 但苹果只会给你dp的数值,也就是320。这个时候就得用实际上的虚拟像素数(即dp个数)乘以设备像素和css像素的比值计算出来设备像素值。

screen.width * devicePiexlRation 

区分好啥时候说的是设备的物理像素,啥时候说的是一般意义上的px对后面的理解非常重要!

DPI & PPI

  • Dpi 指 Dots Per Inch ;
  • PPI指 Pixels Per Inch

用于衡量设备的物理像素密度;dpi主要见于Google Android开发文档,Screen Support这一章节。这篇文章主要是讲安卓开发,因此请不要被带跑,看关键的几个部分就好。

在我看来,显示设备上的Dotspixels实际上是一回事:这里的px指的实际上就是物理像素,而不是css文档里的那个相对单位px,和Dots的含义是一致的。

计算方法便是用物理像素数除以尺寸;例如iPhone4s, 尺寸为对角线3.5英寸,分辨率960×640,那么对角线上大约有1152个物理像素,1152除3.5可得dpi约为329。

Lea Verou写的dpi计算工具

dip, dppx & devicePixelRatio

按照正确的做法,以下三个值都是由浏览器决定,不能因为meta viewport设置改变的。(但坑爹浏览器总是存在的比如三星上的海豚。。)

  • dip: device-independent pixel, 设备独立像素。这一概念主要见于Android开发文档; 安卓和WP的话使用 screen.width/devicePixelRatio 就可以得到dip数量; IOS上直接获取 screen.width 就是。

  • dppx : device pixel / css pixel; 这个词其实我是在Lea的dpi计算工具里见到的。

    (dppx) for the amount of device pixels per CSS pixel

  • devicePiexlRatio :webkit浏览器(包括opera)支持的一个window属性,在console里面打window.devicePiexlRatio就能看到啦。可参见PPK写的相关博文,devicePixelRatio及后续More about devicePixelRatio; 国内的张鑫旭也写了很不错的分析: 设备像素比devicePixelRatio简单介绍

后面两个值dppx和devicePiexlRatio其实代表的是同一个数值;至于dip,俗称dp, 一般见于安卓开发的时候使用,个人认为其实就等同于前端这边使用的css概念里的那个相对单位px。

layout viewport & visual viewport

关于两个viewport的具体指南,请移步PPK经典大作:A tale of two viewportsPART 2. 该文只做概要。

meta设置的取值分两类:widthheight 和 scale

width & height

这一设置改变的是layout viewport的宽度。layout viewport的宽度便是我们的文档真正依托的布局宽度。

对应 documentElement.clientWidth 。

注意!这里所说的html的宽度是外界限制定的,css不能控制,不是说你设meta里width为320,把body宽度设置成640,这个layout就变成640了。实际上还是320,然后滚动条出现啦!除非你还禁止了缩放,那连滚动条都没了。

scale(initial\max\min)

定义visual viewport初始的缩放比例。这是可以看到的那个小窗口,我们关心的是这个小窗口里可以看到多少像素。**这个值改变不影响layout viewport!** 可以设置scale,允许用户缩放的话用户自己动手也可以改变:放大时可见的像素点减少;缩小时,可见的像素点增加;

浏览器在初始载入页面的时候,先是猜想当前文档的宽度(即html元素的宽度,可使用documentElement.clientWidth 获取到),如果meta设置了width, 那么就会以此为layout宽度,如果文档内有元素宽度超出,且meta定义允许用户缩放,那么就会有滚动条啦。换言之不允许缩放还超出了,那用户基本甭想看到超出去那块内容了。这一宽度即是layout viewport的宽度。

而为了能让用户看到更多的内容呢,浏览器会根据layout viewport的宽度来调整缩放比率,也就是调整visual viewport的大小,如果meta设置里没有对此做任何规定, 那么layout viewport是多少这个就是多少;如果meta里设了 initial-scale=1 , 那么视窗宽度就等于dp宽度,也就是经过设备自行缩放后的宽度。正像我们之前说的,一般就是320啦。

举个栗子: meta里这么写: width=700, 那么layout宽度700,visual viewport宽度也会是700,刚好显示全部文档;

meta要是改成width=700,initial-scale=1,layout依然是700,但visual viewport就变成了320!

Tips!

  • chrome dev tool模拟的时候直接无视meta, 完全按照物理像素来
  • 浏览器喜欢保存你上次的缩放比。。。所以测试非常具有混淆性;改url比较保险 实际上有两层缩放:

  • iphone那个旋转到landscape后的bug,实际上就是在允许用户缩放的情况下,当页面从portrait旋转到landscape的时候,页面会自行放大。用户必须双敲两下才会还原。解决的方法一般就是在旋转时使用js修改meta,设置最大缩放比率为1:maximum-scale=1 (参见iPhone Safari Viewport Scaling Bug

Mobile上的viewport及各种概念澄清贴的更多相关文章

  1. 11、使用 WinAppDeployCmd 部署appx 包到 Windows10 Mobile上(更新)

    在 Windows10 Mobile开发工具里,微软没有提供 wp8 sdk 中 Application Deployment 一样的部署工具,参考 了一下  StackOverflow 论坛上的帖子 ...

  2. dpr,ppi,dip,viewport的一些概念

    一 ppi,dpr,dip,分辨率,屏幕尺寸,设备物理像素,设备独立像素 分辨率:1920px*1080px 在这个设备上纵向上有 1920个像素点(色块)... 屏幕尺寸:5英寸(in) = 5*2 ...

  3. 清华大学《C++语言程序设计基础》线上课程笔记01---基础概念与一些注意事项

    使用除法的注意事项 double b = 4.0 * 1/239.0; 因为整数相除结果取整,如果参数写1/239,结果就都是0 浮点数注意事项 浮点数是近似存储,所以不能直接比较两个浮点数的大小, ...

  4. viewport ——视区概念,为 自适应网页设计

    什么是Viewport 手机浏览器是把页面放在一个虚拟的“窗口”(viewport)中,通常这个虚拟的“窗口”(viewport)比屏幕宽,这样就不用把每个网页挤到很小的窗口中(这样会破坏没有针对手机 ...

  5. 浅谈移动Web开发(上):深入概念

    PPI 什么是PPI PPI的复杂之处在于如果他所属的上下文环境不同,意义也会完全不一样. 当我们在谈论显示设备的PPI时,它代指的屏幕的像素密度:当我们在谈论和图片相关时,我们谈论的是打印时的分辨率 ...

  6. CSS之viewport 2

    在这个迷你系列的文章里边我将会解释viewport,以及许多重要元素的宽度是如何工作的,比如<html>元素,也包括窗口和屏幕. 这篇文章我们来聊聊关于移动浏览器的内容.如果你对移动开发完 ...

  7. 两个viewport的故事(第二部分)

    原文:http://www.quirksmode.org/mobile/viewports2.html 在这个迷你系列的文章里边我将会解释viewport,以及许多重要元素的宽度是如何工作的,比如&l ...

  8. 转: 关于viewport的理解

    最近我做了一点儿针对手机的Web开发和相关研究.按说,Web自设计之初,就已经考虑了设备无关性.然而,现实总是不尽如人意. 我们知道大多数网页都是针对桌面显示器开发和测试的,但是手机屏幕通常要比桌面显 ...

  9. 【JAVAWEB学习笔记】07_BootStrap、Viewport介绍

    今天主要学习了BootStrap,viewport的介绍和最后对网站进行了重构 今天晨读单词: Compatible:兼容性 viewport:视口 device:设备 initial:初始化(缩写i ...

随机推荐

  1. C++输出中文字符(转)

    C++输出中文字符 1. cout 场景1: 在源文件中定义 const char* str = "中文" 在 VC++ 编译器上,由于Windows环境用 GBK编码,所以字符串 ...

  2. 搭建单节点Hadoop应用环境

    虚拟机: VirtualBox 5 Server操作系统: Ubuntu Server 14.04.3 LTS 如果对虚拟机空间和性能不做考虑, 且不习惯用Linux命令, 你也可以使用Ubuntu ...

  3. Java基础之参数传递

    public class ArgsTransfer { /* * 基本数据类型直接存储在变量中,函数参数传递时,是将变量中存储的数据拷贝,函数中改变形参,和调用处的实参是不同的变量,两边互不影响 * ...

  4. js判断微信内置浏览器

    做了一个h5页面来下载app,但如果页面是用微信扫一扫打开的,点击下载按钮下载不了app,原因是微信内置浏览器屏蔽了下载链接.所以增加了检测,如果用户是用微信浏览器打开的,则提示用户使用浏览器打开.那 ...

  5. 关于微信浏览不能URL传参,URL中的问号被删除

    关于微信浏览不能URL传参,URL中的问号被删除. 尼玛难道没有人遇到过这个问题?看了微信支付SDK3.0的代码,看到urlencode 看到了几次.实际上 在微信浏览器下 header('locat ...

  6. [C++]让CPU使用率曲线呈现为正弦曲线(一)

    看<编程之美>的第一题就很有意思: 写一个程序,让用户来决定Windows任务管理器的CPU占用率.可以实现下面三种情况: 1. CPU的占用率固定在50%,为一条直线: 2. CPU的占 ...

  7. 阿里云ECS每天一件事D4:安装mysql5.5.40

    Linux平台上MySQL也没什么好说的了,首先准备一下软件环境: yum install gcc gcc-c++ gcc-g77 autoconf automake make cmake bison ...

  8. c# winform读取xml创建菜单

    动态创建菜单使得程序灵活性大大增加,本文根据读取xml文件中的配置菜单项来动态创建菜单,代码如下: using System; using System.Collections.Generic; us ...

  9. HDU 4366 Successor(树链剖分+zkw线段树+扫描线)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...

  10. java ssh

    sshj (currently best choice) https://github.com/shikhar/sshj ssh used in jenkins-ci https://github.c ...