zoukankan      html  css  js  c++  java
  • 不是像素的像素不是像素

    不是像素的像素不是像素

    昨天 John Gruber 的文章谈到了 在即将到来的iPhone中的增强像素密度(the upped pixel density 替代480x320的 960x640分辨率),以及为什么 Apple 这么做。他也很想知道这接下来对web开发者的影响会是什么。

    现在我正巧在深入研究在移动话机设备上面,跨浏览器的宽度与高度问题,所以可以较合理的确定在99%的情形中,这些改变根本不会对web开发者产生影响。

    剩下的1%很棘手,但我希望 Apple 可以面对这个问题,插入一个中间的像素层。(后来John 指出来 这种像素层在Android中已经存在了。)

    一个开始前的警告:我总是忽略正式的屏幕尺寸,因为他们对web开发者不重要,而且我也不准备讨论显示的输入与输出,像素密度,以及其它复杂的概念。因此这儿有可能会用错术语,在此预先说一声抱歉。

    web 开发者需要什么

    可是,我不知道web开发者对什么感兴趣。他们需要CSS像素。也就是说,CSS中使用的“像素”是这么声明的 300px 或 font-size: 14px。

    这些像素与设备的实际像素密度没有丝毫关系,甚至是和传说中的即将到来的过渡层也没有关系。他们本质上是专门为我们web开发人员创建的一个抽象结构。

    当我们考虑到缩放的时候最容易解释这一点。如果用户放大,具有 300px的元素将占据越来越多的屏幕,这样以设备(物理)像素来衡量就会变得越来越宽。但是,以CSS像素来算,宽度仍维持在300px,缩放效果是通过按照需要扩展CSS像素来实现的。

    当缩放因子恰好是100%,一个CSS像素等于一个设备像素(虽然即将到来的中间层将会在这里替代掉设备像素)。下面的图像描述了这一点。这里没有更多的东西要看,因为一个CSS像素恰好与一个设备像素重叠。

    (我或许应该提示你在web开发中 “zoom 100%” 没有什么意义。缩放水平对我们并不重要;我们需要知道的是现在有多少CSS像素在与屏幕适配。)

    下面的两幅图像阐明了用户缩放的时候发生了什么。第一幅显示出用户放大的时候,设备像素 (深蓝色背景) 和CSS像素 (半透明的前景)。CSS像素变得小了;一个设备像素覆盖了若干个CSS像素。第二幅图像显示出用户缩小的时候,设备和CSS像素情况。现在一个CSS像素覆盖了数个设备像素。

     

    这样我们的元素宽度 300px总是恰好等于300CSS像素宽,而有多少设备像素与当前的缩放因子有关。

    (你可以通过screen.width除以window.innerWidth计算出这个因子——在iPhone设备上。浏览器不兼容的问题在这里盛行;期待在不远的将来有一个完整的报告。此外,作为一个web开发者,你不会对缩放因子感兴趣,而会对屏幕上适合有多少像素(设备的或CSS的)感兴趣。)

    这个系统不会变化。要不然,所有的针对iPhone优化的网站就会忽然有一些需要优化的地方,而这正是Apple努力以一切代价所避免的。

    因此,一个最大化的网站仍然显示为980CSS像素,而它等于多少设备像素对我们并不重要。

    棘手的问题(The tricky bits)

    然而,这里有两个棘手的问题: device-width媒体查询(media query)和<meta name="viewport" width="device-width">标签。它俩都在设备像素上起作用,而不是CSS像素, 因为反映了网页页面的上下文环境,而不是它们内部CSS工作环境。

    媒体查询(The media query)

    device-width媒体查询以设备像素测量设备的宽度。width媒体查询以CSS像素测量页面宽度的总和,在iPhone上至少980px,具体原因且听后面分解。

    device-width媒体查询以下面的方式工作:

    01 div.sidebar {
    02     width300px;
    03 }
    04  
    05 @media all and (max-device-width320px) {
    06     // styles assigned when device width is smaller than 320px;
    07     div.sidebar {
    08         width100px;
    09     }
    10  
    11 }

    如今,侧边栏宽300CSS像素,除非当设备的宽度为320设备像素或者更小,这种情况下它会变为100CSS像素宽了(你还能更得上不?这个很复杂。)

    顺便说一句,理论上你可以使用厘米或者英寸(@media all and (max-device-9cm))单位的媒体查询来查询设备屏幕。不幸的是,它好像完全不支持,即使在iPhone上。问题是像英寸等物理单元通常要转换为(CSS)像素;因此迄今为止我所测试的所有浏览器上 1 in等于 96像素,所以这些媒体查询是不可靠的。

    <meta>标签(The<meta>tag)

    一般来说,<meta name="viewport" width="device-width">是相当有用的。这个标签起初是苹果专有的,但是同时也被很多手机浏览器所支持,事实上它使布局窗口与设备适应的十分好。

    如今布局窗口是什么呢?它是一块区域,浏览器使用宽度的百分比来计算元素的维数,例如 div.sidebar{ 20%}。它实际上比iPhone的980px, Opera的850px,Android的800px等设备屏幕还要大一点。

    如果你添加了<meta name="viewport" width="device-width">,那么这个布局窗口的宽度要受设备像素的设备宽度的限制; 在iPhone下,一般为320。

    这关系到你的页面是否足够小来与这个屏幕相适应。这个页面在没有任何CSS宽度设置和没有<meta>标签的情况下,它会铺满整个布局窗口全部可用的宽度。

    这可能并不是你所想要的。你想要的是文本在屏幕上适应的很好,这个当之无愧的要靠<meta name="viewport" width="device-width">了。当你将它添加到页面后,这个布局窗口会缩小(iPhone在这种情况下缩小到320px)了,然后文本就与屏幕相适应了。

    苹果的改变

    现在,苹果的分辨率的改变对device-width媒体查询以及<meta>标签有什么样的影响?当然我也不确定,但是我期望对于web开发者没有任何改变。

    <meta>标签

    <meta>标签最容易解释了。苹果有意发明它主要是为了允许人们能够让他们的内容与iPhone屏幕相适应,然后开发人员推出了它。也就是说它不能改变设备的宽度,因为它只是读出类容而已。

    事实上,Nexus One已经开发了一条新道路为Apple指明追随之路。它官方的屏幕宽度为480px(在portrait模式下),但是当你使用<meta>标签时,它只会使用屏幕的2/3宽度即320px。

    如果我理解得正确,这就是有关John Gruber所说的有关Nexus’s显示、它缺少的子像素和减少的1/3的像素的东西。这正符合了Nexus中有关<Meta>标签的解释。 

    所以,google已经插入了一层叫做DIPS(设备无关像素)的层。这个层是官方声明的,是将屏幕尺寸和Css像素报告给为Web开发人员。

    我期望新的Iphone能复制Nexus的这个把戏,当使用<Meta>时,只将屏幕尺寸报告为320像素(换句话所,正常尺寸的一半)。报一半而不是三分之二的目的是由于new Iphone的屏幕像素密度比Nexus(或其它设备)更高。

    媒体查询

    提供device-width的语句来解决这方面的问题。Nexus的屏幕宽度是480像素,实际上,320像素其实更为恰当。我们必须要Apple是怎么做的。

    最基本的问题是DIPS是否能在媒体查询使用,总的来说这个功能是我们非常需要的。通常的屏幕尺寸为web开发人员并不重要,我们想要知道的只是我们能在屏幕上显示多少内容。DIPS貌似看起来非常适合处理这个问题。

    可惜的是Nexus并没有提供这个功能,到目前为止媒体查询能使用的divice-width只能使用480像素,而不是320像素。但Apple也许能为web开发人员解决这个问题

    因此对于普通的网站来说,什么情况使用<Meta>标签已经十分清楚了。但对媒体查询还不是十分。

    继续收看.

  • 相关阅读:
    组合模式
    装饰者模式
    桥接设计模式
    Docker介绍
    适配器模式
    设计软件下载
    17种设计字体的创意方法
    less编译(mac版gulp)
    50种常用快捷键整理
    WebStorm设置手机测试服务器-局域网内其他设备访问
  • 原文地址:https://www.cnblogs.com/wbxjiayou/p/5168029.html
Copyright © 2011-2022 走看看