webView移动H5适配问题

ViewPort 移动开发前端得劲深入理解

1.ViewPort是什么

   一般来说,移动上的viewPort就是设备屏幕上能用来显示我们网页的那一块区域,但是,不局限于浏览器的可视区域的大小,可以比浏览器的可视区域大,也可以比浏览器的可视区域小,一般默认情况下,移动设备上的viewport都是大于浏览器的可视区域的。  


ul{list-style-type:none;margin:0;padding:0; float:left;clear:right; width:100%;}
li {display:inline;float:left ;width:60px; height:60px; background:#757575;border: solid 1px #ffffff;}
p{ text-align:center;color:#ffffff;}

  • iphone

  • ipad

  • AndroidSamsung

  • AndroidHTC

  • Chrome

  • operaPresto

  • BlackBerry

  • IE

  • 980

  • 980

  • 980

  • 980

  • 980

  • 980

  • 1024

  • 1024

2.Css中的1px与移动设备中的1px比较

   因为移动设备的分辨率不同,在桌面的浏览器Css中1px不等于设备的1px。早期,由于屏幕分辨率较低,1个Css像素有等于一个物理像素的,但是随着移动屏幕的像素密度越来越高,这导致了不同的设备对应的物理屏幕像素也不样。
   用户缩放会用心到Css中所代表的物理像素,如当放大一倍时,那么Css中1px代表的物理像素也会相应的增加一倍。反之,缩小也一样。
   在移动端以及桌面浏览器中,window对象有一个devicepixeratio属性,定义为设备物理像素与设备独立像素的比例,即 devicepixeRatio=物理像素/独立像素。

3.关于PPK的三个viewport的理论

关于PPK的三篇对viewport的地址:  
1.http://www.quirksmode.org/mobile/viewports.html  2.http://www.quirksmode.org/mobile/viewports2.html 3.http://www.quirksmode.org/mobile/metaviewport/
   由于viewport的可视区域有限,不会因为手机分辨率而增大,屏幕大小已经限制。所以为了让为桌面设计的网站在移动端浏览,所以浏览器默认将viewport设置为一个比较宽的值:980.这个由浏览器默认这只的viewport在ppk中称为:layout Viewport.  
   该值可以通过:document.documentElement.clientWidth获取。
   然而,layoutViewport的宽度是大于浏览器的宽度的。所以我们需要一个viewport来代表可视区域。(即一个为页面的实际大小,一个为可视大小)。而这个viewport则被称为visualViewPort.
   该值可以通过window.innerWidth获取。
   最后,还将为移动设备进行单独设计,可以完美适配于移动设备的Viewport(可以不需要用户进行缩放和横向滚动条就能正常查看网站的所有内容,文字字体大小无论在哪种分辨率下都是一样大小,图片等同上)。这个viewport就是IdealViewport  所有iphone的idealViewport宽度都是32opx,无论它的屏幕宽度是320还是640.也就是说,css中的320px就代表iphone屏幕的宽度。
   android的由于设备不一致,所以较为复杂,可以到http://viewportsizes.com上查看。

4.利用meta标签对viewport进行控制

    移动设备默认的viewport是layoutView,在实际开发过程中,我需要的是idealViewport。这就需要meta标签。   
    如:<meta name="viewport" content="width=device-width,initial-scale=1.0,maxnimum-scale=1.0,user-scalable=0">
    该标签的作用是让当前的viewport的宽度等于设备的刻度,且不允许用户手动缩放(这个看网站的要求)。
    metaview 最先是苹果公司在safari中引入,后来安卓可以兼容。具体的属性有:
    1.width:设置layoutviewport的宽度,为整数,或者字符串device-width
    2.initial-scale:设置初始的缩放值,为一个数字,可以带小数
    3.minimum-scale:用户允许的最小缩放值,为一个数字,可以带小数
    4.maximun-scale:允许用户的最大缩放值,为一个数字,可以带小数。
    5.height:设置layoutviewport的高度,这个高度不常用。
    6.user-scalable:允许用户进行缩放 值为yes/no
    7.(android特有)target-densitydpi: 值可以为一个数值或者high-肚皮,medium-dpi,low-dpi,device-dpi.当等于device-dpi时,css的像素与物理的像素相等。(android决定废用)
    注意:<meta name="viewport" content="windth=dvice-width">与<mate name="viewport" content="initial-scle=1">的效果都一样的,都是可以让当前的viewport宽度等于idealViewport  原因是缩放等于1,而缩放时基于idealViewport缩放的。所以是对ideal viewport进行100%缩放,就是等价于ideal viewport.综上,因此当width有具体值和initial-scle=1同时设置时,就会有冲突,默认去二者最大那个值。

### 5 关于缩放以及initial-scale的默认值
ideal viewport与缩放是相对的,如当缩放为1时,那么其viewport与ideal viewport等价。当缩放为2时,则viewport就缩小1倍。如之前为320,放大1倍,就是160。相当于实际宽度不变的情况下,1px变得与原来的2px的长度一样了。所以之前要320才能填满的宽度,现在160就可以填满了。
因此:visual viewport宽度(当前可视区域)=ideal viewport 宽度/当前缩放值。
注意:安卓自带的webkit浏览器只有在 initial-scale = 1 以及没有设置width属性时才是表现正常的,也就相当于这理论在它身上基本没用;而IE则根本不甩initial-scale这个属性,无论你给他设置什么,initial-scale表现出来的效果永远是1。

6.动态改变meta viewPort标签

1) 第一种方法
    可以通过document.write来动态输出输出viewport
    如: document.write('<mata name ="viewport" content ="width=device-eidth,initial-scale=1">')
2 第二种方法
    可以通过setattribute来改变
    如:
<meta id="testViewport" name="viewport" content="width = 380">
<script>
            var mvp = document.getElementById('testViewport');
            mvp.setAttribute('content','width=480');
</script>·
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值