前端页面适配的rem换算

之前有些适配做法,是通过js动态计算viewport的缩放值(initial-scale)。

例如以屏幕320像素为基准,设置1,那屏幕375像素就是375/320=1.18以此类推。

但直接这样强制页面缩放过于粗暴,会导致页面图片文字失真模糊。

Px是相对固定单位,字号大小直接被定死,所以用户无法根据自己设置的浏览器字号而缩放,em和rem虽然都是相对单位,但em是相对于它的父元素的font-size,页面层级越深,em的换算就越复杂,而rem是直接相对于根元素,这就避开了很多层级关系。移动端新型浏览器对rem的兼容很好,可以放心使用。

有时我们会看到有些使用rem的页面里会先给页面根元素一个样式:

为什么是62.5%?

大多数浏览器的默认字号是16px,因此1rem=16px,这样不方便我们px和rem的换算,假设1rem=10px,那么100px=10rem,25px=0.25rem。这样就好换算很多,于是就有了上面的10/16。

如果是640的设计稿,需要除以2转化为和iphone5屏幕等宽的320。所以设计稿px单位/2/10转为rem。之后再媒体查询设置每个屏幕大小的font-size百分比,页面会根据上面设置的根font-size适配。

看到这里是不是觉得一切很完美?然而,这里面有两个深坑:

1.我看了网上很多关于rem的资料,基本都说浏览器的默认字号就是16px,然后直接定义font-size:62.5%。但是,rem属于css3的属性,有些浏览器的早期版本和一些国内浏览器的默认字号并不是16px,那么上面的10/16换算就不成立,直接给html定义font-size: 62.5%不成立。

2.chrome强制字体最小值为12px,低于12px按12px处理,那上面的1rem=10px就变成1rem=12px,出现偏差(下面给demo)。

解决方案: 将1rem=10px换为1rem=100px(或者其它容易换算的比例值);不要在pc端使用rem。

那么上面的页面根元素样式要改为:

再用本工厂总结得出的各分辨率媒体查询换算:

至此,坑填完。设计稿px换算直接/100即可得到rem值。

然而,上面的625%大法除了有兼容性问题,也无法很好地根据不同设计稿精准适配,不是我们的最佳选择。网易和淘宝分别有自己的一套适配方法,适配性也很完美。

  • 网易手机端: 基准值: 可以看到,无论页面以哪种手机比例缩放,body的width都是7.5rem。很明显,目前网易的手机端设计稿是基于iPhone6,750(设计师给的设计稿是物理分辨率,会是我们写样式的逻辑分辨率的两倍,如果给的设计稿是640,那么是基于iPhone5,320),且基准值是100px(750/7.5=100)。这个基准值很关键,后面的css换算,都和这个基准值有关。 动态font-size: 我们看到图1、图2、图3的font-size都有根据屏幕大小而动态改变,可以推算出公式:

    屏幕宽度/设计稿rem宽度=页面动态font-size值(如:375/7.5=50) 获取到这个值,再赋给html元素的style:

document.documentElement.style.fontSize = document.documentElement.clientWidth / 7.5 + 'px';

这样就设置好了每个页面的根fonts-size,因为rem单位是基于根font-size,因此只要确定一种设计稿对应手机的换算,其余屏幕尺寸均可自动适配。 上面我们得出设计稿换算rem的基准值是100,因此只需要把设计稿上的px值除以100即为我们要的rem值。

> Px/100=rem,所以100px=1rem,25px=0.25rem
  • 淘宝手机端: 大名鼎鼎的Flexible 资料引用

    大漠:使用Flexible实现手淘H5页面的终端适配 齐神:flexible解读及应用 很多大神包括我们公司同事都有对此适配方案做了解析,所以我这边简单综述: 引入: 直接引用阿里的CDN文件(或下载到本地引入) 设定: 页面不要设定 。Flexible会自动设定每个屏幕宽度的根font-size、动态viewport、针对Retina屏做的dpr。 换算: 假设拿到的设计稿和上述网易的一样都是750,Flexible会把设计稿分为10份,可以理解为页面width=10rem,即1rem=75px,所以根font-size(基准值)=75px。

之后的css换算rem公式为:

px/75=rem,所以100px=100/75=1.33rem,50px=50/75=0.66rem

安装好之后,做一些设置

px_to_rem – px转rem的单位比例,假设拿到设计稿750,基准值是75,此处就设75
max_rem_fraction_length – px转rem的小数部分的最大长度。默认为6。
available_file_types – 启用此插件的文件类型。[“.css”, “.less”, “.sass”, “.scss”]。

  • *通用方案

1、设置根font-size:625%(或其它自定的值,但换算规则1rem不能小于12px)

2、通过媒体查询分别设置每个屏幕的根font-size

3、css直接除以2再除以100即可换算为rem。

优:有一定适用性,换算也较为简单。

劣:有兼容性的坑,对不同手机适配不是非常精准;需要设置多个媒体查询来适应不同手机,单某款手机尺寸不在设置范围之内,会导致无法适配。

  • *网易方案

1、拿到设计稿除以100,得到宽度rem值

2、通过给html的style设置font-size,把1里面得到的宽度rem值代入x document.documentElement.style.fontSize = document.documentElement.clientWidth / x + ‘px’;

3、设计稿px/100即可换算为rem

优:通过动态根font-size来做适配,基本无兼容性问题,适配较为精准,换算简便。

劣:无viewport缩放,且针对iPhone的Retina屏没有做适配,导致对一些手机的适配不是很到位。

  • *手淘方案

1、拿到设计稿除以10,得到font-size基准值

2、引入flexible

3、不要设置meta的viewport缩放值

4、设计稿px/ font-size基准值,即可换算为rem

优:通过动态根font-size、viewpor、dpr来做适配,无兼容性问题,适配精准。

劣:需要根据设计稿进行基准值换算,在不使用sublime text编辑器插件开发时,单位计算复杂。

下面看看demo

设计稿:基于iPhone5,宽度640。

那么在开发模式,iphone5是320,所有数值均是设计稿一半大小。

期望效果:在iPhone5中,box1宽高50px,box2宽高125px,字体15px。其他屏幕终端自动适配。

可以看出,基于chrome iPhone5的调试,box1宽高是60,box2宽高是150。出现了误差,就是上文提到字号最小值强制12px的原因。

比例正常。

比例正常。

比例正常(Retina屏做了缩放)。

每个人评判的标准不同。但个人更倾向flexible,动态计算viewport和针对iphone手机的dpr缩放使得页面适配更加精确,而且手淘页面用户访问量比网易页面大很多。

有。当你的页面图片或者某一元素比例要固定,不想进行任何缩放时,rem就不适合了,这时候用px单位,能保证该元素不会因缩放而失真模糊。

from: https://www.cnblogs.com/liangxuru/p/6970629.html

Original: https://www.cnblogs.com/zjoch/p/9601518.html
Author: 遥望星空
Title: 前端页面适配的rem换算

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/547605/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • kube-scheduler的调度上下文

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    技术杂谈 2023年7月24日
    082
  • MySQL的三值逻辑

    MySQL 采用三值逻辑 SELECT 1 = 1; SELECT 1 = 2; SELECT 1 = NULL; SELECT 1 != NULL; 上面四条语句的结果分别为:可…

    技术杂谈 2023年7月25日
    058
  • Python数据分析–Numpy常用函数介绍(6)–Numpy中与股票成交量有关的计算

    成交量(volume)是投资中一个非常重要的变量,它是指在某一时段内具体的交易数,可以在分时图中绘制,包括日线图、周线图、月线图甚至是5分钟、30分钟、60分钟图中绘制。 股票市场…

    技术杂谈 2023年7月25日
    089
  • YSPASYS中小型企业简单员工评价考核系统

    背景:公司运营接近2年时间了,随着不断的有员工入职、离职,使用信息化管理员工各类信息是一件很有必要的事儿。诸如员工基本信息,内部公告,资产盘点,客户管理,工作周报,优秀员工评选,请…

    技术杂谈 2023年7月23日
    077
  • day5

    ! posted @2022-04-15 19:24 Novice!!! 阅读(6 ) 评论() 编辑 Original: https://www.cnblogs.com/brai…

    技术杂谈 2023年7月10日
    095
  • 背包问题(上)

    2. 01背包问题 有 (N) 件物品和一个容量是 (V) 的背包。每件物品只能使用一次。第 (i) 件物品的体积是 (v_i),价值是 (w_i)。求解将哪些物品装入背包,可使这…

    技术杂谈 2023年6月21日
    0110
  • 安装 Visual Studio Web Tools 的奇怪问题

    安装Microsoft ASP.NET 5 RC 1 时提示 0x80070005 – 拒绝访问 日志文件为 解决方案: C:\ProgramData\Package …

    技术杂谈 2023年5月31日
    0105
  • 前端 算法的时间复杂度和空间复杂度

    对于一个问题,经常有多种不同的求解算法,这时候我们就需要一个对算法进行评估的标准,找出最优的方案,评估一个算法有以下几个维度: 正确性:能正确的实现功能,满足问题的需求。 易读性:…

    技术杂谈 2023年5月31日
    079
  • Sentinel 整合OpenFeign降级

    package com.wsm.stock.controller; import org.springframework.beans.factory.annotation.Valu…

    技术杂谈 2023年5月31日
    081
  • [学习笔记]Java抽象类

    抽象类 在Java中所有的对象都是通过类来描述的,但不是所有的类都用于描述对象,抽象类就是这样一种存在; 抽象类不能用于实例化对象,但它也可以拥有普通类一样的成员变量、成员方法和构…

    技术杂谈 2023年7月24日
    077
  • 单张海报点击实例

    可以修改图片和链接,点击链接跳转,适合单张图片模块,店铺收藏、公告等。 <ui> <view> <container> <editProp…

    技术杂谈 2023年6月1日
    0104
  • 禁用Windows重复数据删除

    重复数据删除,可以减少磁盘占用,但使用不当也有可能增加IO,另外,也为此功能会将硬盘分块,所以当硬盘占用较高时,进行碎片整理也比较困难,所以有时需要禁用掉重复数据删除功能,并解除重…

    技术杂谈 2023年5月31日
    085
  • 陈宏申:浅谈京东电商商品文案挖掘难点与优化实践

    导读: 在电商推荐中,除了推送商品的图片和价格信息外,文案也是商品非常重要的维度。基于编码器解码器范式的序列文本生成模型是文案挖掘的核心,但该种方法面临着两大技术挑战:一是文案生成…

    技术杂谈 2023年7月25日
    067
  • 微信小程序性能优化

    作者:孟繁贵 Email:meng010387@126.com 期待共同进步! Original: https://www.cnblogs.com/mengfangui/p/163…

    技术杂谈 2023年5月31日
    081
  • Ubuntu下Mariadb数据库的安装和目录迁移

    1、简介 本文主要是 Ubuntu 下 Mariadb 数据库的安装和目录迁移,同样适用于 Debian系统:Ubuntu 20.0.4Mariadb:10.3.22注意:文中运行…

    技术杂谈 2023年7月24日
    076
  • Xshell、winscp连不上Linux虚拟机

    1.环境本地机器WIN7环境,使用VMware Workstation Pro安装的CentOS7,系统镜像CentOS-6.1-x86_64-netinstall.iso 2.问…

    技术杂谈 2023年7月25日
    063
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球