移动web开发适配方案之Rem
移动端为什么要做适配
移动端相对PC端来说大部分浏览器内核都是基于Webkit的,所以大部分都支持CSS3的最新语法。但是由于手机的屏幕尺寸和分辨率都不太一样(尤其是安卓),所以不得不对不同分辨率的手机做适配来达到近似的展示效果。
一般来说,UI只会给我们提供一份设计图,目前比较多的是参考手机淘宝的方案给一份750px宽的设计稿,而我们前端要做的就是在不同分辨率的手机上以同样的效果展示这份设计稿。
在讲适配方案之前,有几个基本的移动端开始相关的知识点得了解一下
- rem单位: 说到rem这个单位就不得不提一下在它之前出现的一个类似单位em,em时相对于父级font-size的相对单位,而rem是相对于根节点html的相对单位,也就是说,当html的font-size为12px时,某一个元素的font-size设为1rem也就是等同于12px了。正因为rem单位的这一特性,从而让它可以成为移动端适配的一个关键单位。
- vw单位:相对于视窗的宽度,视窗宽度是100vw,与整个单位类似的是wh,就是视窗高度,视窗高度时100vh。更详细的特性可以参考视区相关单位vw, vh..简介以及可实际应用场景
- 物理像素: 也可以说是设备无关像素,例如iPhone6的分辨率(750x1334)指的是物理像素
- 逻辑像素: 是浏览器使用的抽象单位,状态是可变的,例如在PC浏览器调试面板上我们可以看到iPhone6的物理像素为(375x667)
- 物理像素与逻辑像素的关系就是设备像素缩放比dpr
适配思路
1、使用CSS的@media媒体查询设置在不同屏幕尺寸下现实不同的效果,类似于这样:
@media only screen and (min-width: 375px) {
.logo {
width : 62.5px;
}
}
@media only screen and (min-width: 360px) {
.logo {
width : 60px;
}
}
@media only screen and (min-width: 320px) {
.logo {
width : 53.3333px;
}
}
首先,这样只照顾了固定分辨率的机型,肯定是不够的,而且,如果针对页面上的每一个元素写这么多套适配也不现实,媒体查询还是比较适合PC端不同分辨率屏幕之间的适配。
2、使用css的单位rem,类似于这样:
@media only screen and (min-width: 375px) {
html {
font-size : 62.5px;
}
}
@media only screen and (min-width: 360px) {
html {
font-size : 60px;
}
}
当然,在实际开发中不可能真的这样去写,既然上面已经提到了rem这一单位的特性,那么我们要做的就是根据不同分辨率的设备动态地改变html的font-size就好,也就是1rem代表的大小。比较常见的有两种方案:
- 通过js动态获取屏幕的宽度,从而计算出html的font-size,还是拿日常开发常见的750px的设计稿为例:
let htmlWidth = document.documentElement.clientWidth || document.body.clientWidth;
let htmlDOM = document.getElementsByTagName('html')[0];
htmlDOM.style.fontSize = htmlWidth / 7.5 + 'px';
window.addEventListener('resize', (e) => {
let htmlWidth = document.documentElement.clientWidth || document.body.clientWidth;
htmlDOM.style.fontSize = htmlWidth / 7.5 + 'px';
})
这样一来,在375px宽的设备下,html的font-size就是50px,为什么要除以7.5呢,因为这样设计稿上的数值与需要得到的rem值正好是100倍的关系,这样便于换算,当然,引入了scss等预处理工具之后,取多少都不重要了,反正用一个处理函数统一转化一下就可以了,当html的font-size是37.5的时候:
@function px2rem ($px) {
$rem: 75;
@return ($px / $rem) + rem;
}
- 另一种方案同样是通过vw这一单位实现rem适配
- 上面那种方案说白了就是通过JS动态改变html的font-size的大小,而现在有这么一种单位本身的大小就会随着屏幕的变化而变化,那岂不是省去了JS操作Html字体大小的代码!
- 我最开始有点担心的是兼容性,不过从caniuse上查的的兼容性上来看兼容性还是比较高的,安卓版本大于4.0的浏览器都是兼容的的。尤其对于在微信上使用的H5页面是完全不用担心兼容性问题的
- 具体实现如下:
/*
当在Ip6下时,100vw代表375px,而视觉稿一般是750px,为了方便算,当html上的1rem代表50px时,
视觉稿上的像素跟rem就存在了100倍的转化关闭,而此时1vw代表是3.75px,所以html上的font-siez为50/3.75,
约等于13.33333vw,这样即使不用scss也是比较利于换算的
*/
html {background-color: #eee; font-size: 13.33333vw;}
设为上面这样一个数值同样是为了计算方便,当然不是必须的,在这样一个数值下,相对应的元素除以100就可以了,写成scss方法如下
@function px ($px) {
@return ($px / 100) + rem;
}
.demo2 {width: px(200); height: px(200); background-color: #ddd;}
我看了一下网易新闻的h5页面目前就是使用的这种方案
总结
最开始想写这篇文章是因为之前只知道通过JS动态调节html的font-size这么一种适配方案,刚好前段时间接触到了公司的一个移动端项目,我只是单独开发几个页面,但我发现是用的vw单位实现的rem方案,刚开始还觉得蛮新奇的,其实后来查资料仔细一想,跟JS那种方案本质上并没有什么区别,都是以屏幕宽度作为底,动态地调节了html的font-size,也就是1rem的大小。
为了写这篇文章又回看了慕课网上这个视频:移动web开发适配秘籍Rem,真的挺感谢这些大牛无私分享的。就像他所说的,移动web开发适配的方案有许多,然而最好的方案一定要掌握。Rem适配方案是我目前所看到的的使用的最多的,多多了解这种方法背后的原理和熟练掌握这种方法还是挺重要的,再次感谢这些大牛的精彩分享,希望我的总结在提升自己的同时也能帮到别人!
参考文章:
移动web开发适配方案之Rem的更多相关文章
- 移动web屏幕适配方案
刚进部门就被拉去趟移动端Web的浑水,视觉稿是按照640px设计的.那如何做屏幕适配呢?当然想到的第一方法就是问前辈了,问他们之前怎么做的,前辈说直接按视觉稿来,我说640太大了,他说除以2啊,按32 ...
- 移动web开发适配rem
移动的meta标签 <meta name="viewport" content="width=device-width, initial-scale=1,user ...
- 移动端适配方案以及rem和px之间的转换
背景 开发移动端H5页面 面对不同分辨率的手机 面对不同屏幕尺寸的手机 视觉稿 在前端开发之前,视觉MM会给我们一个psd文件,称之为视觉稿. 对于移动端开发而言,为了做到页面高清的效果,视觉稿的规范 ...
- 移动端适配方案(rem+flex)
为什么用rem不用px? 主流:各大网站的移动版绝大多数都是用的rem. 移动端屏幕分辨率差别太大:最低适配的iPhone6,分辨率仅为750*1334.而现在市面上大多数手机,都达到了1080* ...
- java web开发缓存方案,ehcache和redis哪个更好
Ehcache在java项目广泛的使用.它是一个开源的.设计于提高在数据从RDBMS中取出来的高花费.高延迟采取的一种缓存方案.正因为Ehcache具有健壮性(基于java开发).被认证(具有apac ...
- 移动端 移动web屏幕适配方案 随不同宽度的屏幕而改变
链接地址1:http://www.cnblogs.com/zjzhome/p/4802157.html 链接地址2:http://www.html-js.com/article/Mobile-term ...
- 移动端Web页面适配方案
概念理解 viewport视口 visual viewport 可见视口,设备屏幕的宽度 windw.innerWidth/Height layout viewport 布局视口,DOM宽度 doc ...
- web主题适配方案指北
前置知识 在这里了解实现网页主题切换的相关知识. CSS 变量 要实现主题切换需要了解一点 css 自定义属性.当然,本文还提供了其他实现方式,为了不给您接下来的阅读带来阻碍,先了解它. 变量的声明 ...
- 移动web开发之布局
移动web开发流式布局 1.0 移动端基础 1.1浏览器现状 PC端常见浏览器:360浏览器.谷歌浏览器.火狐浏览器.QQ浏览器.百度浏览器.搜狗浏览器.IE浏览器. 移动端常见浏览器:UC浏览器,Q ...
随机推荐
- ora-28056错误解决
问题描述:今天有同事找我,说是oracle数据库的监听器出现问题,我连接服务器查看后,发现不是监听器问题,而是进程连接数已经达到150个了,客户端连接不上服务器,因其是测试服务器,重启服务器后再次sq ...
- elk----es settings--logstash--performance---bigdesk---logstash plugin online/offline
www.cnblogs.com/tangr206/articles/2274845.html yum timeout error(/etc/resolv.conf) elk: elasticsearc ...
- php基础:面向对象
一.public.private.protected访问修饰符 public:任何都可以访问(本类.子类.外部都可以访问) protected:本类.子类都可以访问(本类.子类均可访问) privat ...
- Day21 过滤器(Filter)
day21 过滤器(Filter) 过滤器概述 1 什么是过滤器 过滤器JavaWeb三大组件之一,它与Servlet很相似!不它过滤器是用来拦截请求的,而不是处理请求的. 当用户请求某个 ...
- 怎么在Linux上抓包分析
怎么在Linux上抓包分析 1.在Linux上抓包 例如在Ubuntu上,用命令抓包, tcpdump tcp -i any -s0 -w desk.cap 用 sz desk.cap 把数据包 ...
- HTML---初识HTML
版权声明:本文为博主原创文章.不经博主同意注明链接就可以转载. https://blog.csdn.net/Senior_lee/article/details/33723573 H ...
- 用nginx的反向代理机制解决前端跨域问题在nginx上部署web静态页面
用nginx的反向代理机制解决前端跨域问题在nginx上部署web静态页面 1.什么是跨域以及产生原因 跨域是指a页面想获取b页面资源,如果a.b页面的协议.域名.端口.子域名不同,或是a页面为ip地 ...
- HTML基础之DOM常用操作
DOM(Document Object Model ),文档对象模型,主要用于对HTML和XML文档的内容进行操作. 一.查找节点 直接获取标签 document.getElementById('i1 ...
- PAT 1114 Family Property[并查集][难]
1114 Family Property(25 分) This time, you are supposed to help us collect the data for family-owned ...
- 远程终端登录软件MobaXterm
提到SSH.Telnet等远程终端登录,我相信很多人想到的都是PuTTY[注A]. PuTTY足够成熟.小巧.专注核心任务,并且对编码等常见坑的处理并不缺乏,这其实都是优点.但PuTTY在额外功能上就 ...