viewport 学习

(一)viewport概念

(1)viewport写法
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no" http-equiv="Content-Type" charset="utf-8"/>

(2)layout viewport
ppk认为浏览器默认的viewport叫做 layout viewport。
这个layout viewport的宽度可以通过 document.documentElement.clientWidth 来获取。

(3)layout viewport

layout viewport的宽度是大于浏览器可视区域的宽度的,所以我们还需要一个viewport来代表 浏览器可视区域的大小,
ppk把这个viewport叫做 visual viewport。
visual viewport的宽度可以通过window.innerWidth 来获取,但在Android 2, Oprea mini 和 UC 8中无法正确获取。


(4)ideal viewport

ppk把这个viewport叫做 ideal viewport,也就是第三个viewport——移动设备的理想viewport。


(5)利用meta标签对viewport进行控制

在苹果的规范中,meta viewport 有6个属性(暂且把content中的那些东西称为一个个属性和值),如下:

  width 设置layout viewport 的宽度,为一个正整数,或字符串"width-device"
  initial-scale 设置页面的初始缩放值,为一个数字,可以带小数
  minimum-scale 允许用户的最小缩放值,为一个数字,可以带小数
  maximum-scale 允许用户的最大缩放值,为一个数字,可以带小数
  height 设置layout viewport 的高度,这个属性对我们并不重要,很少使用
  user-scalable 是否允许用户进行缩放,值为"no"或"yes", no 代表不允许,yes代表允许
这些属性可以同时使用,也可以单独使用或混合使用,多个属性同时使用时用逗号隔开就行了。

(6)把当前的viewport宽度设置为 ideal viewport 的宽度

要得到ideal viewport就必须把默认的layout viewport的宽度设为移动设备的屏幕宽度。
因为meta viewport中的width能控制layout viewport的宽度,所以我们只需要把width设为width-device这个特殊的值就行了。

<meta name="viewport" content="width=device-width">

(7)关于缩放问题
visual viewport宽度 = ideal viewport宽度 / 当前缩放值

当前缩放值 = ideal viewport宽度 / visual viewport宽度
ps: visual viewport的宽度指的是浏览器可视区域的宽度。

 

(二)动态改变meta viewport标签

第一种方法

可以使用document.write来动态输出meta viewport标签,例如:
document.write('<meta name="viewport" content="width=device-width,initial-scale=1">');

第二种方法

通过setAttribute来改变

<meta id="testViewport" name="viewport" content="width = 380">
<script>
var mvp = document.getElementById('testViewport');
mvp.setAttribute('content','width=480');
</script>

这里证明,html任何一个标签都能使用id作为选择器。

安卓2.3自带浏览器上的一个bug

复制代码
<meta name="viewport" content="width=device-width">

<script type="text/javascript">
alert(document.documentElement.clientWidth); //弹出600,正常情况应该弹出320
</script>

<meta name="viewport" content="width=600">

<script type="text/javascript">
alert(document.documentElement.clientWidth); //弹出320,正常情况应该弹出600
</script>
复制代码
测试的手机ideal viewport 宽度为320px,第一次弹出的值是600,但这个值应该是第行meta标签的结果啊,
然后第二次弹出的值是320,这才是第一行meta标签所达到的效果啊,所以在安卓2.3(或许是所有2.x版本中)的自带浏览器中,
对meta viewport标签进行覆盖或更改,会出现让人非常迷糊的结果


原文:http://www.cnblogs.com/2050/p/3877280.html

 

附一段 viewport 初始化代码

(function () {

    var win = window,
        doc = win.document,
        docEl = doc.documentElement,
        ua = win.navigator.userAgent,
        metaA = docEl.querySelector('meta[name="viewport"]'),
        isIOS = ua.match(/iphone/gi),
        scale, dpr;

    if (isIOS) {

        dpr = win.devicePixelRatio;
        dpr = dpr >= 3 ? 3 : dpr >= 2 ? 2 : 1;
        scale = (1 / dpr).toFixed(2);

        docEl.setAttribute('data-dpr', dpr);
        docEl.setAttribute('ios', 'true');

        if (!metaA) {
            metaA = doc.createElement('meta');
        }

        metaA.setAttribute('name', 'viewport');
        metaA.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');

        if (!metaA) {
            if (docEl.firstElementChild) {
                docEl.firstElementChild.appendChild(metaA);
            } else {
                var div = doc.createElement("div");
                div.appendChild(metaA);
                doc.write(div.innerHTML);
            }
        }

        win.dpr = dpr;
    }
})();

  

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/hgonlywj/p/4966804.html