JavaScript实现移动端页面按手机屏幕分辨率自动缩放的最强代码


Posted in Javascript onAugust 18, 2017
 手机的屏幕有大有小,移动web最好做成响应式布局,也就是自适应屏幕,没有固定宽高,这样的话,在所有手机上都可以正常显示。关于移动端页面按手机屏幕分辨率自动缩放的js,先附上代码
<script>
 var phoneWidth = parseInt(window.screen.width);
 var phoneHeight = parseInt(window.screen.height);
 var phoneScale = phoneWidth/750;//除以的值按手机的物理分辨率
 var ua = navigator.userAgent;
 if (/Android (\d+\.\d+)/.test(ua)) {
 var version = parseFloat(RegExp.$1);
 // andriod 2.3
 if (version > 2.3) {
 document.write('<meta name="viewport" content="width=device-width,initial-scale='+phoneScale+',minimum-scale='+phoneScale+',maximum-scale='+phoneScale+',user-scalable=no">');
 // andriod 2.3以上
 } else {
 document.write('<meta name="viewport" content="width=device-width,user-scalable=no">');
 }
 // 其他系统
 } else {
 document.write('<meta name="viewport" content="width=device-width, initial-scale='+phoneScale+',minimum-scale='+phoneScale+',maximum-scale ='+phoneScale +',user-scalable=no,">');
 }
</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);

如iphone6的phys.width为750px,而css-width为375px。

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

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

opera:850px;

Andriod webkit:800px;

IE:974px;

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

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

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

target-densitydpi=device-dpi

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

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

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

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

想实现target-densitydpi=device-dpi的效果有什么方法?提交此次补丁的WebKit开发者说可以用responsive images 和 CSS device units来替代。

参考链接:

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助~如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持!

Javascript 相关文章推荐
Apply an AutoFormat to an Excel Spreadsheet
Jun 12 Javascript
javascript弹出层输入框(示例代码)
Dec 11 Javascript
javascript制作2048游戏
Mar 30 Javascript
jquery合并表格中相同文本的相邻单元格
Jul 17 Javascript
jQuery动态追加页面数据以及事件委托详解
May 06 jQuery
Angular实现双向折叠列表组件的示例代码
Nov 21 Javascript
详解设置Webstorm 利用babel将ES6自动转码成ES5
Dec 20 Javascript
JQueryDOM之样式操作
Mar 27 jQuery
Vue.js轮播图走马灯代码实例(全)
May 08 Javascript
java实现单链表增删改查的实例代码详解
Aug 30 Javascript
js数组中去除重复值的几种方法
Aug 03 Javascript
在react项目中使用antd的form组件,动态设置input框的值
Oct 24 Javascript
移动设备手势事件库Touch.js使用详解
Aug 18 #Javascript
JavaScript你不知道的一些数组方法
Aug 18 #Javascript
关于meta viewport中target-densitydpi属性详解(推荐)
Aug 18 #Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
Aug 18 #Javascript
JS实现页面打印(整体、局部)
Aug 18 #Javascript
简单实现jQuery轮播效果
Aug 18 #jQuery
JavaScript编写的网页小游戏,很给力
Aug 18 #Javascript
You might like
ThinkPHP3.1之D方法实例详解
2014/06/20 PHP
PHP启动windows应用程序、执行bat批处理、执行cmd命令的方法(exec、system函数详解)
2014/10/20 PHP
在Mac OS上搭建Nginx+PHP+MySQL开发环境的教程
2015/12/21 PHP
PHP多维数组转一维数组的简单实现方法
2015/12/23 PHP
拖动Html元素集合 Drag and Drop any item
2006/12/22 Javascript
JavaScript中的onerror事件概述及使用
2013/04/01 Javascript
获取3个数组不重复的值的具体实现
2013/12/30 Javascript
详解Python中logging日志模块在多进程环境下的使用
2016/12/26 Javascript
Html5+jQuery+CSS制作相册小记录
2016/12/30 Javascript
vue-cli如何快速构建vue项目
2017/04/26 Javascript
JS解析url查询参数的简单代码
2017/08/06 Javascript
nodejs实现获取本地文件夹下图片信息功能示例
2019/06/22 NodeJs
vue实现拖拽效果
2019/12/23 Javascript
微信小程序基于ColorUI构建皮皮虾短视频去水印组件
2020/11/04 Javascript
[52:08]DOTA2上海特级锦标赛主赛事日 - 3 败者组第三轮#2Fnatic VS OG第一局
2016/03/05 DOTA
[03:06]2018年度CS GO最具人气解说-完美盛典
2018/12/16 DOTA
Python基础语言学习笔记总结(精华)
2017/11/14 Python
Python实现多线程/多进程的TCP服务器
2019/09/03 Python
Tensorflow矩阵运算实例(矩阵相乘,点乘,行/列累加)
2020/02/05 Python
MAC平台基于Python Appium环境搭建过程图解
2020/08/13 Python
英国天然有机美容护肤品:Neal’s Yard Remedies
2018/05/05 全球购物
新西兰领先的内衣店:Bendon Lingerie新西兰
2018/07/11 全球购物
白俄罗斯在线大型超市:e-dostavka.by
2019/07/25 全球购物
乌克兰品牌化妆品和香水在线商店:Bomond
2020/01/14 全球购物
Tessabit美国:集世界奢侈品和设计师品牌的意大利精品买手店
2020/06/29 全球购物
数百万免费的图形资源:Freepik
2020/09/21 全球购物
一套带答案的C++笔试题
2014/01/10 面试题
数据库测试通常都包括哪些方面
2015/11/30 面试题
人事部经理岗位职责
2014/03/07 职场文书
绘画专业自荐信
2014/07/04 职场文书
刑事法律意见书
2015/06/04 职场文书
休学证明范本
2015/06/19 职场文书
实验心得体会范文
2016/01/25 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书
Meta增速拉垮,元宇宙难当重任
2022/04/29 数码科技
win10如何更改appdata文件夹的默认位置?
2022/07/15 数码科技