当前位置: 首页 > news >正文

rem是如何实现自适应布局的

rem是什么?

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

为什么web app要使用rem?

这里我特别强调web app,web page就不能使用rem吗,其实也当然可以,不过出于兼容性的考虑在web app下使用更加能突显这个单位的价值和能力,接下来我们来看看目前一些企业的web app是怎么做屏幕适配的。

1、实现强大的屏幕适配布局:

最近iphone6一下出了两款尺寸的手机,导致的移动端的屏幕种类更加的混乱,记得一两年前做web app有一种做法是以320宽度为标准去做适配,超过320的大小还是以320的规格去展示,这种实现方式以淘宝web app为代表作,但是近期手机淘宝首页进行了改版,采用了rem这个单位,首页以内依旧是和以前一样各种混乱,有定死宽度的页面,也有那种流式布局的页面。

我们现在在切页面布局的使用常用的单位是px,这是一个绝对单位,web app的屏幕适配有很多中做法,例如:流式布局、限死宽度,还有就是通过响应式来做,但是这些方案都不是最佳的解决方法。

好多网站都是采用的流式布局的技术实现的,他们在页面布局的时候都是通过百分比来定义宽度,但是高度大都是用px来固定住,所以在大屏幕的手机下显示效果会变成有些页面元素宽度被拉的很长,但是高度还是和原来一样,实际显示非常的不协调,这就是流式布局的最致命的缺点,往往只有几个尺寸的手机下看到的效果是令人满意的,其实很多视觉设计师应该无法接受这种效果,因为他们的设计图在大屏幕手机下看到的效果相当于是被横向拉长来一样。

2、固定宽度做法
固定页面宽度的做法,早期有些网站把页面设置成320的宽度,超出部分留白,这样做视觉,前端都挺开心,视觉在也不用被流式布局限制自己的设计灵感了,前端也不用在搞坑爹的流式布局。但是这种解决方案也是存在一些问题,例如在大屏幕手机下两边是留白的,还有一个就是大屏幕手机下看起来页面会特别小,操作的按钮也很小,手机淘宝首页起初是这么做的,但近期改版了,采用了rem。

3、响应式做法
响应式这种方式在国内很少有大型企业的复杂性的网站在移动端用这种方法去做,主要原因是工作大,维护性难,所以一般都是中小型的门户或者博客类站点会采用响应式的方法从web page到web app直接一步到位,因为这样反而可以节约成本,不用再专门为自己的网站做一个web app的版本。

4、设置ViewPort进行缩放
天猫的web app的首页就是采用这种方式去做的,以320宽度为基准,进行缩放,最大缩放为320*1.3 = 416,基本缩放到416都就可以兼容iphone6 plus的屏幕了,这个方法简单粗暴,又高效。说实话我觉得他和用接下去我们要讲的rem都非常高效,不过有部分同学使用过程中反应缩放会导致有些页面元素会糊的情况。

<meta name="viewport" content="width=320,maximum-scale=1.3,user-scalable=no">

rem能等比例适配所有屏幕
上面说过rem是通过根元素进行适配的,网页中的根元素指的是html我们通过设置html的字体大小就可以控制rem的大小。举个例子:

html{
    font-size:20px;
}
.btn {
    width: 6rem;  //120px
    height: 3rem;  //60px
    line-height: 3rem;
    font-size: 1.2rem;
    display: inline-block;
    background: #06c;
    color: #fff;
    border-radius: .5rem;
    text-decoration: none;
    text-align: center;    
}

上面的demo中我们知道改变html的font-size可以等比改变所有用了rem单位的元素
此外,我们还可以通过JS去动态计算根元素的font-size,这样的好处是所有设备分辨率都能兼容适配,淘宝首页目前就是用的JS计算。但其实不用JS我们也可以做适配,一般我们在做web app都会先统计自己网站有哪些主流的屏幕设备,然后去针对那些设备去做media query设置也可以实现适配,例如下面这样:

html {
    font-size : 20px;
}
@media only screen and (min-width: 401px){
    html {
        font-size: 25px !important;
    }
}
@media only screen and (min-width: 428px){
    html {
        font-size: 26.75px !important;
    }
}
@media only screen and (min-width: 481px){
    html {
        font-size: 30px !important; 
    }
}
@media only screen and (min-width: 569px){
    html {
        font-size: 35px !important; 
    }
}
@media only screen and (min-width: 641px){
    html {
        font-size: 40px !important; 
    }
}

上面的做的设置当然是不能所有设备全适配,但是用JS是可以实现全适配。具体用哪个就要根据自己的实际工作场景去定了。

rem自适应js代码:

window.onload=function(){
            (function(win,doc){
                function change(){
                    doc.documentElement.style.fontSize = 20 * doc.documentElement.clientWidth / 375 + 'px';
                    //fontSize的值就是1rem大小                  获取页面宽度                    375是一个基准,可以写其他值
                    //在页面宽度为375px的时候1rem大小为20px;页面宽度发生变化,fontSize的值会变化,rem值页面相应的变化,但是只需要根据设计图的尺寸来就可以,移动端一般都给双倍图,常用的320(ipone5,5s),375(ipone6,6s,7)
                }
                change();
                win.addEventListener('resize', change, false);
                //当页面发生缩放的时候,调用change时间,页面发生相应的变化
            })(window,document)
        }

相关文章:

  • 如何实现图片的异步加载
  • AMD和CMD的区别
  • 使用Cesium.js加载3D模型
  • js中for in与for of之间的差异
  • Cesium实现三维可视化一般步骤
  • Vue2.0 探索之路——生命周期和钩子函数的一些理解
  • vuejs实践todolist列表
  • vue中的watch监听事件机制
  • CommonJS、AMD、CMD的区别
  • npm局部安装和全局安装文件的区别
  • querySelector操作dom的用法
  • webpack打包文件出错
  • npm中的--save-dev与--save的区别
  • vue-router路由导航钩子
  • javascript本地上传并解析excel文件
  • 【Leetcode】101. 对称二叉树
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • leetcode386. Lexicographical Numbers
  • MySQL Access denied for user 'root'@'localhost' 解决方法
  • Nacos系列:Nacos的Java SDK使用
  • node.js
  • Sequelize 中文文档 v4 - Getting started - 入门
  • SpiderData 2019年2月13日 DApp数据排行榜
  • 案例分享〡三拾众筹持续交付开发流程支撑创新业务
  • 利用阿里云 OSS 搭建私有 Docker 仓库
  • 设计模式(12)迭代器模式(讲解+应用)
  • 微信小程序实战练习(仿五洲到家微信版)
  • 项目管理碎碎念系列之一:干系人管理
  • ​2021半年盘点,不想你错过的重磅新书
  • # C++之functional库用法整理
  • #[Composer学习笔记]Part1:安装composer并通过composer创建一个项目
  • #LLM入门|Prompt#3.3_存储_Memory
  • $.proxy和$.extend
  • (2)STM32单片机上位机
  • (2009.11版)《网络管理员考试 考前冲刺预测卷及考点解析》复习重点
  • (3)Dubbo启动时qos-server can not bind localhost22222错误解决
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (大众金融)SQL server面试题(1)-总销售量最少的3个型号的车及其总销售量
  • (二)springcloud实战之config配置中心
  • (转)编辑寄语:因为爱心,所以美丽
  • (转)微软牛津计划介绍——屌爆了的自然数据处理解决方案(人脸/语音识别,计算机视觉与语言理解)...
  • * CIL library *(* CIL module *) : error LNK2005: _DllMain@12 already defined in mfcs120u.lib(dllmodu
  • .NET 事件模型教程(二)
  • .NET关于 跳过SSL中遇到的问题
  • .net知识和学习方法系列(二十一)CLR-枚举
  • .Net中间语言BeforeFieldInit
  • [ 英语 ] 马斯克抱水槽“入主”推特总部中那句 Let that sink in 到底是什么梗?
  • [20150629]简单的加密连接.txt
  • [383] 赎金信 js
  • [Android Studio 权威教程]断点调试和高级调试
  • [Angular 基础] - 指令(directives)
  • [APIO2012] 派遣 dispatching