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页面不刷新时全选择,全删除(GridView)
Apr 14 Javascript
Javascript技巧之不要用for in语句对数组进行遍历
Oct 20 Javascript
js 链式延迟执行DOME
Jan 04 Javascript
javascript中的return和闭包函数浅析
Jun 06 Javascript
js表单处理中单选、多选、选择框值的获取及表单的序列化
Mar 08 Javascript
js基于cookie方式记住返回页面用法示例
May 27 Javascript
再谈javascript注入 黑客必备!
Sep 14 Javascript
php 解压zip压缩包内容到指定目录的实例
Jan 23 Javascript
浅谈React组件之性能优化
Mar 02 Javascript
vue-router动态设置页面title的实例讲解
Aug 30 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
Jan 21 Javascript
Layui 带多选框表格监听事件以及按钮自动点击写法实例
Sep 02 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中把对象转换为关联数组代码分享
2015/04/09 PHP
php源码分析之DZX1.5随机数函数random用法
2015/06/17 PHP
php使用MySQL保存session会话的方法
2015/06/18 PHP
Laravel如何使用Redis共享Session
2018/02/23 PHP
Javascript 继承机制的实现
2009/08/12 Javascript
JavaScript 闭包在封装函数时的简单分析
2009/11/28 Javascript
Jquery 快速构建可拖曳的购物车DragDrop
2009/11/30 Javascript
了解了这些才能开始发挥jQuery的威力
2013/10/10 Javascript
JS画线(实例代码)
2013/11/20 Javascript
jquery实现动态画圆
2014/12/04 Javascript
ECMAScript6中Map/WeakMap详解
2015/06/12 Javascript
基于JS代码实现导航条弹出式悬浮菜单
2016/06/17 Javascript
bootstrap-table.js扩展分页工具栏(增加跳转到xx页)功能
2017/12/28 Javascript
微信小程序实现日历小功能
2020/11/18 Javascript
Python实现多线程抓取妹子图
2015/08/08 Python
玩转python爬虫之URLError异常处理
2016/02/17 Python
详解tensorflow训练自己的数据集实现CNN图像分类
2018/02/07 Python
python将类似json的数据存储到MySQL中的实例
2019/07/12 Python
Django ModelForm组件使用方法详解
2019/07/23 Python
python list转置和前后反转的例子
2019/08/26 Python
如何利用python给图片添加半透明水印
2019/09/06 Python
Python enumerate内置库用法解析
2020/02/24 Python
CSS3 RGBA色彩模式使用实例讲解
2016/04/26 HTML / CSS
CSS实现半透明边框与多重边框的场景分析
2019/11/13 HTML / CSS
五分钟学会HTML5的WebSocket协议
2019/11/22 HTML / CSS
Herschel Supply Co.美国:背包、手提袋及配件
2020/11/24 全球购物
高三体育教学反思
2014/01/29 职场文书
授权委托书样本
2014/04/03 职场文书
产品发布会策划方案
2014/05/12 职场文书
化学专业大学生职业生涯规划范文
2014/09/13 职场文书
保管员岗位职责
2015/02/14 职场文书
公安机关起诉意见书
2015/05/20 职场文书
运动会三级跳加油稿
2015/07/21 职场文书
学校标语口号大全
2015/12/26 职场文书
「月刊Comic Alive」2022年5月号封面公开
2022/03/21 日漫
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL