flexible.js实现移动端自适应

2023-10-28

首先要引入flaxible.js

代码如下


;(function(win, lib) {
    var doc = win.document;
    var docEl = doc.documentElement;
    var metaEl = doc.querySelector('meta[name="viewport"]');
    var flexibleEl = doc.querySelector('meta[name="flexible"]');
    var dpr = 0;
    var scale = 0;
    var tid;
    var flexible = lib.flexible || (lib.flexible = {});

    if (metaEl) {
        console.warn('将根据已有的meta标签来设置缩放比例');
        var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/);
        if (match) {
            scale = parseFloat(match[1]);
            dpr = parseInt(1 / scale);
        }
    } else if (flexibleEl) {
        var content = flexibleEl.getAttribute('content');
        if (content) {
            var initialDpr = content.match(/initial\-dpr=([\d\.]+)/);
            var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/);
            if (initialDpr) {
                dpr = parseFloat(initialDpr[1]);
                scale = parseFloat((1 / dpr).toFixed(2));
            }
            if (maximumDpr) {
                dpr = parseFloat(maximumDpr[1]);
                scale = parseFloat((1 / dpr).toFixed(2));
            }
        }
    }

    if (!dpr && !scale) {
        var isAndroid = win.navigator.appVersion.match(/android/gi);
        var isIPhone = win.navigator.appVersion.match(/iphone/gi);
        var devicePixelRatio = win.devicePixelRatio;
        if (isIPhone) {
            // iOS下,对于2和3的屏,用2倍的方案,其余的用1倍方案
            if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
                dpr = 3;
            } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)){
                dpr = 2;
            } else {
                dpr = 1;
            }
        } else {
            // 其他设备下,仍旧使用1倍的方案
            dpr = 1;
        }
        scale = 1 / dpr;
    }

    docEl.setAttribute('data-dpr', dpr);
    if (!metaEl) {
        metaEl = doc.createElement('meta');
        metaEl.setAttribute('name', 'viewport');
        metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no');
        if (docEl.firstElementChild) {
            docEl.firstElementChild.appendChild(metaEl);
        } else {
            var wrap = doc.createElement('div');
            wrap.appendChild(metaEl);
            doc.write(wrap.innerHTML);
        }
    }

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

    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);

    if (doc.readyState === 'complete') {
        doc.body.style.fontSize = 12 * dpr + 'px';
    } else {
        doc.addEventListener('DOMContentLoaded', function(e) {
            doc.body.style.fontSize = 12 * dpr + 'px';
        }, false);
    }


    refreshRem();

    flexible.dpr = win.dpr = dpr;
    flexible.refreshRem = refreshRem;
    flexible.rem2px = function(d) {
        var val = parseFloat(d) * this.rem;
        if (typeof d === 'string' && d.match(/rem$/)) {
            val += 'px';
        }
        return val;
    }
    flexible.px2rem = function(d) {
        var val = parseFloat(d) / this.rem;
        if (typeof d === 'string' && d.match(/px$/)) {
            val += 'rem';
        }
        return val;
    }

})(window, window['lib'] || (window['lib'] = {}));

然后再index.html里边引入就行了
在index.html里边放入meta标签

<meta content="maximum-dpr=2" name="flexible" />
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

flexible.js实现移动端自适应 的相关文章

  • 微信小程序如何循环控制一行显示几个wx:for

    正如上图所显示的一样 我们改如何控制一行显示几个图形呢 首先第一种方法 数量少的可以自己一行一行的写 但是当数据很多的时候呢 这时候就需要我们区使用循环进行代码的编写 废话不多数 直接写代码 demo item width 40 demo
  • Android:ARouter原理源码解析

    文章目录 前言 一 ARouter使用 二 ARouter初始化 init 函数 整体 LogisticsCenter初始化 拦截器初始化 三 跳转解析 跳转 总结 前言 一 ARouter使用 ARouter的基本使用请参考这篇博客 AR
  • flexible.js实现移动端自适应

    首先要引入flaxible js 代码如下 function win lib var doc win document var docEl doc documentElement var metaEl doc querySelector m
  • HBuilder运行项目到IOS真机设备

    公司项目 开发多端应用 在此记录下开发后在ios端真机测试的步骤 在Hbuilder点击运行 gt 运行到手机或模拟器 gt 运行到IOS App基座 连上ios设备 这里需要设置一下Apple证书签名才可以使用 点击 使用Apple证书签
  • window配置weex项目的android studio环境

    weex 虽然做的是前端的工作但是越往后面觉的如果不会一门移动端的框架是多么的无力 于是就开始了之前非常看好的weex框架 该框架起初是由阿里巴巴内部开源的 后面移交给apache成长历程可谓是一波三折 和react native比起来有些
  • 怎样简便的使用vw完成移动端rem适配

    怎样简便的完成移动端rem适配 了解一些必要的单位 px 像素 进行页面开发的基础单位 em 相对单位 rem 相对单位 vw 相对宽度 vh 相对高度 如何进行简单的px rem转换 了解一些必要的单位 px 像素 进行页面开发的基础单位
  • Vue项目商品购物车前端本地缓存逻辑(适用H5/ipad/PC端)——前端实现购物车删除商品、购物车增减数量,清空购物车功能、新增扫码枪扫码添加到购物车功能

    新增扫码枪扫码添加到购物车功能且购物车选中状态根据扫码商品自动选中 export default data return shoppingCartActive shoppingNum 1 购物车选中项 scanValue 扫码枪返回的cod
  • 移动端Loading的两种方式--RN

    方式一 1 先封装一个 Loading 组件 import React from react import StyleSheet View ActivityIndicator from react native const Loading
  • 移动端安卓文字垂直居中偏上偏移的解决方案

    移动web里小于12px的文字居中异常的问题 最后还是改为12px才近乎解决了问题 但是有时候或许并不是那么乐观 你并不能将原本定为10px的字体改为12px 那该怎么办呢 我们都知道 移动端为了高清屏显示1px的border 会有那么几种
  • ios 设备的移动端页面 光标错位

    1 这个问题遇到好多次了 经常是上下错位 原因是在input 获取焦点以后 键盘弹出后 页面网上移动 但是光标停留在了以前的位置 如果页面不复杂 可以在body上添加 position fixed 但是这样会引起页面失去滚动能力 目前只能是
  • vue移动端无法使用string.replaceAll,报错显示空白

    开发vue时 使用了replaceAll函数 在pc端调试没问题 但是打包部署到移动端端测试时 发现部分页面显示空白 控制台只显示Error 经过排查是replaceAll函数报错了 替换成replace解决
  • Audio在移动端的兼容性问题(1)

    需求 做一个SPA的web互动测试游戏 题目是自动切换播放的音频 根据音频内容选择正确选项 兼容移动端的微信 APP 浏览器和PC端的主流浏览器 准备 第一步 我们先查看兼容性 打开Can I Use CanIUse提供了各种浏览器所能支持
  • pc微信禁止启动小程序

    场景 最近 Windows 微信的更新了可以访问小程序的功能 但还不完善 如 尝试播放激励视频时 会直接跳过视频并作为已完成处理等 身为开发者的我们可能需要做一些处理 禁止pc的微信访问小程序 以达到减小损失的目的 提要 App onLau
  • 移动端浏览器兼容性问题

    在开发移动端商城项目的时候 在实现功能和处理bug的过程中出现了一些之前没有见过的问题 在这里记录一下 1 IOS移动端click事件300ms的延迟响应 移动设备上的web网页是有300ms延迟的 玩玩会形成按钮点击延迟甚至是点击失效 这
  • 系统时间显示踩坑记录

    问题 签到前时间每秒变化显示 原始做法是 截取获取的系统时间的后九位 但是红米手机的系统时间最后两位不是秒 而是上下午的英文字母 导致小时截取不到 如图中间位置 希望实现如图左 方法 分别获取系统的时分秒 处理下不是两位的数字 然后拼接起来
  • Web移动端-touch事件

    一 引入 在一个项目demo中 实现单指触控卡片的向任意方向的拖动效果 网上没有现成的插件 所以只好原生js来写 产品要求需要禁止掉多点触控 这个过程很让人头疼 试了很多方法 都不太实现 后来仔细研究 测试了一下移动端的三个常用事件 二 事
  • 基于vue实现移动端点击上方导航,内容滑动切换,滑动内容导航自动切换。

    这是在日常开发过程中常见的选项卡 带滑动切换效果 小白一枚 不足之处还望体谅 包涵 这也是第一次尝试写博客 以后会继续分享一些工作中的问题与收获 实现效果 点击上方导航 当前导航添加样式 下方内容滑动切换 滑动下方内容上面导航切换 第一步
  • 【uniapp小程序】—— APP项目云打包(安卓)

    前言 之前小程序系列文章写了配置页面和封装自定义组件 这次写一下开发完成我们的项目后 如何进行打包安装 本文主要讲述的是使用 uniapp打包安卓 正文 第一步 查看自己的项目的基础配置 第二步 选择打包项目 选中我们要打包的项目 方式一
  • ADB:常用指令汇总

    常用指令
  • Andriod:andriod手机屏幕坐标系

    如图所示 左上角为坐标原点 越向下 y值越大 越向右 x值越大

随机推荐

  • Linux之Centos7.6版本下载及安装Go语言环境配置,安装Go1.18版本教程笔记-2023版

    文章目录 一 Linux下安装Go环境 1 远程获取 2 解压 3 添加环境变量 5 Go环境配置图 配置完成信息图 二 VsCode连接我们Go 2 1安装对应的插件 2 2进行连接 3 相关配置 4 成功连接 一 Linux下安装Go环
  • 视频在H5页面在微信浏览器不能自动播放问题

    引用官方的JS文件 正式方法 function BGMAutoPlayMgr url this audioContext new window AudioContext window webkitAudioContext window mo
  • 2020那些搭载Imagination IP的设备(国内篇)

    除海外市场外 2020年国内不少智能新品上市 并通过搭载ImaginationGPU 和 NNA IP 实现了更加明显的市场差异化 基于紫光展锐虎贲T7510 平台国内多款 5G 手机上市 智能手机市场 5G AI 无疑成为下一代手机的焦点
  • Unity调用Android类方法

    1 添加Unity的classes jar文件 创建一个Android工程AndroidUnityDemo 由于Unity的版本不同 直接在Unity安装包文件夹里面搜索classes jar文件 如果有多个classes jar文件 一般
  • SpringData JPA 提示:TransactionRequiredException: Executing an update/delete query

    问题场景 package com zzg dao import javax transaction Transactional import org springframework data jpa repository JpaReposi
  • [MySQL]实训七

    实训目的 设置字段的默认值约束 设置字段的自动增长约束 设置字段的外键约束 有关上述三种约束的概念在上一篇文章中有提及 http t csdn cn 9rV9T 1 在数据库db school中重新定义表tb student 要求以表级完整
  • 4. TypeScript 类

    TypeScript 类 1 TS中定义类 class Pointer x number 实例上的属性必须先声明 y number constructor x number y number args number this x x thi
  • 关于研一Python基础课程第四周课后习题的几点理解(含一个问题的订正)

    1 第八题一个函数的订正 def output prime number for i in range number 1 if is prime i True print i end 这里原文的代码是for i in range numbe
  • VS 配置Qt 开发组件

    VS 配置Qt 步骤比较简单 入门级吧 按照如下几步即可快速配置 希望可以帮到你 一 安装VS Qt组件 1 方法一 扩展 gt 管理扩展 gt 联机 搜素Qt Visual Studio Tools 工具 自动下载完成 按照向导提示正常安
  • 深入解析JS工程逆中的反爬机制

    在当今互联网时代 爬虫技术被广泛应用于数据采集 搜索引擎优化等领域 然而 许多网站为了保护其数据和资源 采取了各种反爬机制 JS逆工程是其中一种常见的反爬手段 通过在网页中利用JavaScript代码动态生成内容 使得爬虫难以获取有效数据
  • ansible批量自动安装LNMP

    转载于 https www cnblogs com hai better p 9995258 html
  • 算法[动态规划]---买卖股票最佳时机

    1 题目 给你一个整数数组 prices 其中 prices i 表示某支股票第 i 天的价格 在每一天 你可以决定是否购买和 或出售股票 你在任何时候最多只能持一股股票 你也可以先购买 然后在同一天出售 返回你能获得的最大利润 2 分析特
  • 蓝桥杯2022 python C组

    蓝桥杯2022 python C组 跟之前的就四题不一样 第二题 特殊时间 就是i 从0 9 j从0 9 i是三个一样的 然后看看他们能不能成为 年 月日 时分 成为年只要大于0就好了 称为月日的话月要从1 12 日呢 特殊的日子就二月28
  • Java连接Oracle数据库(详细!快速上手)

    Java连接Oracle数据库及封装JDBC 如果你点开看到了这篇文章 说明你已经或多或少地通过学校学习亦或是自学了解了 oracle 数据库的基本用法 但是实际在开发程序的时候 我们是不可能手动地去操作sql语句的 而是由程序去调用 这个
  • adb shell 出现 insufficient permissions for device

    新安装了一台电脑 要用adb跟开发板通信 1 安装adb user hp 8200 Desktop factory adb shell The program adb can be found in the following packag
  • 使用过的小巧软件一览

    最近遇到一个脑洞的问题 之前使用Winrar 压缩软件 加密的代码包 由于时间久远 密码忘记了 尝试了记得的各种可能的密码 都是不行 但大概记得长度和部分字符 可就是不记得如何组合的了 后来网上搜索了一番 找到一个小软件 暴力破解了一番 好
  • Linux安全基线检查--centos7

    版权声明 本文为CSDN博主 淡定波007 的原创文章 遵循CC 4 0 BY SA版权协议 转载请附上原文出处链接及本声明 原文链接 https blog csdn net qq 28721869 article details 1146
  • 使用storcli/storcli64工具配置RAID

    storcli storcli工具上传到服务器任意目录 并使用命令chmod x storcli64修改文件权限为可执行 系统下查看Raid卡 root localhost lspci grep LSI 0000 81 00 0 RAID
  • C++函数的定义与使用

    函数的定义和使用 main就是一个函数 它是C 程序的主函数 一个C 程序可以由一个主函数和若干子函数组成 主函数是程序执行的开始点 由主函数调用子函数 子函数还可以再调用其它子函数 调用其它函数的函数称为主调函数 被其他函数调用的函数称为
  • flexible.js实现移动端自适应

    首先要引入flaxible js 代码如下 function win lib var doc win document var docEl doc documentElement var metaEl doc querySelector m