前端移动端的rem适配计算原理
rem是什么?
rem(font size of the root element)是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。看到rem大家一定会想起em单位,em(font size of the element)是指相对于父元素的字体大小的单位。它们之间其实很相似,只不过一个计算的规则是依赖根元素一个是依赖父元素计算。
计算原理:
1 屏幕宽为 clientWidth(px)。 设计稿宽度为 750 (px), 假设 n = clientWidth(px)/750(px);单位化简===> n= clientWidth/750 ;
2 将 html的 font-size: n(px);
3 则有 n(px) = 1(rem) ,因为1rem为根节点(html节点)字体的大小一倍;
4 假设有一个 div ,在设计稿测量的宽度为 ruleW(px);
5 则需要写入的宽度 width: 设为 w (单位暂不确定)
6 则有 w/clientWidth(px) = ruleW(px)/750(px) 单位化简===> w/clientWidth(px) = ruleW/750
7 化简 w = (clientWidth/750)*ruleW(px) 化简==> w = n*ruleW(px) 转换 w = ruleW * n(px)
8 最后得出 w = ruleW * 1(rem) = ruleW(rem);
结论: 当我们设置html的font-szie为 (屏幕宽度/设计稿宽度) 的px 时
当我们在设计稿上测得的 px 单位值,直接将值换为 rem单位写到代码里面即可,这点与微信小程序的 rpx 单位适配类似
问题: 上面推导完全按照 数学问题来推算,忽略了一个重要的问题,就是浏览器存在最小字体,不得小于 12px,当我们设置 font-size: n(px) ; 屏幕宽度除以750可能已经很小了,这个比例已经不太合适了,所以我们把它放大一百倍
放大比例计算规则如下:
1. n = clientWidth(px)/750(px); n2 = clientWidth(px)/7.50(px); n * 100 = n2; n2为n放大后的比例
2. 将 html的 font-size: n2(px); n2为放大后的比例
3. 则有 n2(px) = 1(rem) , n (px) * 100 = 1(rem) , n(px) = 1/100 (rem);
4 假设有一个 div ,在设计稿测量的宽度为 ruleW(px);
5 则需要写入的宽度 width: 设为 w (单位暂不确定)
6 则有 w/clientWidth(px) = ruleW(px)/750(px) ,注意这里还是除以 750, 单位化简===> w/clientWidth(px) = ruleW/750
7 化简 w = (clientWidth/750)*ruleW(px) 化简==> w = n*ruleW(px) 转换 w = ruleW * n(px)
8 最后得出 w = ruleW * 1/100(rem) = (ruleW/100)(rem)
结论: 当我们设置html的font-szie为 (屏幕宽度*100/设计稿宽度) 的px 时 当我们在设计稿上测得的 px 单位值,直接将值除以100换为 rem单位写到代码里面即可
下面给出几种适配方案:
所有的使用例子,以一个 div ,在 750 的设计稿中测的 宽度 750 px 、高度 80px 、 背景 pink
1、js适配,在html页面的 head标签内加入如下代码: (推荐)
<script type="text/javascript">
//手机端的适配
document.addEventListener("DOMContentLoaded",function(){
document.getElementsByTagName("html")[0].style.fontSize=(document.documentElement.clientWidth/750)*100+"px";
}); window.onresize = function(){
document.getElementsByTagName("html")[0].style.fontSize=(document.documentElement.clientWidth/750)*100+"px";
}
</script>
使用
div{
height: .8rem;
width: 7.5rem;
background: pink;
}
2、css的 calc适配 (推荐)
html{
font-size: calc(100vw / 7.5);
}
使用
div{
height: .8rem;
width: 7.5rem;
background: pink;
}
3、less 适配(不是和很标准)
.re(@width) {
@xs: 100px/(750px/@width);
@media (max-width:(@width + 1px)) {
html {
font-size: @xs;
}
}
}
.re(1600px);
.re(1440px);
.re(1280px);
.re(1024px);
.re(960px);
.re(950px);
.re(900px);
.re(800px);
.re(773px);
.re(768px);
.re(736px);
.re(732px);
.re(731px);
.re(667px);
.re(640px);
.re(600px);
.re(568px);
.re(533px);
.re(435px);
.re(414px);
.re(411px);
.re(384px);
.re(375px);
.re(360px);
.re(320px);
使用:
div{
height: .8rem;
width: 7.5rem;
background: pink;
}
4、scss 适配
// 计算rem的基准字体
$rem-base-font-size: 100px; // UI设计图的分辨率宽度
$UI-resolution-width: 750px; // 需要适配的屏幕宽度
$device-widths: 240px, 320px, 360px, 375px, 390px, 414px, 480px, 540px, 640px, 720px, 768px,1080px, 1024px; @mixin html-font-size() {
@each $current-width in $device-widths {
@media only screen and (min-width: $current-width) {
html {
$x: $UI-resolution-width / $current-width; //计算出是几倍屏
font-size: $rem-base-font-size / $x;
}
}
}
} @include html-font-size(); @function pxToRem($px) {
@return $px / $rem-base-font-size * 1rem;
}
使用:
div{
height: .8rem;
width: 7.5rem;
background: pink;
}
或者:
div{
height: pxToRem(80px);
width: pxToRem(750px);
background: pink;
}
总结: 一般使用第一种,或者第二种较多,
最后 ipad 上的布局
注意:第一种,或者第二种 两种方式在 ipad上面,会出现问题,因为ipad的宽度大于高度,类似于 pc的布局。其实就是一个缩小版的pc,可以直接用 px写布局。
实际上,如果确定在 ipad 上面,就不需要再缩放了。直接还原为 pc布局,,为了同时兼容 手机端 和 ipad 。所以我们将 第一种方式修改一下
;(function(){
function loaded(){
var ua = navigator.userAgent.toLowerCase();
if(/ipad/i.test(ua)){
//是 ipad
document.getElementsByTagName("html")[0].style.fontSize="50px"; //等同于缩小一倍,这个值,自己可以调整
}else{
var width = document.documentElement.clientWidth;
document.getElementsByTagName("html")[0].style.fontSize=(width/7.50)+"px";
}
}
document.addEventListener("DOMContentLoaded",loaded);
loaded();
}());
在 ipad上面 设置 html 的字体为 50px的原因是,因为我们在移动端,设置了字体为 缩小100后的 rem。还是上面的例子:
div{
height: .8rem;
width: 7.5rem;
background: pink;
}
以宽度来解析:
实际在 ipad 中的网页呈现为 0.8 rem => 0.8 * 50 px = 40px; 也就是说,我原本在设计稿上测的 80px ,在 ipad上面只展示为 40px。缩小一半,因为 ipad 看上去就像是缩小版的pc。当然这个比例可以自己调整。
前端移动端的rem适配计算原理的更多相关文章
- 移动端使用rem适配及相关问题
移动端适配方案,说多也很多.可以使用百分比布局,但百分比与em都是基于父元素进行计算的,在实际应用中不是很方便.使用rem不仅可以设置字体大小,块大小也可以设置.而且可以良好的适配各种终端,所以这方案 ...
- 移动端的rem适配
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- Vue-cli4.xPC端项目Rem适配
适配准备 安装 (amfe-flexible) 和(postcss-px2rem) 1, 安装依赖并在main.js中引入该依赖 npm i amfe-flexible import "am ...
- 移动web端使用rem实现自适应原理
1.先获取到物理像素和实际像素的像素比 var pixclPatio = 1 / window.devicePixelRatio; 2.viewport视口设置为像素比大小 document.writ ...
- 谈谈我的移动端rem适配方案
最近有点怀疑人生,毕竟一个人写前端,有时候会怀疑自己理解的一些东西包括用法有没有符合标准.趁着这阵子闲下来,翻了翻别人的rem适配博客,发现有点绕口,怪自己是个强迫症,啥都要自己去试试结果并从中理解, ...
- 移动端rem适配屏幕
九月已成历史,十月如期而至...可能是九月工作比较清闲,周记就没怎么写,十月决不能这么堕落,立贴为证,至少保证5篇博客!!!如果没学到什么新知识,就对以往的那些工作中常用到的知识点做个总结...话不多 ...
- 自动改变html font-size,实现移动端rem适配
移动端采用rem适配非常方便 比如在iphone6尺寸下,将html font-size 设置为 100px,那么写css时,只要将尺寸/100 + rem 即可. 在iphone6Plus尺寸下,h ...
- 这次我好像才真的明白了CSS Rem字体计算的原理
背景 如何按照设计稿中标注的尺寸,直接写页面的样式,不再需要px2rem这样的工具或者人工转换 ? 只要你明白了rem的计算原理,这个问题的答案超级简单. 根字体大小计算核心原理 设备的根字体大小 * ...
- 移动端页面开发适配 rem布局原理
主题 HTML移动端页面开发适配 rem布局原理 什么是适配,为什么要适配 我们拿到的设计图一般是以640,750,1080分辨率为基准设计的,而现在的手机终端各式各样,分辨率不同,逻辑像素不同 ,适 ...
随机推荐
- Mac搭建C语言环境
Mac搭建C语言环境 创建一个工程目录 /Users/chennan/cproject 配置sublime运行环境 打开sublime text3,通过下面的步骤一次点击 Tools(工具)-> ...
- POX flow_stats2.py analysis by uestc_gremount
该程序是POX WIKI上的程序,我只是将统计的报文修改了以下,并做了对这个程序运行流程的分析: 1.程序从launch开始运行 2.监听2个事件,如果监听到"FlowStatsReceiv ...
- CodeForces - 1189E Count Pairs(平方差)
Count Pairs You are given a prime number pp, nn integers a1,a2,…,ana1,a2,…,an, and an integer kk. Fi ...
- vuecli3集成easyui
思路是这样的,首先要将jquery设置成全局,然后就可以正常使用easyUI了. jquery安装命令: npm install --save jquery jquery-easyui安装命令: np ...
- Docs-.NET-C#-指南-语言参考-预处理器指令:#undef(C# 参考)
ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#undef(C# 参考) 1.返回顶部 1. #undef(C# 参考) 2018/06/30 #undef 允许你定义一个符 ...
- Angular 中的数据交互(get jsonp post)
一.Angular get 请求数据 Angular5.x 以后 get.post 和和服务器交互使用的是 HttpClientModule 模块. 1.在 app.module.ts 中引入 并注入 ...
- Realsense D430 save
rs-save-to-disk.cpp // License: Apache 2.0. See LICENSE file in root directory. // Copyright(c) 2015 ...
- osgViewer::Viewer::Windows
osg自带窗口去掉边框 #ifdef _WIN32 #include <Windows.h> #endif // _WIN32 #include<iostream> #incl ...
- 导出 VuePress构建的网站为 PDF
前言 学 Rust 也有一段时间了,网上也有不少官方文档的中文翻译版,但是似乎只有 Rust中文网站 文档一直是最新的,奈何并没有 PDF 供直接下载,是在是不太方便,为了方便阅读以及方便后续文档更新 ...
- (十)Centos之文件搜索命令find
1.1 find [搜索范围] [搜索条件](搜索文件) find是在系统当中搜索符合条件的文件名. 如果需要匹配,使用通配符匹配,通配符是完全匹配. * 匹配任意内容 ?匹配任意一个字符 []匹配任 ...