[CSS]了解REM移动端适配方案

BitRanger
• 阅读 3133

REM 是什么

首先了解一下 CSS 中一些常见的长度单位:

  • px 绝对长度单位,像素

注意:浏览器(Chrome)默认文字大小为 16px,所能设置的最小单位为 12px

  • em

相对长度单位,这个单位表示元素的font-size的计算值。如果用在font-size 属性本身,它会继承父元素的font-size。

如果元素的 font-size 为 16px,元素的宽度设置为 width = 10em,则 width = 10em = 160px;如果元素父元素的 font-size 为 12px,元素的 font-size 设置为 font-size = 2em,则元素的 font-size = 2em = 24px;

可以通俗并相对不严谨地理解为 1em 是一个汉字的宽度。

  • REM

相对长度单位,这个单位代表根元素的 font-size 大小(例如 <html> 元素的font-size)。比如根元素的 font-size 为 16px,则 1rem = 16px。

vh 相对长度单位,视口高度的 1/100。
vw 相对长度单位,视口宽度的 1/100。
总得来说,REM 是根元素 font-size 的长度单位,也是移动端适配的解决方案之一。

动态 REM

随着移动端设备越来越多,尺寸屏幕也大小不一。那么如何给页面写 CSS 呢?以下是几种移动端适配的方案:

  • 给每个设备尺寸定制一套 CSS

缺点:工作量大,不切实际

  • 使用响应式

缺点:需要区分多个尺寸区段,开发效率也不高

  • 使用百分比布局

缺点:宽高不好确定

  • vw/vh 方案

元素的宽高使用 vw/vh 长度单位,与设备视口宽高关联

缺点:兼容性有问题

  • REM 方案

一切单位以设备宽度为准

使用 JS 把页面宽度转化为根元素的 font-size,然后再用与根元素 font-size 相关联的 rem 单位定义元素宽高,这样就等于使用了 rem 间接与页面宽度产生联系,确定了比例,从而实现等比缩放。

代码演示:

<meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
 <script>
     let pageWidth = window.innerWidth
     document.write(`<style>html{font-size:${pageWidth/10}px;}</style>`)
 </script>

这样的话,当我们需要在屏幕宽度为 720px 的设备上显示一个宽为 50% 高为 25% 的元素时,我们就可以给这个元素添加样式:

.ele{
    width:5rem;   /* 原尺寸360px/根元素font-size72px */
    height:2.5rem;  /* 原尺寸180px/根元素font-size72px */
}

优化 REM

由于换算 px 和 rem 太麻烦,所以可以使用 Scss 函数对 px 单位进行自动换算。

  • scss 安装与使用
npm config set registry https://registry.npm.taobao.org/

touch ~/.bashrc

echo 'export SASS_BINARY_SITE="https://npm.taobao.org/mirrors/node-sass"' >> ~/.bashrc

source ~/.bashrc

npm i -g node-sass

mkdir ~/Desktop/scss-demo

cd ~/Desktop/scss-demo

mkdir scss css

touch scss/style.scss

start scss/style.scss

node-sass -wr scss -o css

编辑 scss 文件就会自动得到 css 文件

  • px2rem

在 scss 文件里添加:

@function px( $px ){
  @return $px/$designWidth*10 + rem;
}

$designWidth : 640; // 640 是设计稿的宽度,你要根据设计稿的宽度填写。

// $designWidth : $(window).width() css获取屏幕宽度

.child{
  width: px(320);
  height: px(160);
  margin: px(40) px(40);
  border: 1px solid red;
  float: left;
  font-size: 1.2em;
}

即可实现 px 自动变 rem

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
sql:mysql:函数:TIMESTAMPDIFF函数实现TimeStamp字段相减,求得时间差
<divclass"htmledit\_views"id"content\_views"<p&nbsp;函数内指定是minute,则最终结果value值的单位是分钟,如果函数内指定为hours,则最终结果value值单位为小时。</p<preclass"has"name"code"<codeclass"hljssql"<
Python进阶者 Python进阶者
3年前
一篇文章带你了解CSS单位相关知识
大家好,我是皮皮,今天给大家分享一些前端的知识。一、了解CSS单位测量长度的单位可以是绝对的,例如像素,点等,也可以是相对的,例如百分比(%)和em单位。指定CSS单位对于非零值是必须的,因为没有默认单位。丢失或忽略单位将被视为错误。但是,如果该值为0,则可以省略该单位(毕竟,零像素与零英寸是一样的)。注意:长度是指距离测量。长度包括数字值
Wesley13 Wesley13
3年前
HTML&CSS基础学习笔记1.29
像素和相对长度前面的html博文,我们提到过用属性width、height来设置图片的尺寸,它们的单元都是”px(像素)”。长度单位总结一下,目前比较常用到px(像素)、em、%百分比,要注意其实这三种单位都是相对单位。1、像素像素为什么是相对单位呢?因为像素指的是显示器上的小点(CSS规范中假设“90像素1英寸”)。实际情
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
HTML5常见的取值与单位
HTML5常见的取值与单位长度单位包括相对长度单位包括:em,ex,ch,rem,vw,vh,vmax,vmin绝对长度单位包括:cm,mm,q,in,pt,pc,pxch:数字“0”的宽度em:相对于当前对象内文本的字体尺寸。如当前
Wesley13 Wesley13
3年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(