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

聊一聊移动web分辨率的重要事项

篇首语:本文由编程笔记#小编为大家整理,主要介绍了聊一聊移动web分辨率的那些事儿相关的知识,希望对你有一定的参考价值。不同于PC时代,移动web的样式更加多样,也由于手

篇首语:本文由编程笔记#小编为大家整理,主要介绍了聊一聊移动web分辨率的那些事儿相关的知识,希望对你有一定的参考价值。


不同于PC时代,移动web的样式更加多样,也由于手机分辨率的碎片化,移动web的兼容问题日益突出,下面,我就和各位读者一起聊聊移动web所面临的手机分辨率问题。


1 PC到移动,渲染的变迁


在PC时代,我们书写CSS的时候,理所应当的认为,我们所书写的1px,在屏幕上就是1px的宽度。


但是到了移动端,事情就不是这样了,我们所书写的1px,其实到了屏幕上,可能是2px,可能是3px。甚至是你想多少px就多少px。这是为什么呢?让我们来说一个故~事~~~


苹果发布ios的时候,肯定会想到成千上万的PC网页,没法在自己的IOS系统上运行起来时间多么蛋疼的事情啊。但是呢,这些网页都是按照PC屏幕的大小写的呀。


动不动就出现两个500多px的宽的div并列。这在当时640*960屏幕大小的iphone4上显示的话,简直是毁灭性的。(会各种折行,样式错乱),那么细致如苹果肯定不允许这种事情发生。


于是苹果公司的攻城狮们想出了一个歪招,那就是告诉浏览器,“你在一个980宽的大屏幕下在渲染呢”,浏览器就按照了980宽的方式,渲染出来页面图像。可是到了浏览器这边,其实是拿到了一张渲染好的、比屏幕大的网页图像。此时,苹果再把这张图像,缩放一下,缩为屏幕大小。(我们平时也经常这样干,把一张大图片用双指放大缩小)


在手机上观察segmentfault的电脑版,正式这样的(如图1.1)



图1.1


2 可以更改的布局宽度


上面所说的浏览器就按照了980宽的方式,渲染出来页面图像。浏览器的渲染依据,我们就称为layout viewport。其实我们可以指定欺骗浏览器的宽度是多少。


比如,我们默认的viewport宽度是980px,我们写了一个宽度为480的div,显示在网页上的时候,是这样(如图1.2.1所示): 


<html>

   

   

测试


聊一聊移动web分辨率的那些事儿
图1.2.1


如果我们书写viewport标签,让其布局的时候,告诉浏览器,自己是一个宽度为480的小屏幕,又会怎样呢?(如图1.2.2所示)


   

   

   

测试


聊一聊移动web分辨率的那些事儿
图1.2.2


此时,浏览器就真的按照宽度为480的样子去渲染了。这就是viewport的魅力。这个viewpor的宽度是任我们更改的,究竟更改到多少才算合适呢?


大多数网站采取的方式是


utf-8" />

   

   

   

测试


聊一聊移动web分辨率的那些事儿
图1.2.3


3 再次变迁的像素


时代是在变迁的,iphone也不例外,iphone3的像素为320480,然而到了iphone4,虽然屏幕不曾变大,但是像素密度大大增加,变为了640960,总不能把之前设计的网页都缩小一倍显示吧?所以苹果公司的老司机们就又开车了。


iphone4对浏览器说,“我的宽度是320px”,其实iphone4是640px。我们按照320px的设计得以渲染,而到了真实的世界中,我们写的1px的元素,其实是化为2px渲染到用户面前的。有的同学可能会说,这不是把之前的网页变大了吗?


nonono,别忘了,手机的大小并没有变,只不过是物理世界上的1英寸,上面的像素点数更多了。以前1px的屏幕像素点,展现在人眼面前是1/96英寸,像素密度变为两倍后,一个像素的宽度是1/962英寸。那么两个像素就是21/(96*2)=1/96英寸。物理世界上的宽度又变回来了。


换句话说,虽然像素变大了,但是10px的图片在iphone3与iphone4上看起来是一样大的。


在这里,我们已经学会了两个知识点:


1. 320px的逻辑分辨率,对于我们来说,无论是iphone3gs还是iPhone4,我们都照着320px去写代码就好了,这是我们的逻辑。


2. 320px/640px的物理分辨率,对于苹果手机来说,iphone3gs,他就真的按照320px去显示,640px的iPhone4,它就将我们写的逻辑分辨率乘以2再显示。这就是为什么iphone4上面物理分辨率是逻辑分辨率的两倍的缘故了。UE给你的图,你除以2去写代码就好了。


4. 又一次变迁


苹果公司在2014年,推出了新一代的iphone6/iphone6 plus,他们的屏幕都比iphone4要宽、要大。所以,再维持原来的320宽度方法,显然不行了。所以,苹果公司按照手机尺寸的比例,上调了分辨率:


4.1 iphone6的普通扩大


我们看到上图,iphone6的宽为750px,iphone4的宽为640px(物理分辨率),比例应该是:750/640。


iphone6的逻辑分辨率的宽是375px,iphone4的逻辑分辨率的宽为320px,比例是:375/320。


750/640 == 375/320,所以,苹果公司只是把手机普普通通的扩大了一点而已。顺便把逻辑分辨率也扩大了。并不影响我们的书写。


4.2 iphone6 plus的扩大高清度


这次升级,最蛋疼的点就是iphone6 plus了,苹果公司希望更高清的屏幕,于是他们再一次施展大法,一块5.5英寸的屏幕上,竟然容得下宽度1080的像素点数量。


但是,苹果的老司机们又犯难了,该如何“欺骗浏览器”呢?这次是朝着3倍的方向压缩的。即1个逻辑像素对应3个物理像素。但是,事实根本不是这样,他们只在与iphone4同样宽度的屏幕上,渲染出2.6个像素点,iphone4渲染出2个,iphone3gs渲染出1个。


所以,按照我们之前的理论,是不是逻辑像素就应该是1080/2.6呢。的确是的,1080/2.6~=414px,所以,我们的逻辑分辨率就被定格在了414*736。


但是!2.6这个比例太蛋疼了,苹果是真心想让我们相信它家的屏幕好呀,于是苹果公司再一次施展欺骗大法,它让我们认为,他的屏幕是12422208的超级高清屏幕。于是,好像是在与iphone3同样的1px的屏幕尺寸里面,塞下了3个像素点。于是我们用1242除以3,还是得到了我们的逻辑分辨率:414px。而且,UE(设计师)们出一张1242的图片,工程师们将其除以3,远比UE们出一张1080px的图片,工程师将其除以2.6要爽得多。试想一下,除以2.6好算还是除以3好算?但是,iphone6s plus,实际的渲染是1080px,咋整?缩放呗,于是被浏览器渲染好的12422208的图像,被iphone6s plus给缩放成了1080*1920(就好像我们用手指头缩放过的图片一样)


这个3倍还是2倍的比例,前端可以从浏览器中获取:window.devicePixelRatio


结论就是,iphone6s plus,我们可以认为,它的物理分辨率是逻辑分辨率的三倍就好了,UE给你的图,你除以3去写代码就好了。


几代iphone手机的分辨率如图4.2.1所示:


聊一聊移动web分辨率的那些事儿图4.2.1


根据上述,我们的出结论,虽然一样的逻辑像素,在iphone6上面和在iphone6 plus上面也是不一致的,因为iphone6 plus会对其渲染后的图像进行缩放。


iphone6下


1px的逻辑像素 === 2px的真的物理像素 === 2px *63.5px/326ppi === (1/64)cm


然后是iphone6 plus:(注意,这里面的ppi使用1080的真实物理尺寸算的)


1px的逻辑像素 === 3px的,我们以为是3px的物理像素 === 31080/1242 的真的物理像素 === 2.6px 63.5px/401ppi ===(2.6/157)cm


这样看来,在iphone6s plus 和iphone6 plus下,在真实世界的显示上面,尺寸会比iphone6/iphone5等,大1.15倍左右,经测量(拿尺子量的),的确是有这样的倍数关系。


5 是时候说说安卓了


苹果的变迁史我们说完了,是时候说说更乱的安卓了。其实,了解完了苹果的机制,安卓的也并不难理解,这些零散的安卓设备,他们也都采用了物理像素是逻辑像素N倍的设计方法,当然,这个N是多少,就要看安卓的制造厂商了。总之,我们在安卓上的代码,也是按照逻辑像素渲染的。


6 课后问题


聪明的你,知道如何描述什么是逻辑分辨率,什么是物理分辨率了吗?


可能您感兴趣的内容!

聊一聊移动web分辨率的那些事儿














前端圈--打造专业的前端技术会议


为web前端开发者提供技术分享和交流的平台


打造一个良好的前端圈生态,推动web标准化的发展


官网:http://fequan.com





投稿:content@fequan.com

赞助合作:apply@fequan.com



推荐阅读
  • 如何高效创建和使用字体图标
    在Web和移动开发中,为什么选择字体图标?主要原因是其卓越的性能,可以显著减少HTTP请求并优化页面加载速度。本文详细介绍了从设计到应用的字体图标制作流程,并提供了专业建议。 ... [详细]
  • PHP 5.5.0rc1 发布:深入解析 Zend OPcache
    2013年5月9日,PHP官方发布了PHP 5.5.0rc1和PHP 5.4.15正式版,这两个版本均支持64位环境。本文将详细介绍Zend OPcache的功能及其在Windows环境下的配置与测试。 ... [详细]
  • 本题探讨如何通过最大流算法解决农场排水系统的设计问题。题目要求计算从水源点到汇合点的最大水流速率,使用经典的EK(Edmonds-Karp)和Dinic算法进行求解。 ... [详细]
  • 本章将深入探讨移动 UI 设计的核心原则,帮助开发者构建简洁、高效且用户友好的界面。通过学习设计规则和用户体验优化技巧,您将能够创建出既美观又实用的移动应用。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 在使用 MUI 框架进行应用开发时,开发者常常会遇到 mui.init() 和 mui.plusReady() 这两个方法。本文将详细解释它们的区别及其在不同开发环境下的应用。 ... [详细]
  • 高效解决应用崩溃问题!友盟新版错误分析工具全面升级
    友盟推出的最新版错误分析工具,专为移动开发者设计,提供强大的Crash收集与分析功能。该工具能够实时监控App运行状态,快速发现并修复错误,显著提升应用的稳定性和用户体验。 ... [详细]
  • 并发编程:深入理解设计原理与优化
    本文探讨了并发编程中的关键设计原则,特别是Java内存模型(JMM)的happens-before规则及其对多线程编程的影响。文章详细介绍了DCL双重检查锁定模式的问题及解决方案,并总结了不同处理器和内存模型之间的关系,旨在为程序员提供更深入的理解和最佳实践。 ... [详细]
  • 使用GDI的一些AIP函数我们可以轻易的绘制出简 ... [详细]
  • 作为一名专业的Web前端工程师,掌握HTML和CSS的命名规范是至关重要的。良好的命名习惯不仅有助于提高代码的可读性和维护性,还能促进团队协作。本文将详细介绍Web前端开发中常用的HTML和CSS命名规范,并提供实用的建议。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本题涉及一棵由N个节点组成的树(共有N-1条边),初始时所有节点均为白色。题目要求处理两种操作:一是改变某个节点的颜色(从白变黑或从黑变白);二是查询从根节点到指定节点路径上的第一个黑色节点,若无则输出-1。 ... [详细]
  • 解决JAX-WS动态客户端工厂弃用问题并迁移到XFire
    在处理Java项目中的JAR包冲突时,我们遇到了JaxWsDynamicClientFactory被弃用的问题,并成功将其迁移到org.codehaus.xfire.client。本文详细介绍了这一过程及解决方案。 ... [详细]
  • 配置Windows操作系统以确保DAW(数字音频工作站)硬件和软件的高效运行可能是一个复杂且令人沮丧的过程。本文提供了一系列专业建议,帮助你优化Windows系统,确保录音和音频处理的流畅性。 ... [详细]
author-avatar
ni是我的另一半
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有