rem,vw,还是...?各凭本事的移动端适配方案(代码片段)

baimeishaoxia baimeishaoxia     2022-12-15     383

关键词:

前言

2018年最后的法定假期都已经结束了,我相信大部分正在进行或曾经进行过移动端页面开发的同学都或多或少的了解过使用rem进行移动端页面适配的方案以及使用vw的方案,(没了解过的同学可以参见大漠老师的这两篇文章 使用Flexible实现手淘H5页面的终端适配再聊移动端页面的适配)也面临过在不同适配方案间进行抉择的思考,我个人最近对于移动端适配方案也进行了一轮重新的研究,期间,对各种适配方案也有一些自己的见解,正好记录下来与大家一起分享。

vw与rem方案中的一些思考

所以,移动端适配 = vw or rem ?

当然不是。并不是所有场景下的移动端页面都适合采用vw或rem的方案,这类方案的本质是布局等比例的缩放,让页面在不同尺寸的屏幕下有类似于矢量图片缩放的效果,即保证页面各元素之间位置尺寸的比例关系,并让元素可以清晰地展现。
这样的方案更适合于视觉组件种类较多,视觉设计对元素位置的相对关系依赖较强的移动端页面。其实大部分页面都可以使用rem或vw的方案进行适配,但对于文本内容较多,或者说希望引导用户沉浸浏览的页面,我个人并不推荐使用等比缩放的方案,至少并不推荐完全使用等比缩放的方案,对于文本内容还是应该直接使用px这种绝对长度单位,毕竟在大屏手机上用户希望看到的是更多的内容而不是更大的内容。实际上很多这类的网站也确实是直接使用px结合flex等布局方式进行移动端适配的,这个在后面讨论具体技术方案的时候我会举几个例子。

rem方案到底在做什么?

在各种rem适配方案的实现中,有两个核心的点

  • 设置<meta name="viewport" content="xxx">(可以根据dpr缩放viewport,也可以直接使用1倍的视口大小)
  • 根据当前布局的宽度(通常是viewport宽度, 也可以是被限制的最大/最小布局宽度)来设置html元素的font-size

之前我已经提到过,vw和rem的方案的本质都是“等比例缩放”,因为vw和rem都是相对长度单位(relative length unit),可以很好的满足这个需求。区别是vw是viewport width的1%,而rem是html元素的font-size。当我们让html元素的font-size与viewport width产生了关联后,rem就可以模拟出使用vw进行布局的效果了。所以在rem方案中,我们只是在把rem当做是vw的影子。写作rem,读作vw...(剧情似乎狗血起来了... rem: 当然是选择原谅你们啊)
技术图片

那直接用vw不就完事儿了吗?

技术图片

且慢,当初之所以使用rem的方案流行开来正是因为在那时viewport units的浏览器支持程度不甚理想(IOS 8+, Android 4.4+ 参见viewport units的caniuse)。而相比较之下rem就好多了(IOS 4.1+, Android 2.1+ 参见caniuse),所以对于vw,在当时的大环境下前端想说爱你不容易。

我想这时候有人要说了:“醒醒兄弟 已经8102年了!”
是的,8102年都快要过去了,对于兼容性要求不是特别高的情况下vw也算是可以见天日了,并且也有一些针对vw的补丁方案,但还有一个问题我们要稍微讨论一下...

vw可以完全替代rem吗?

回答依旧是否定的。单纯使用vw进行布局不能限制布局的宽度,对于有这个需求的场景至少还是需要将vw和rem混用来处理边界情况。下文也会更详细地提到这种方案,这里先按下不表。

现有生产环境中移动端适配方案的一点总结

当我们在苦苦地寻找适合自己的道路时,不妨先抬头看看别人是怎么做的。那么现实世界里各家互联网公司的移动端页面都采用了什么样的适配方案呢?有没有一些比较有特色的绝活儿呢?以下我按照页面实际使用的css长度单位作为划分标准,为大家举一些栗子。

px方案

就像开篇提到的,并不是说移动端就一定要使用相对长度单位,传统的响应式布局依然是很好的选择,尤其在新闻,社区等可阅读内容较多的场景直接使用px单位可以营造更好地体验。px方案可以让大屏幕手机展示出更多的内容,更符合人们的阅读习惯。采用这种方案的网站有:

  • 腾讯

    移动端首页主要是新闻内容,需要更好的阅读体验,适合直接使用px进行布局。

  • 知乎

    知乎也是比较典型的追求阅读体验的场景,不出意外的也是直接使用px。

  • 点评

    视觉元素较丰富,依旧采用了px方案,页面基本是flex布局,适配效果很好

  • 头条

    头条的这个方案有点特色,依然会设置html元素的font-size也会加上data-dpr属性并且会对viewport进行scale, 但是最终css的输出还是px,并没有使用rem,并且会对不同dpr下的样式单独定义,如下图所示:

技术图片
这样可以解决1px border的问题,文字大小也不会随屏幕尺寸变动(毕竟文本内容较多),虽然我暂时没找到使用到rem的地方,但确实可以在需要的时候对特殊元素做rem方案的布局,不过这种方案应该会造成css文件大小倍增,而且输出这样的css肯定也少不了构建流程插件的支持,算是一种特定的解决方案吧。

看到这里你以为最终输出px就不能做类似于rem/vw的弹性布局了吗,下面就给大家看一手绝活儿...

  • 淘宝

    什么?给我们看了半天文章结果用的是px?
    其实聪明的你一定很快就会发现在效果上淘宝移动端的适配方案和rem/vw的方案其实是差不多的,元素的样式都是通过js生成的,虽然单位确实是px,但是方案依旧是以375px宽度的尺寸为基准进行缩放的。原理上应该是一种css in js的方案,只不过把rem方案中设置html元素font-size的过程内化到使用js计算元素style的过程中去了。这样的方案涉及到整体的开发框架上的统一与支持,并不算是一个特别通用的方案。好处可能是直接使用px单位结果更为精确。可以说是一手绝活儿了。当然淘宝旗下还是有非常多的产品线的,也未必是同样的适配方案(比如大漠老师文中的例子),这里只针对这个移动端首页来说。

rem方案

rem方案可以说是比较成熟了,出镜率也较高,也就不再赘述了,总的来说rem方案主要分为两种,一种是缩放viewport的方案,如当年的lib-flexible,可以对1px border等细节问题较方便的处理,但会影响到media query。另一种就是不缩放viewport,对1px boder等问题单独引入处理方案。然后对于基准尺寸下的html元素fong-size也有很多不同的定义方式,这个说起来没什么标准可言,我就随便举几个例子说明吧:

不缩放viewport

(以下说明的rem与px的对应关系都是在屏幕宽度为375px的情况下)

  • 马蜂窝
    1rem = 37.5px
  • 小米
    1rem = 52.0833px
  • 小红书
    1rem = 50px
  • 微博

    1rem = 16px
    稍微说明下 微博的font-size是根据media query来生成的

缩放viewport

(以下说明的rem与px的对应关系都是在屏幕宽度为375px, viewport scale 0.5的情况下)

vw方案

来了,终于来了!前面说了这么多关于vw的问题,到底有没有现有的产品在大规模的使用vw的方案呢?兼容方案又是怎么做的呢?

  • 京东

    京东的移动端首页采用了vw+rem的布局方式,元素布局上依然使用rem单位,没有缩放viewport, html元素的font-size则使用vw + px fallback的形式,并且使用media query来限制布局宽度,如下图所示

    正常情况下:

技术图片

边界情况下

技术图片

  • 网易

    网易的方案和京东基本相同,没有缩放viewport,使用media query,只处理html元素的font-size,并限制布局宽度。

  • 饿了么

    饿了么也是采用的vw+rem的方案,不过对viewport进行了缩放,也没有限制布局宽度,html元素的font-size依然由px指定,但是具体元素的布局上使用vw + px fallbak的形式,如下图所示:

技术图片

可以看到,使用上述两种vw+rem的方案对现有的rem方案的改动都不会很大,都采用了vw + fallback的方式,兼容性问题得到了保证,只是饿了么的方案可能更需要构建过程中的插件支持(关于这个,后面我给你们解释解释什么叫惊喜)。这样来看,对于大漠老师提出的vw方案中使用viewport-units-buggyfill库进行兼容的做法,我个人就并不是很推荐了,因为该库使用了css content属性进行兼容处理,官方文档中就指出了对部分浏览器的img标签有影响 ,需要全局引入一条css规则。且对于需要正常使用content的情况(如:图标字体)也会引起不可避免的冲突,另外也不支持伪元素的兼容。所以从我个人的角度来说,如果你一定要问我使用怎样的vw适配方案,我会推荐给你上述两种vw + rem的方案。
技术图片

这就是全部了吗?

当然不是,我只是列举了几个比较典型的移动端适配方案,其实在具体实现的细节上可以自行把握的点还是很多的,适合的终归才是最好的,那颗银弹或许不会出现,但我们的手中也从未缺少过利器。

彩(an)蛋(li)部分

相信大多数同学也是有想法在实际开发中把vw融入到现有的移动端适配方案中的。如我上述提到的两种vw+rem方案,只修改html元素font-size的方案对于已经在使用rem方案的同学来说改动的成本并不大,只需要在原本的media query 里(或js生成style时)在font-size: *px后面加上font-size: *vw就可以了,如需限制布局宽度则需多加一点判断。

而对于饿了么那种在使用到长度单位时同时输出rem+vw的方式,肯定是要通过一点额外的插件来做了。如果你和我一样刚好在使用Stylus作为css预处理器,那我专门写了一个Stylus的插件用来帮你处理这个问题。
这个插件可以让你在开发流程使用px书写css, 和现有的部分插件不同的是,它同时支持多种适配方案的输出,目前支持rem,纯vw方案以及刚才提到的vw+rem方案的输出。并且对不希望转换px的场景做了很方便的处理。也就是说,如果你现在使用rem方案,可以直接替换使用该插件,当你需要切换到vw或vw+rem方案时基本可以做到无缝切换。

具体的使用方式和示例请参见pandaGao/stylus-px-to-relative-unit

技术图片















移动端适配rem(代码片段)

.../2即可。如果是小程序,不需要除以2。htmlfont-size:26.66vw;//移动端适配这里使用rem+vw方案省去媒体查询第二种:媒体查询按照750设计稿,根元素是100px,兼容性比较好。htmlfont-size:625%;/*100÷16×100%=625%*/@mediascreenan 查看详情

rem与vw适配方案

参考技术A在做移动端适配的同学们都应该知道我们都是用rem布局做移动端适配但是过了这么多年了,vw的兼容性已经很好了,现在我们可以直接切换到vw了。首先remr就是root意思,始终跟着body的字体大小变动,不跟随父元素改动... 查看详情

h5在移动端尺寸适配方案

参考技术A要使用rem,就要设置rootfontsize,一般我们设置rootfontsize等于设计稿宽度的十分之一就可以了。比如750px宽度的设计稿,设置rootfontsize为75px即可。也就是说1rem=75px首先要根据页面尺寸变化,设置rootfontsize,然后根据设计... 查看详情

vue项目中的移动端适配方案

...px转为rem,配合跟元素大小的随视口大小改变,可以实现移动端的适配。总而言之,如果设计稿为750px,那么1vw=7.5px,100vw=750px。其实设计稿按照设么都没多大关系,最终转化过来的都是相对单位,我们可以使用插件帮助我们把书... 查看详情

基于vw实现移动端适配(代码片段)

...浏览器限制最小的字体大小为12px,0.1333...vw显然在大部分移动设备上是不到12px的,如iPhone6的逻辑宽度为375px,0.1333...vw=375px*0.1333...%<<12px因此我们让1rem=0.1333...vw*100=13.333...vw,突破浏览器字体大小限制的同时,也保留了10进制... 查看详情

antdesignvue手机怎么适配

...下:目标一、手机适配:就是页面上的尺寸,无论高度,还是宽度,还有字体,随屏幕的宽度变化!这里是屏幕宽度!是不是想到了vw,对,就是这个意思;——最大程度在各个尺寸屏幕上还原设计稿目标二、px转换成rem:一般UI... 查看详情

08-移动端开发教程-移动端适配方案

由于移动端的特殊性,屏幕的尺寸碎片化严重,要想很好的适配不同的尺寸的设备,需要我们前端开发相比PC端要做一些基层的适配方案。1.常见的适配方案百分比+固定高度布局方案固定屏幕为理想视口宽度少许的媒体查询设置... 查看详情

为什么说移动端该放弃rem适配方案了?

...真原文:https://juejin.cn/post/70849266460330557521.背景在做移动端各种尺寸屏幕的适配时,用的最多的就是rem方案。我们都写过这样的代码,来设置根字体大小。这个计算公式中设备宽度,UI设计稿尺寸这两个参数比较好理解&... 查看详情

细说移动端经典的rem布局与新秀vw布局(代码片段)

和以往一样,本次项目也放到了Github中,欢迎围观star~ 1.前言2.基本概念3.REM布局4.VW布局 实现单边边框1px 实现多边边框1px  实现边框圆角 实现容器固定纵横比5.REM+VW布局6.对比选择  方案选择  食用... 查看详情

html移动端适配方案rem

为了做到一次开发的网页能够在不同尺寸的移动端设备上适配,我们需要使设计稿上标注的固定尺寸在不同设备上按照设备大小的比例显示不同的尺寸。比如设计稿是按照 IPhone6 的 750px 像素设计的,设计稿上的头... 查看详情

移动端高清多屏适配方案——rem

背景:开发移动端H5页面一套设计图不同尺寸的手机不同分辨率的手机方案:使用rem作为单位解决一套设计图适应不同分辨率,不同尺寸的手机。概念:REM(fontsizeoftherootelement).相对于<html>的font-size的计算方式。dpr(devicepixelrati... 查看详情

移动端适配方案-rem(基础篇)

    常见移动web适配方案一般有3种方法,如下图:      ①:定高,宽度百分比(百分比适配简单,一般用来做一些适配性不高的页面,比如只有一些文字和图片等简单的屏幕适配)    ②:flex(更多的用于复... 查看详情

移动端

 webapp制作标准1.自适应手机端任何尺寸设备2.多平台UI表现一致3.完美适配不同设备浏览器  rem能等比适配所有屏幕,IE6/7/8不适配em浏览器最小解析字号为12px,rem不能低于12px  vw=‘viewwidth‘vh=‘viewheight‘100vw=100%... 查看详情

基于rem的移动端响应式适配方案(详解)移动端h5页面的设计稿尺寸大小规范

基于rem的移动端响应式适配方案(详解):  https://www.jb51.net/article/118067.htm 移动端H5页面的设计稿尺寸大小规范  http://www.tuyiyi.com/v/53039.html 查看详情

移动端适配---响应式布局---rem布局---vw布局(代码片段)

rem和vw布局主要都是为了更好地适配移动端,毕竟手机的型号太多了。在进行移动端设计的时候,首先要引入一个meta标签。(禁止用户缩放)1<metaname="viewport"content="width=device-width,initial-scale=1.0,minimum-scale=1.0,maximum-scale=1.0,user-sca... 查看详情

移动端布局适配(px,em,rem,vh,vw)

参考技术Apx就是pixel像素的缩写,相对长度单位,网页设计常用的基本单位。像素px是相对于显示器屏幕分辨率而言的em是相对长度单位。相对于当前对象内文本的字体尺寸(参考物是父元素的font-size)如当前父元素的字体尺寸未... 查看详情

移动端适配方案(代码片段)

首先,我们需要知道rem和em的基本概念。rem:相对于html根元素的fontsize。em:相对于当前元素的字体大小。rem和em都能够根据屏幕大小做适配。 一、假设现在给出我们一张750px的设计图,我们在设计图上量出200px*200px的div大小,并... 查看详情

移动端适配js

移动端适配方案非常多,入行两年来始终没有一直使用一个标准,每个项目都按照业务需求来做适配方案一:最初听李彦辉老师的课程使用rem布局了一段时间,但是字体计算比较麻烦,也不太精确方案二:偶然在Q群里一群友分... 查看详情