关于viewport

作者: Joazer | 来源:发表于2018-04-07 21:44 被阅读0次
    概念:

    移动设备上的viewport就是设备的屏幕上能用来显示我们的网页的那一块区域

    物理像素(physical pixel)

    一个物理像素是显示器(手机屏幕)上最小的物理显示单元,在操作系统的调度下,每一个设备像素都有自己的颜色值和亮度值。

    设备独立像素(density-independent pixel)

    设备独立像素(也叫密度无关像素),可以认为是计算机坐标系统中得一个点,这个点代表一个可以由程序使用的虚拟像素(比如: css像素),然后由相关系统转换为物理像素。

    所以说,物理像素和设备独立像素之间存在着一定的对应关系,这就是接下来要说的设备像素比。

    设备像素比(device pixel ratio )

    设备像素比(简称dpr)定义了物理像素和设备独立像素的对应关系,它的值可以按如下的公式的得到:

    设备像素比 = 物理像素 / 设备独立像素 // 在某一方向上,x方向或者y方向
    在javascript中,可以通过window.devicePixelRatio获取到当前设备的dpr。
    
    

    在css中,可以通过-webkit-device-pixel-ratio,-webkit-min-device-pixel-ratio和 -webkit-max-device-pixel-ratio进行媒体查询,对不同dpr的设备,做一些样式适配(这里只针对webkit内核的浏览器和webview)。

    ppk认为,移动设备上有三个viewport。
    layout viewport:
    ppk把这个浏览器默认的viewport叫做 layout viewport。这个layout viewport的宽度可以通过 document.documentElement.clientWidth 来获取。
    
    layout viewport 的宽度是大于浏览器可视区域的宽度的
    
    
    visual viewport:
    layout viewport 的宽度是大于浏览器可视区域的宽度的,所以我们还需要一个viewport来代表 浏览器可视区域的大小,ppk把这个viewport叫做 visual viewport。visual viewport的宽度可以通过window.innerWidth 来获取,但在Android 2, Oprea mini 和 UC 8中无法正确获取。
    
    
    ideal viewport:
    ppk把这个viewport叫做 ideal viewport,也就是第三个viewport——移动设备的理想viewport。
    
    

    利用meta标签对viewport进行控制:

    属性 描述
    width 设置layout viewport 的宽度,为一个正整数,或字符串"width-device"
    initial-scale 设置页面的初始缩放值,为一个数字,可以带小数
    minimum-scale 允许用户的最小缩放值,为一个数字,可以带小数
    maximum-scale 允许用户的最大缩放值,为一个数字,可以带小数
    height 设置layout viewport 的高度,这个属性对我们并不重要,很少使用
    user-scalable 是否允许用户进行缩放,值为"no"或"yes", no 代表不允许,yes代表允许
    target-densitydpi 值可以为一个数值或 high-dpi 、 medium-dpi、 low-dpi、 device-dpi 这几个字符串中的一个(在安卓中还支持 target-densitydpi 这个私有属性,它表示目标设备的密度等级,作用是决定css中的1px代表多少物理像素)
    把当前的viewport宽度设置为 ideal viewport 的宽度:

    要把当前的viewport宽度设为ideal viewport的宽度,既可以设置 width=device-width,也可以设置 initial-scale=1,但这两者各有一个小缺陷,就是iphone、ipad以及IE 会横竖屏不分,通通以竖屏的ideal viewport宽度为准。所以,最完美的写法应该是,两者都写上去,这样就 initial-scale=1 解决了 iphone、ipad的毛病,width=device-width则解决了IE的毛病:

    <meta name="viewport" content="width=device-width, initial-scale=1">
    
    
    关于meta viewport的更多知识:
    visual viewport宽度 = ideal viewport宽度  / 当前缩放值
    
    当前缩放值 = ideal viewport宽度  / visual viewport宽度
    
    

    initial-scale的默认值应该是 0.33这样子。当你指定了initial-scale的值后,这个默认值就不起作用了。

    在iphone和ipad上,无论你给viewport设的宽的是多少,如果没有指定默认的缩放值,则iphone和ipad会自动计算这个缩放值,以达到当前页面不会出现横向滚动条(或者说viewport的宽度就是屏幕的宽度)的目的。

    动态改变meta viewport标签:
    1. 可以使用document.write来动态输
    出meta viewport标签,例如:
    document.write('<meta name="viewport" content="width=device-width,initial-scale=1">')
    
    
    1. 通过setAttribute来改变:
    <meta id="testViewport" name="viewport" content="width = 380">
    <script>
    var mvp = document.getElementById('testViewport');
    mvp.setAttribute('content','width=480');
    </script>
    

    参考链接:

    移动前端开发之viewport的深入理解

    移动端高清、多屏适配方案

    相关文章

      网友评论

        本文标题:关于viewport

        本文链接:https://www.haomeiwen.com/subject/zvruhftx.html