Viewport :字面意思为视图窗口,在移动 web 开发中使用。表示将设备浏览器宽度虚拟成一个特定的值(或计算得出),这样利于移动 web 站点跨设备显示效果基本一致。
基本写法:
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1,target-densitydpi=medium-dpi">
测试获取 viewport 的 width :
document.documentElement.clientWidth
1、在 iphone 上是读取 device-width 的值,并自动计算出 target-densitydpi 去适配,在 iphone4 上读取的值为 320  。
最终的计算公式为:
当 initial-scale=1 时:
ViewportWidth=width  ;
当 initial-scale !=1 时:
ViewportWidth=width  >  320 / initial-scale ? Width : 320 / initial-scale ;
ViewportWidth 不超过 1280 ,大于取 1280  。
2、在 android 上,读取的是 target-densitydpi  。在不设置的情况下,默认选择的是 medium-dpi(160)  。以下讨论均在中屏幕大小的手机上范围内:
Dpi 的分级与其对应的代表分辨率:
Low-dpi:240*320 (基本淘汰,暂不讨论)
Medium-dpi:320*480
High-dpi:480*800
Super high-dpi:640*960   其对应的 dpi 为 120 、 160 、 240 、 320  。
实验一:对 480*800 设置 dpi 为 medium-dpi ,其 viewport 为 320 ;设为 high-dpi  ,其 viewport 为 480 ;设为 device-dpi  ,其 viewport 为 480 ;
实验二:对 540*800 设置 medium-dpi , viewport 为 360 ;设为 high-dpi  ,其 viewport 为 540 ;设为 device-dpi  ,其viewport 为 540 ;设为 low-dpi  ,其 viewport 为 270 ;
总结:从上面两个实验可得出:
当设备为 high-dpi 设备时,设置为中分辨率的 viewportwidth 为( 2/3 ) *device-width ;设置为 low-dpi 时,为( 1/2 )*device-width 。这个比例和其 dpi 的比例是一致的, 2/3=160/240 和 1/2=120/240 ;
推测 dpi 的值与 viewportwidth 存在一元关系。
①假设我要做一个 android high-dpi 设备应用,虚拟的 viewportwidth 定死为 320px 。
设 device-width=x ,( 2/3 ) *x 为该设备设为 medium-dpi 时 viewportwidth 的值, x/240 表示一个 dpi 值代表多少个 px 。
Target-densitydpi=160 - { ( 2/3 ) *x-320}/(x/240);
简化一下: Target-densitydpi=320*240/x ;
实验三:在 540 手机上设置 Target-densitydpi=142 ,其 viewport 为 320  。
根据以上公式可以计算出 Target-densitydpi=142.222222 ,与上面测试数据一致。
②假设我要做一个 android super-high-dpi 设备应用,虚拟的 viewportwidth 定死为 320px 。
Target-densitydpi=320*320/x ;
此公式未进行试用期验证。
③假设我要做一个 android medium-dpi 设备应用,虚拟的 viewportwidth 定死为 320px 。
Target-densitydpi=160 - {x-320}/(x/160);
Target-densitydpi=320*160/x
实验成功
④假设我要做一个 android low-dpi 设备应用,虚拟的 viewportwidth 定死为 320px 。
Target-densitydpi=160 - { ( 4/3 ) x-320}/(x/120);
Target-densitydpi=320*120/x
此公式未进行试用期验证。
特例: htcA510E :在 width 设有具体值时,会读取 width ,忽略 dpi 。
联想 K1 pad  不读取 dpi ,只读取 width ,而且当 width 小于等于 320 的时候忽视,直接取 device-width 。
3、htc input 缩放问题。当 viewport 的值大于 device-width 时,会出现 input 获取焦点放大。所以在设计中选择基于 320 分辨率( 240 设备淘汰不讨论),出图基于 640 ,图片 0.5 缩放保证清晰度。

总结,在开发时最好基于320宽进行开发,图片基于640做,在放置图片时可以用background-size或zoom缩放一倍,图片在高清晰屏上就不会模糊。在加载页面时通过读取设备的width去计算dpi然后动态生成meta标记,可以很好解决手机的分辨率适配问题。但是在android pad端上不适用,原因有二,一、pad对width是计算还是读取比较混乱,有些像ios,有些读dpi,还有的两个都读,然后分段比较。二、pad的高中低dpi分档和手机不一样,没有统一标准

移动端 设计与开发经验之ViewPort的更多相关文章

  1. 浅谈移动端中的视口(viewport)

    在 PC 端,视口指的是浏览器的可视区域,其宽度和浏览器窗口的宽度保持一致.在 CSS 标准文档中,视口也被称为初始包含块,它是所有 CSS 百分比宽度推算的根源,给 CSS 布局限制了一个最大宽度. ...

  2. H5 端 rem 适配方案与 viewport 适配

    H5 端 rem 适配方案与 viewport 适配 rem rem 是 CSS3 新增的一个相对单位(root em,根 em) 只根据当前页面 HTML 页面的 font-size 设置,如果根目 ...

  3. TYPESDK手游聚合SDK服务端设计思路与架构之一:应用场景分析

    TYPESDK 服务端设计思路与架构之一:应用场景分析 作为一个渠道SDK统一接入框架,TYPESDK从一开始,所面对的需求场景就是多款游戏,通过一个统一的SDK服务端,能够同时接入几十个甚至几百个各 ...

  4. 移动端布局最佳实践(viewport+rem)

    通过前几天写的两篇博客(浅谈移动端三大viewport和移动端em和rem区别),我们现在来总结一下如何实现一个最佳方案. 之前在第二篇博客中提到过我们可以使用媒体查询来针对不同设备及做适配,如下图 ...

  5. h5 移动端开发自适应 meta name="viewport"的使用总结

    本文系个人理解,可能有误差,仅供参考,谨慎采纳! 布局视口: 系统自带 一般大于屏幕宽度 理想宽度:  设置页面的viewport 的一个宽度,使不同的手机的布局视口宽度尽量接近可视窗口的值: 可视视 ...

  6. TYPESDK手游聚合SDK服务端设计思路与架构之二:服务端设计

    在前一篇文中,我们对一个聚合SDK服务端所需要实现的功能作了简单的分析.通过两个主要场景的功能流程图,我们可以看到,作为多款游戏要适配多个渠道的统一请求转发中心,TYPESDK服务端主要需要实现的功能 ...

  7. TYPESDK手游聚合SDK服务端设计思路与架构之四:流程优化之信息安全与订单校验

    有了前文几个步骤的分析和设计,TYPESDK的信息交互流程已经可以正常工作了,但是,这个流程还没有考虑到支付这样的过程中,至关重要的信息安全问题. 在整个交互过程中,游戏服务端,SDK服务端,渠道服务 ...

  8. TYPESDK手游聚合SDK服务端设计思路与架构之三:流程优化之订单保存与通知

    经过前两篇文字的分析与设计,我们已经可以搭建出一个能够支持多游戏多渠道的聚合SDK服务端,但这只是理想化状态下的一个简化模型.如果接入渠道的逻辑都是按照理想化的简化过程来构建,那么对于支付的请求,我们 ...

  9. 移动APP服务端设计开发注意要点

    2014年,移动APP的热度丝毫没有减退,怎么为您的移动端app设计良好的服务器端接口(API)呢? 下面谈谈我个人的一些想法. 2014年,移动APP的热度丝毫没有减退,并没有像桌面软件被WEB网站 ...

随机推荐

  1. Linux下第一次使用MySQL数据库,设置密码

    在终端下输入:/etc/rc.d/init.d/mysqld status 查看MySQL状态,看看是否运行. 没有运行的话就输入:/etc/rc.d/init.d/mysqld start 这时,就 ...

  2. 多图上传 - Web Uploader

    http://fex.baidu.com/webuploader/   官方DEMO,我都不想说了,各种问题.参考ShuaiBi文章   http://www.cnblogs.com/ismars/p ...

  3. JS添加MD5,JS提示框

    http://pan.baidu.com/s/1kTmSp9t

  4. Eclipse 快捷键 转换为Netbeans 快捷键

    一直使用netbeans IDE开发,习惯了netbeans的快捷键,最近要开发个app就选择了H5. 接着使用了HBuilder (基于Eclipse开发) 总体来讲这个IDE还可以,不管是代码提示 ...

  5. Python 打开目录与指定文件

    Python打开外部文件有很多方法, os.popen打开外部程序,但发现只能打开文件所在目录的文件 os.system可打开外部文件os.system(command) command 要执行的命令 ...

  6. 【转载】 Python动态生成变量

    用Python循环创建多个变量, 如创建 a1=   .a2=   .a3=   .a4=   .a5=    或  self.a1=    .self.a2=   . self.a3= 一. 可以通 ...

  7. Linux环境下使用perl编写CGI(httpd)

    例子1: /var/www/cgi-bin/hello.cgi #!/usr/bin/perl print "Content-type: text/html\n\n"; print ...

  8. .NET yield

    .Net Yield 其实比较简单,手动yield,一学就会. public static class GalaxyClass { public static void ShowGalaxies() ...

  9. (五)WebRTC手记Channel概念

    转自:http://www.cnblogs.com/fangkm/p/4401075.html 前面两篇博文完整地介绍了WebRTC音视频的采集模块,接下来应该开始介绍关键的音视频编码模块.不过在介绍 ...

  10. ubuntu kylin中如何截图

    windows操作系统中,我通常使用的截图工具是QQ的“ctrl+alt+a”快捷键.但是在ubuntu中,linux qq常年不更新,我也就彻底放弃了使用了,反正ubuntu通常只是拿来开发.其实没 ...