js实现整体缩放页面适配移动端


Posted in Javascript onMarch 31, 2020

大家在适配页面的Web端和移动端时候,如果不需要那么麻烦,就可以使用js进行整体缩放,只需要引入一个js,改动htmll头部代码即可

切记:

1.该 JS 应在 head 中尽可能早的引入,减少重绘。
2.定宽(视窗缩放): 对应 meta 标签写法 ?

750 是效果图内容区域的宽度,一般为 640 或 750

html头部代码:

<meta charset="UTF-8">
<meta name="viewport" content="width=640">
<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="renderer" content="webkit">
<meta name="referrer" content="never">
<title>整体缩放</title>
<script src="__PUBLIC__/js/mobile-util.js"></script>

js源码:

/**
 * 该 JS 中,包含常用的 UA 判断、页面适配、search 参数转 键值对。
 * 该 JS 应在 head 中尽可能早的引入,减少重绘。
 *
 * fixScreen 方法根据两种情况适配,该方法自动执行。
 *  1. 定宽(视窗缩放): 对应 meta 标签写法 -- 
   <meta name="viewport" content="width=750">
   750 是效果图内容区域的宽度,一般为 640 或 750 
 *   该方法会提取 width 值,主动添加 scale 相关属性值。
 *   注意: 如果 meta 标签中指定了 initial-scale, 该方法将不做处理(即不执行)。
 *  
 *  2. REM: 不用写 meta 标签,该方法根据 dpr 自动生成,并在 html 标签中加上 data-dpr 和 font-size 两个属性值。
 *   该方法约束:IOS 系统最大 dpr = 3,其它系统 dpr = 1,页面每 dpr 最大宽度(即页面宽度/dpr) = 750,REM 换算比值为 16。
 *   对应 css 开发,任何弹性尺寸均使用 rem 单位,rem 默认宽度为 视觉稿宽度 / 16;
 *   scss 中 $ppr(pixel per rem) 变量写法 -- $ppr: 750px/16/1rem;
 *   元素尺寸写法 -- html { font-size: $ppr*1rem; } body { width: 750px/$ppr; }。
 */
window.mobileUtil = (function(win, doc) {
 var UA = navigator.userAgent,
 isAndroid = /android|adr/gi.test(UA),
 isIos = /iphone|ipod|ipad/gi.test(UA) && !isAndroid, // 据说某些国产机的UA会同时包含 android iphone 字符
 isMobile = isAndroid || isIos; // 粗略的判断

 return {
 isAndroid: isAndroid,
 isIos: isIos,
 isMobile: isMobile,

  isNewsApp: /NewsApp\/[\d\.]+/gi.test(UA),
 isWeixin: /MicroMessenger/gi.test(UA),
 isQQ: /QQ\/\d/gi.test(UA),
 isYixin: /YiXin/gi.test(UA),
 isWeibo: /Weibo/gi.test(UA),
 isTXWeibo: /T(?:X|encent)MicroBlog/gi.test(UA),

 tapEvent: isMobile ? 'tap' : 'click',

 /**
 * 缩放页面
 */
 fixScreen: function() {
   var metaEl = doc.querySelector('meta[name="viewport"]'),
    metaCtt = metaEl ? metaEl.content : '',
    matchScale = metaCtt.match(/initial\-scale=([\d\.]+)/),
  matchWidth = metaCtt.match(/width=([^,\s]+)/);

   if ( !metaEl ) { // REM
    var docEl = doc.documentElement,
     maxwidth = docEl.dataset.mw || 750, // 每 dpr 最大页面宽度
     dpr = isIos ? Math.min(win.devicePixelRatio, 3) : 1,
     scale = 1 / dpr,
     tid;

    docEl.removeAttribute('data-mw');
    docEl.dataset.dpr = dpr;
    metaEl = doc.createElement('meta');
    metaEl.name = 'viewport';
    metaEl.content = fillScale(scale);
    docEl.firstElementChild.appendChild(metaEl);

    var refreshRem = function() {
     var width = docEl.getBoundingClientRect().width;
     if (width / dpr > maxwidth) {
      width = maxwidth * dpr;
     }
     var rem = width / 16;
     docEl.style.fontSize = rem + 'px';
    };

    win.addEventListener('resize', function() {
     clearTimeout(tid);
     tid = setTimeout(refreshRem, 300);
    }, false);
    win.addEventListener('pageshow', function(e) {
     if (e.persisted) {
      clearTimeout(tid);
      tid = setTimeout(refreshRem, 300);
     }
    }, false);

    refreshRem();
   } else if ( isMobile && !matchScale && ( matchWidth && matchWidth[1] != 'device-width' ) ) { // 定宽
    var width = parseInt(matchWidth[1]),
     iw = win.innerWidth || width,
     ow = win.outerWidth || iw,
     sw = win.screen.width || iw,
     saw = win.screen.availWidth || iw,
     ih = win.innerHeight || width,
     oh = win.outerHeight || ih,
     ish = win.screen.height || ih,
     sah = win.screen.availHeight || ih,
     w = Math.min(iw,ow,sw,saw,ih,oh,ish,sah),
     scale = w / width;

    if ( scale < 1 ) {
     metaEl.content = metaCtt + ',' + fillScale(scale);
    }
   }

   function fillScale(scale) {
    return 'initial-scale=' + scale + ',maximum-scale=' + scale + ',minimum-scale=' + scale + ',user-scalable=no';
   }
 },

 /**
 * 转href参数成键值对
 * @param href {string} 指定的href,默认为当前页href
 * @returns {object} 键值对
 */
 getSearch: function(href) {
 href = href || win.location.search;
 var data = {},reg = new RegExp( "([^?=&]+)(=([^&]*))?", "g" );
 href && href.replace(reg,function( $0, $1, $2, $3 ){
 data[ $1 ] = $3;
 });
 return data;
 }
 };
})(window, document);

// 默认直接适配页面
mobileUtil.fixScreen();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
使用Javascript和DOM Interfaces来处理HTML
Oct 09 Javascript
JavaScript学习笔记(十七)js 优化
Feb 04 Javascript
JQUERY1.6 使用方法四 检测浏览器
Nov 23 Javascript
jquery的相对父元素和相对文档定位示例代码
Aug 02 Javascript
手写的一个兼容各种浏览器的javascript getStyle函数(获取元素的样式)
Jun 06 Javascript
jQuery EasyUI datagrid实现本地分页的方法
Feb 13 Javascript
Underscore.js 1.3.3 中文注释翻译说明
Jun 25 Javascript
浅谈JavaScript中小数和大整数的精度丢失
May 31 Javascript
easyui 中的datagrid跨页勾选问题的实现方法
Jan 18 Javascript
Javascript之深入浅出prototype
Feb 06 Javascript
详解基于Angular4+ server render(服务端渲染)开发教程
Aug 28 Javascript
微信小程序图表插件wx-charts用法实例详解
May 20 Javascript
react国际化化插件react-i18n-auto使用详解
Mar 31 #Javascript
小程序中使用css var变量(使js可以动态设置css样式属性)
Mar 31 #Javascript
功能完善的小程序日历组件的实现
Mar 31 #Javascript
小程序双头slider选择器的实现示例
Mar 31 #Javascript
JavaScript实现电灯开关小案例
Mar 30 #Javascript
javascript实现计算器功能
Mar 30 #Javascript
详解Webpack抽离第三方类库以及common解决方案
Mar 30 #Javascript
You might like
一个简单且很好用的php分页类
2013/10/26 PHP
php的mssql数据库连接类实例
2014/11/28 PHP
基于GD2图形库的PHP生成图片缩略图类代码分享
2015/02/08 PHP
让Firefox支持event对象实现代码
2009/11/07 Javascript
jQuery后代选择器用法实例
2014/12/23 Javascript
jquery实现简单的表单验证
2015/11/17 Javascript
JavaScript必知必会(十) call apply bind的用法说明
2016/06/08 Javascript
简单易懂的天气插件(代码分享)
2017/02/04 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
vue+vux实现移动端文件上传样式
2017/07/28 Javascript
JavaScript中重名的函数与对象示例详析
2017/09/28 Javascript
Vue中使用Lodop插件实现打印功能的简单方法
2019/12/19 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
python使用append合并两个数组的方法
2015/04/28 Python
python魔法方法-自定义序列详解
2016/07/21 Python
python django 访问静态文件出现404或500错误
2017/01/20 Python
Python Flask-web表单使用详解
2017/11/18 Python
分分钟入门python语言
2018/03/20 Python
Python3实现爬虫爬取赶集网列表功能【基于request和BeautifulSoup模块】
2018/12/05 Python
python代码 输入数字使其反向输出的方法
2018/12/22 Python
详解python中init方法和随机数方法
2019/03/13 Python
Django restframework 框架认证、权限、限流用法示例
2019/12/21 Python
python GUI库图形界面开发之PyQt5输入对话框QInputDialog详细使用方法与实例
2020/02/27 Python
用CSS3实现无限循环的无缝滚动的示例代码
2017/11/01 HTML / CSS
事业单位个人应聘自荐信
2013/09/21 职场文书
银行实习生的自我评价
2013/12/09 职场文书
机械设计职业生涯规划书
2013/12/27 职场文书
销售顾问岗位职责
2014/02/25 职场文书
教师群众路线学习心得体会
2014/11/04 职场文书
2014年社区宣传工作总结
2014/12/02 职场文书
2015年八一建军节演讲稿
2015/03/19 职场文书
开会通知
2015/04/20 职场文书
学习新党章心得体会2016
2016/01/15 职场文书
vue3如何优雅的实现移动端登录注册模块
2021/03/29 Vue.js
MySQL分区表实现按月份归类
2021/11/01 MySQL
vue报错function () { [native code] },无法出现我们想要的内容 Unknown custom element
2022/04/11 Vue.js