移动端rem适配(750)

news/2025/2/11 20:32:01/

移动端rem适配(设计稿750)

rem是什么?
rem(font size of the root element)是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。看到rem大家一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位。它们之间其实很相似,只不过一个计算的规则是依赖根元素(rem)一个是依赖父元素计算(em)

在header中引入以下两个js文件就能实现自适应:

初始化文件:

window['adaptive'].desinWidth = 750;// 设计图宽度
window['adaptive'].baseFont = 22;// 没有缩放时的字体大小
window['adaptive'].maxWidth = 750; // 页面最大宽度 默认540
window['adaptive'].init();// 调用初始化方法

动态计算font-size文件:

var adaptive = {};
(function (win, lib) {var doc = win.document;var docEl = doc.documentElement;// 设备像素比var devicePixelRatio = win.devicePixelRatio;// 我们设置的布局视口与理想视口的像素比var dpr = 1; // viewport缩放值var scale = 1; // 设置viewportfunction setViewport() {// 判断IOSvar isIPhone = /iphone/gi.test(win.navigator.appVersion);if (lib.scaleType === 2 && isIPhone || lib.scaleType === 3) {dpr = devicePixelRatio;}// window对象上增加一个属性,提供对外的布局视口与理想视口的值win.devicePixelRatioValue = dpr;// viewport缩放值,布局视口缩放后刚好显示成理想视口的宽度,页面就不会过长或过短了scale = 1 / dpr;// 获取已有的viewportvar hasMetaEl = doc.querySelector('meta[name="viewport"]');var metaStr = 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no';if (dpr === 1) {metaStr = 'width=device-width, '.concat(metaStr);}if (!isIPhone && dpr !== 1) {metaStr = metaStr.concat(', target-densitydpi=device-dpi');}// 如果有,改变之if (hasMetaEl) {hasMetaEl.setAttribute('content', metaStr);}// 如果没有,添加之else {var metaEl = doc.createElement('meta');metaEl.setAttribute('name', 'viewport');metaEl.setAttribute('content', metaStr);if (docEl.firstElementChild) {docEl.firstElementChild.appendChild(metaEl);}else {var containDiv = doc.createElement('div');containDiv.appendChild(metaEl);docEl.appendChild(containDiv);}}}var newBase = 100;lib.errDpr = 1;function setRem() {// 布局视口// var layoutView = docEl.clientWidth; 也可以 获取布局视口的宽度var layoutView;if (lib.maxWidth) {layoutView = Math.min(docEl.getBoundingClientRect().width, lib.maxWidth * dpr);}else {layoutView = docEl.getBoundingClientRect().width;}// 为了计算方便,我们规定 1rem === 100px设计图像素,我们切图的时候就能快速转换// 有人问,为什么不让1rem === 1px设计像素呢?// 设计图一般是640或者750px// 布局视口一般是320到1440// 计算一个值,使layout的总宽度为 (desinWidth/100) rem// 那么有计算公式:layoutView / newBase = desinWidth / 100// newBase = 100 * layoutView / desinWidth// newBase = 介于50到200之间// 如果 1rem === 1px 设计像素,newBase就介于0.5到2之间,由于很多浏览器有最小12px限制,这个时候就不能自适应了newBase = 100 * layoutView / lib.desinWidth * (lib.errDpr || 1);docEl.style.fontSize = newBase + 'px';// rem基准值改变后,手动reflow一下,避免旋转手机后页面自适应问题doc.body&&(doc.body.style.fontSize = lib.baseFont / 100 + 'rem');// 重新设置rem后的回调方法lib.setRemCallback&&lib.setRemCallback();lib.newBase = newBase;}var tid;lib.desinWidth = 750;lib.baseFont = 28;// 局部刷新的时候部分chrome版本字体过大的问题lib.reflow = function() {docEl.clientWidth;};// 检查安卓下rem值是否显示正确function checkRem() {if (/android/ig.test(win.navigator.appVersion)) {var hideDiv = document.createElement('p');hideDiv.style.height = '1px';hideDiv.style.width = '2.5rem';hideDiv.style.visibility = 'hidden';document.body.appendChild(hideDiv);var now = hideDiv.offsetWidth;var right = lib.newBase * 2.5; if (Math.abs(right / now - 1) > 0.05) {lib.errDpr = right / now;setRem();}document.body.removeChild(hideDiv);}}lib.init = function () {// resize的时候重新设置rem基准值// 触发orientationchange 事件时也会触发resize,故不需要再添加此事件了win.addEventListener('resize', function () {clearTimeout(tid);tid = setTimeout(setRem, 300);}, false);// 浏览器缓存中读取时也需要重新设置rem基准值win.addEventListener('pageshow', function (e) {if (e.persisted) {clearTimeout(tid);tid = setTimeout(setRem, 300);}}, false);// 设置body上的字体大小if (doc.readyState === 'complete') {doc.body.style.fontSize = lib.baseFont / 100 + 'rem';checkRem();}else {doc.addEventListener('DOMContentLoaded', function (e) {doc.body.style.fontSize = lib.baseFont / 100 + 'rem';checkRem();}, false);}setViewport();// 设置rem值setRem();// html节点设置布局视口与理想视口的像素比docEl.setAttribute('data-dpr', dpr);};// 有些html元素只能以px为单位,所以需要提供一个接口,把rem单位换算成pxlib.remToPx = function (remValue) {return remValue * newBase;};
})(window, adaptive);
if (typeof module != 'undefined' && module.exports) {module.exports = adaptive;
} else if (typeof define == 'function' && define.amd) {define(function() {return adaptive;});
} else {window.adaptive = adaptive;
}

http://www.ppmy.cn/news/120225.html

相关文章

ARINC429板卡PCIE-1553B板卡 MIL-STD-1553B总线接口卡 PCIe 1553B通信模块

本系列产品均为自主研发,在有效实现MIL-STD-1553总线功能的同时能为用户的具体应用提供的技术支持。为用户提供了具有友好人机交互界面的总线分析软件,能够满足大多数的通讯、测试及仿真任务要求。本系列产品均为自主研发,在有效实现MIL-STD-…

前端面试题整理10

1.Vue项目打包上线流程? ①通过命令行工具进入Vue项目的根目录,运行命令npm run build,生成打包后的静态文件。 ②将打包后的静态文件上传至服务器,可选择使用FTP或者其他文件上传工具。 ③在服务器上安装Node.js环境&#xff…

通过python采集1688商品评论数据封装接口、1688评论数据接口

1688商品评论数据是指在1688网站上对商品的评价和评论信息。这些信息包括买家对商品的使用、品质、包装、服务等方面的评价和意见,可以帮助其他用户更好地了解商品的优缺点和性能,从而做出更明智的购买决策。 1688网站是中国最大的B2B电子商务网站之一&…

蓝牙音箱连接电脑后无法工具电脑上调节声音大小

问题描述:蓝牙音箱连接电脑后,无法工具系统声音的大小调节蓝牙音箱的大小。不论系统声音调节多大,音箱一直是最大声。除非系统声音静音了,蓝牙音箱没有声音。当时应用上调节声音大小对音箱有效。 问题原因:win10调整了…

【解决方案】笔记本电脑蓝牙耳机连接不稳定

测试设备: 电脑:宏碁暗影骑士擎2020版(Windows10操作系统,蓝牙驱动均已更新至最新) 无线Bluetooth设备:华为Freelace pro,JBL Go 3 等蓝牙耳机/音箱 测试方法(以华为Freelace pro为…

如何用计算机蓝牙放音乐,电脑如何连接蓝牙音箱放音乐(Win7系统笔记本电脑连接蓝牙音箱的操作方法)...

Win7系统笔记本电脑如何使用蓝牙连接蓝牙音箱呢?不少用户都有用蓝牙音箱,百思特网但是却不了解如何使用笔记本进行连接,下面就给大家分享Win7系统笔记本电脑连接蓝牙音箱的操作方法。 解决方法: 1、首先我们在桌面右下角找到蓝牙图…

笔记本电脑连蓝牙音箱放音乐音质很差 解决办法

问题:笔记本连蓝牙音箱,放出来是全损音质 原因:电脑默认开的是免提模式(hands-free),把蓝牙音箱当麦克了。 解决办法:换回立体声模式(stereo)。图文说明: 1.点…

台式计算机上的音箱应怎么接,台式电脑音箱和两个扬声器应该怎样连接

有源音箱和无源音箱: 电脑音箱主要分为两个类型的音箱,有源音箱和无源音箱。分辨这两个音箱的方法很简单。有源音箱是内置有一个小功率功放,直接通过音箱线插在电脑的麦克风接口,然后在接通电源即可正常工作。无源音箱的话一般主要…