移动端页面按手机屏幕分辨率自动缩放的js

简介:
1
<script> 2      var  phoneWidth = parseInt(window.screen.width); 3      var  phoneHeight = parseInt(window.screen.height); 4      var  phoneScale = phoneWidth/750; //除以的值按手机的物理分辨率 5     var ua = navigator.userAgent; 6     if (/Android (\d+\.\d+)/.test(ua)) { 7         var version = parseFloat(RegExp.$1); 8         // andriod 2.3 9         if (version > 2.3) {10             document.write('<meta name="viewport" content="width=device-width,initial-scale='+phoneScale+',minimum-scale='+phoneScale+',maximum-scale='+phoneScale+',user-scalable=no">');11             // andriod 2.3以上12         } else {13             document.write('<meta name="viewport" content="width=device-width,user-scalable=no">');14         }15         // 其他系统16     } else {17         document.write('<meta name="viewport" content="width=device-width, initial-scale='+phoneScale+',minimum-scale='+phoneScale+',maximum-scale ='+phoneScale +',user-scalable=no,">');18     }19 </script>

做手机端页面最头疼的就是物理分辨率和逻辑分辨率的转换了,当拿到设计图的时候,图基本都是按物理分辨率来设计的,一般常用的为640(iphone5/5s)、750(iphone6/6s),而谷歌等浏览器采用小手机模式浏览页面的时候,上面的值为逻辑分辨率,调试的时候很难把控页面样式,在手机端的样式也会因此大乱,在页面头部加入以上一段js之后,在手机端就可以正常显示了,

var phoneScale = phoneWidth/750;

除以的为设计图设计的页面宽度,750是按iphone6来设计(根据自己使用需求来修改),即让页面的 放大比率=屏幕的逻辑分辨率/物理分辨率,从而达到适应手机的效果。

(注意,有时候页面加了这段代码在调试的时候,切记刷新,刷新过后就会按手机缩放比例显示)

概念解析:

 

phys.width:一般我们所指的宽度width即为phys.width,物理宽度(物理分辨率

 

device-width:又称为css-width,设备宽度(逻辑分辨率

 

其中我们可以获取phys.width通过document.documentElement.clientWidth;

而获取css-width通过 window.screen.width获取。

所以这里  phoneWidth逻辑分辨率 = parseInt(window.screen.width);

iphone6phys.width750px,而css-width375px

 

 

 

明白一个浏览器默认行为。

 

试想,浏览器如果把电脑端的980px的网页展现在宽度为750pxiphone6手机屏上,势必会放不下,手机端横向会出现滚动条,怎么阻止这种情况呢,很简单,浏览器默认一个虚拟窗口,不同浏览器有不同的虚拟窗口宽度的默认值如:safari iphone980px;

 

opera:850px;

Andriod webkit:800px;

IE:974px;

然后会把这个980px虚拟窗口装进宽度为750pxiphone6中,当然这样的话必须缩放,这就是为什么在手机中展现电脑端页面没有出现横向滚动条,而且字迹明显变小的原因。

 

initial-scale='+phoneScale+',minimum-scale='+phoneScale+',maximum-scale='+phoneScale+'

这段代码切记要指定 initial-scale=***,在安卓系统中,不指定默认的nitial-scale=***,只指定最小和最大缩放值,也可以正常显示,但是safari浏览器则会失效,对于宽度是100%的页面, 则显示为页面的30%左右的宽。

 

target-densitydpi=device-dpi

 

WebKit内核默认按照160DPI来排版。假如设备真实DPI480,宽度是1080,在WebKit会按160DPI360宽度来排版。排版结束后在放大到1080宽。

所以当取window.innerwidth之类的值的时候,取的是WebKit实际排版宽度360,而不是1080.

target-densitydpi=device-dpi可以强制内核以480DPI排版,使画面更精细,window.innerwidth也将为屏幕宽度1080.

WebKit从去年开始取消了对target-densitydpi的支持。(所以现在不建议写该属性了)

想实现target-densitydpi=device-dp

i的效果有什么方法?提交此次补丁的WebKit开发者说可以用responsive images  CSS device units来替代。



本文转自 蓓蕾心晴 51CTO博客,原文链接:http://blog.51cto.com/beileixinqing/1880406,如需转载请自行联系原作者

相关文章
|
13天前
|
JavaScript 前端开发 容器
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
AJAX载入外部JS文件到页面并让其执行的方法(附源码)
16 0
|
1月前
|
JavaScript 前端开发 Java
springboot从控制器请求至页面时js失效的解决方法
springboot从控制器请求至页面时js失效的解决方法
15 0
springboot从控制器请求至页面时js失效的解决方法
|
1月前
|
Web App开发 前端开发 JavaScript
编程笔记 html5&css&js 004 我的第一个页面
编程笔记 html5&css&js 004 我的第一个页面
|
3月前
|
JavaScript
如何使用JS控制指定页面大小开启全屏和退出全屏
如何使用JS控制指定页面大小开启全屏和退出全屏
25 0
|
3月前
|
JavaScript 数据安全/隐私保护
|
3月前
|
JavaScript
如何在JS中实现修改URL参数而不刷新页面
如何在JS中实现修改URL参数而不刷新页面
60 1
|
3月前
|
存储 JavaScript
JS中从a页面跳转到b页面,自动执行一次点击事件
JS中从a页面跳转到b页面,自动执行一次点击事件
|
1月前
|
JavaScript 前端开发
springboot+layui从控制器请求至页面时js失效的解决方法
springboot+layui从控制器请求至页面时js失效的解决方法
15 0
|
3月前
|
JavaScript
如何用js在页面中添加元素?
如何用js在页面中添加元素?
27 0
|
21天前
|
JavaScript 前端开发
JS:如何创建新元素并添加到页面中
JS:如何创建新元素并添加到页面中
23 1