移动端适配:viewport的浅谈!

一、先说下二种可以全局动态修改此标签属性的二种方法

    1、采用document.write();  它可以在没关闭流的时候,给页面增加东西。

;(function(){ 
	 document.write('<meta name="viewport" content="">');
})();

    2、采用先设定一个meta标签,然后用js改写此meta标签属性的方式,具体操作省略!

二、正式开始分析

       第一、忽略其他因素

       移动端的手机像素1px,不等于实际的1px。他们一般存在一个比率,而本文抛弃掉此影响,只用一个概念,即移动端的手机正常的屏幕可以容纳多少pc端页面的px值。

       第二、定义概念

        我们假设手机端存在2个视图,一个是手机屏幕能正常容纳的视图X,还有一个是手机浏览器实际容纳页面大小的视图Y。这个是毫无疑问的,比如你不设定任何值,1000px的pc端页面,会按比例被缩放成X视图,并且你可以放大出现滚动条,就好比手机屏幕内还有一个窗口一样。(亦或者pc浏览器你把横向的缩放条拉成一半,显示的就是手机屏幕,全部的就是实际容纳页面的大小。)

        第三、效果分析

        我们先来假设下viewport的默认值:在此前先看几个效果

        1.<meta name="viewport" content="width=1000, initial-scale=0.32"/>

           <meta name="viewport" content="width=1000"/>

           <meta name="viewport" content="width=500"/>

           <meta name="viewport" content="width=1600" />

        效果:前面3个可以达到不加此标签的效果。即1000px的网页缩放成300多px,网站全屏显示!最后一个有点特殊,不会显示全屏,在大约1500以内会全屏显示,而超过了1500,手机的Y视图会大于X视图。即有滚动条了。(自我解释,自动缩放时已经超过浏览器像素能适配的尺寸的比例!)

        2.<meta name="viewport" content="initial-scale=1"/>

         <meta name="viewport" content="width=1000,initial-scale=1 "/>

         <meta name="viewport" content="width=500,initial-scale=1 "/>

        <meta name="viewport" content="width=200,initial-scale=1 "/>

         <meta name="viewport" content="width=device-width,initial-scale=1 "/>

        效果:以上4个效果一样,X视图只能显示部分网站,Y视图宽为网站实际大小,即有缩放设置的情况,width值好像无效了,一直等于页面宽。

        根据1和2的效果:得出一个初步结论:当不设置initial-scale,手机会把width缩放成X视图的宽度,即全屏。当设置initial-scale,width一直等于页面的宽度,小于页面宽也是页面宽。

        第四、常用配置的分析

        下面看下一个常见的手机端网页的配置:

     <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />

           从我上面的假想初步结论可以得出:一个1000px的实际网站,用上面这个参数,会出现滚动条即1000的Y视图宽度,并且不能缩放。(结果成立!),那么假如一个开发页面尺寸为640的就不能采用这个配置(响应式布局除外)。

          这种情形,我在网上搜到一个配置:来套用下理论,看下是否合适!

<script type="text/javascript">
        var phoneWidth =  parseInt(window.screen.width); //手机屏幕宽
        var phoneScale = phoneWidth/640; //屏幕/页面尺寸
        var ua = navigator.userAgent;
        if (/Android (\d+\.\d+)/.test(ua)){ //安卓
            var version = parseFloat(RegExp.$1);
            if(version>2.3){ //>2.3
                document.write(‘<meta name="viewport" content="width=640, minimum-scale = ‘+phoneScale+‘, maximum-scale = ‘+phoneScale+‘, target-densitydpi=device-dpi">‘);
            }else{ 
                document.write(‘<meta name="viewport" content="width=640, target-densitydpi=device-dpi">‘);
            }
        } else {
            document.write(‘<meta name="viewport" content="width=640, user-scalable=no, target-densitydpi=device-dpi">‘);
        }
    </script>

        1):苹果手机和安卓手机2.3以下,只要设置一个宽度就可以了,即这个宽度为开发页面的宽度,而不设置缩放比例,那么640就会在各型手机上缩放成全屏合适的比例,并且设置不能用户缩放。

        2):安卓的新版本,手工设置比例来控制,疑问来了,我测试的就是安卓版本,手机自己缩放也是这个比例啊,那么为什么要这样写呢?  注意这个比率的计算,不是控制initialScale(上面没设置),而是把max和min的值设置成一个统一值,达到user-scalable(上面没设置)的效果!

   

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值