rem原理:

其实rem布局的本质是等比缩放,一般是基于宽度,通过更改html元素的font-size字体大小,就可以让子元素实际大小发生变化

推荐一篇文章:

https://segmentfault.com/a/1190000012225828?utm_source=tag-newest

前提页面头部设置<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no" />

动态设置页面的字体大小

var html = document.documentElement;
var htmlw = html.clientWidth;
html.style.fontSize = htmlw / 10.8 + "px";
var PixelRatio = 1 / window.devicePixelRatio;
console.log(window.devicePixelRatio); //像素比
document.write('<meta name="viewport" content="width=device-width, initial-scale=' +PixelRatio +", minimum-scale=" +PixelRatio +", maximum-scale=" +PixelRatio +',user-scalable=no"/>'
); //动态设置视口
function setSize() {//动态设置字体大小,自适应var html = document.getElementsByTagName("html")[0];//获取屏幕宽度var pageWidth = html.getBoundingClientRect().width;console.log(pageWidth);html.style.fontSize = pageWidth / 15 + "px";
}
setSize();
window.addEventListener("resize", setSize, false); //自动跳转不需要刷新页面
window.addEventListener("orientationchange", setSize, false);

引入后:除以100并将px换成rem

适用Vue 移动端

<script>// 在标准 375px 适配下,100px = 1rem;(function (doc, win) {var docEl = doc.documentElement,resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize',recalc = function () {var clientWidth = docEl.clientWidth;console.log(clientWidth)docEl.style.fontSize = (clientWidth >= 750) ? "100px" : 100 * (clientWidth / 750) + "px"console.log(docEl.style.fontSize)};if (!doc.addEventListener) return;win.addEventListener(resizeEvt, recalc, false);doc.addEventListener('DOMContentLoaded', recalc, false);})(document, window);
</script><!--别人的第二种--><script>(function () {// 在标准 375px 适配下,100px = 1rem;var baseFontSize = 100;  var baseWidth = 375;var set = function () {var clientWidth = document.documentElement.clientWidth || window.innerWidth;var rem = 100;if (clientWidth != baseWidth) {rem = Math.floor(clientWidth / baseWidth * baseFontSize);}document.querySelector('html').style.fontSize = rem + 'px';}set();window.addEventListener('resize', set);}());</script>

移动端(手机端)页面自适应解决方案—rem布局

假设设计妹妹给我们的设计稿尺寸为750 * 1340。结合网易、淘宝移动端首页html元素上的动态font-size属性、设计稿尺寸、前端与设计之间协作流程一般分为下面两种:

一、网易做法:

引入:页面开头处引入下面这段代码,用于动态计算font-size 引入后:除以100并将px换成rem

(function(doc, win) {var docEl = doc.documentElement,isIOS = navigator.userAgent.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/),dpr = isIOS ? Math.min(win.devicePixelRatio, 3) : 1,dpr = window.top === window.self ? dpr : 1, //被iframe引用时,禁止缩放dpr = 1,scale = 1 / dpr,resizeEvt = 'orientationchange' in window ? 'orientationchange' : 'resize';docEl.dataset.dpr = dpr;var metaEl = doc.createElement('meta');metaEl.name = 'viewport';metaEl.content = 'initial-scale=' + scale + ',maximum-scale=' + scale + ', minimum-scale=' + scale;docEl.firstElementChild.appendChild(metaEl);console.log(docEl.clientWidth)var recalc = function() {var width = docEl.clientWidth;if (width / dpr > 750) {width = 750 * dpr;}// 乘以100,px : rem = 100 : 1docEl.style.fontSize = 100 * (width / 750) + 'px';};recalc()if (!doc.addEventListener) return;win.addEventListener(resizeEvt, recalc, false);
})(document, window);

使用:

未引入前:

body {width: 750px;height: 640px;
}

引入后:除以100并将px换成rem

body {width: 7.5rem;height: 6.4rem;
}

换算的依据:

// 乘以100,px : rem = 100 : 1
var recalc = function() {var width = docEl.clientWidth;if (width / dpr > 750) {width = 750 * dpr;}// 乘以100,px : rem = 100 : 1docEl.style.fontSize = 100 * (width / 750) + 'px';
};

二、淘宝做法(推荐做法,尤其是app内嵌页面):

引入:页面开头处引入下面这段代码,用于动态计算font-size,或者单独放入一个文件,引入文件也可以

;
(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) {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 > 750) {width = 750 * dpr}var rem = Math.floor(100 * (width / 750));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'] = {}));

使用:

未引入前:

body {width: 750px;height: 640px;
}

引入后:

@font-size-base: 75;
body {width: 750rem/@font-size-base;height: 640rem/@font-size-base;
}

换算依据:

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

这边是用的less,如果您没有用less,就需要手动计算,当然也可以转化为px : rem = 100 : 1。
如果想转化为px : rem = 100 : 1,可以修改上面的refreshRem函数:

function refreshRem() {var width = docEl.getBoundingClientRect().width// 适配平板if (width / dpr > 750) {width = 750 * dpr}var rem = Math.floor(100 * (width / 750))docEl.style.fontSize = rem + 'px'flexible.rem = win.rem = rem;
}

使用:

未引入前:

body {width: 750px;height: 640px;
}

引入后:除以100并将px换成rem

body {width: 7.5rem;height: 6.4rem;
}

换算依据就是上面修改的代码:

function refreshRem() {var width = docEl.getBoundingClientRect().width// 适配平板if (width / dpr > 750) {width = 750 * dpr}var rem = 100 * (width / 750)docEl.style.fontSize = rem + 'px'flexible.rem = win.rem = rem;
}

移动端布局js动态计算rem相关推荐

  1. 理解 css rem与动态计算rem

    1.rem定义? 首先css3规定1rem = html根节点的font-size,rem也就是root em简写. 为了方便计算通常设置根节点font-size = 100px 那么 1rem = ...

  2. rem动态计算rem

    (function (doc, win) { console.log(doc); var docEl = doc.documentElement, resizeEvt = 'orientationch ...

  3. vue移动端通过px动态计算图片宽高_vue图片宽高自适应_移动web图片高度自适应的解决方案...

    由于图片的加载是在dom加载完成之后进行的,于是,在手机端浏览网页时,经常会看到页面刚打开时很多内容叠在一起,当图片加载完成后,页面会由于图片加载完成出现明显的抖动 针对这个问题,有以下几种解决方案 ...

  4. 原生JS动态计算输入框文本内容的宽度,当内容宽度超过输入框的宽度时可控

    需求场景:左边输入框输入内容,右边输入框用placeholder展示,当placeholder的内容宽度超过右边输入框的宽度时,placeholder强行替换为"请选择" 注意事项 ...

  5. html页面按钮布局,js动态生成按钮,页面用DIV简单布局(示例代码)

    今天朋友让我忙帮给写个页面,由于时间紧破,所以没有完善,暂时先贴出来,以后有时间了在做修改 * { margin: 0px; padding: 0px; } .header { width: 100% ...

  6. 第148天:js+rem动态计算font-size的大小,适配各种手机设备

    需求: 在不同的移动终端设备中实现,UI设计稿的等比例适配. 方案: 布局排版都用rem做单位,然后不同宽度的屏,js动态计算根节点的font-size. 假设设计稿是宽750px来做的,书写css方 ...

  7. vue中设置html的fontsize,vue中rem布局使用js动态改变fontsize

    rem布局原理:使用js动态改变html的字体大小+rem的特性,来保证最初的设计图中每个元素的尺寸比例不变,以适用于不同尺寸的设备能够正常显示. (function (doc, win) { var ...

  8. 如何利用vw+rem进行移动端布局

    前言 因为在公司,只有一个前端,在做移动端布局的时候.利用px进行布局,发现,需要进行各种手机的适配. 所以在开发第二版的时候,想着引用lib-flexible库(即手淘的方案),询问了上一家公司的同 ...

  9. java 月份适配计算_js+rem动态计算font-size的大小适配各种手机设备

    需求:在不同的移动终端设备中实现,UI设计稿的等比例适配. 方案:使用js动态改变html的字体大小font-size+rem的特性,来保证最初的设计图中每个元素的尺寸比例不变,以适用于不同尺寸的设备 ...

最新文章

  1. 我用Python破解了同事的加密压缩包
  2. (转)函数指针,指针函数,指向函数的指针,返回指针的函数
  3. SpringBoot @Valid各种注解使用说明
  4. 牛顿法中为何出现hessian矩阵
  5. 一种JavaScript里小数的精确计算方式
  6. 【Python3网络爬虫开发实战】1.2.6-aiohttp的安装
  7. thinkphp-查询某一列的值column
  8. windows server 2012/2016 开启桌面图标
  9. MySQL主从同步的概述_MySQL主从同步原理介绍
  10. 算法上均匀分布的随机抽奖,如何避免现实的现场抽奖的中奖号码有时出现集中扎堆的现象?
  11. 阿拉伯数字转换成人民币大写金额的方法
  12. 数据仓库、LODP、OLAP
  13. 凤凰os进不去图形界面_凤凰os启动不了
  14. 计算机不显示苹果手机储存,苹果备份电脑显示内存不足怎么办
  15. [转贴]色彩调和的原理
  16. 推荐一个制作卡通头像的网站(超强)
  17. linux和windows认证sssd,linux – 使用sssd和Active Directory集成的麻烦
  18. 祝贺!80后“双一流”教授,当选院士!
  19. Python出现Non-ASCII character '\xe6' in file错误解决方法(pycharm)
  20. win10右键卡死/导航栏点击文件夹图标无法弹出资源管理器/右键cmd以管理员身份运行无反应

热门文章

  1. 帆软堆积柱形图标签显示汇总值,标签写js,树形图系列展示汇总值占比
  2. 架构师之路—理解设计模式
  3. Linux安装输入法后无法显示候选框
  4. 高等数学笔记:幂级数
  5. 制造型企业的数字化转型离不开 MES 系统
  6. android+中国+比例,2015年中国智能手机屏幕DPI区间关注比例、手机屏幕占比及手机操作系统情况分析【图】...
  7. vue如何打开新页面
  8. 实现文本diff比较与展示
  9. 三种常见的正则化模型研究2
  10. 景区票务系统的主要功能有哪些