Rem 自适应原理与应用

news2024/12/26 0:51:23

前言

移动端适配有很多方案,这篇文章将根据 rem 自适应的原理进行讲解,接下来跟着作者的思路一起来看看吧!

原理

在搞清楚 rem 适配之前,我们先来了解一下什么是 rem?

rem 是一种相对长度单位,它相对于根元素的字体大小(即HTML元素的字体大小)来计算。它的特点是可以根据根元素的字体大小进行缩放,从而实现页面元素的自适应。

举个栗子来说明 rem 的用法:

假设我们将根元素字体大小设置为 16px,然后我们想要设置一个段落的文字大小为 20px。如果我们使用 rem 单位,我们可以这样设置:

html {
  font-size: 16px; /* 设置根元素字体大小为16px */
}

p {
  font-size: 1.25rem; /* 设置段落的文字大小为根元素字体大小的1.25倍 */
}

在这个栗子中,1rem 等于根元素的字体大小,即16px,所以设置段落的字体大小为 1.25rem 就相当于 20px(16px * 1.25 = 20px)。

一句话总结

rem:相对于根元素的 fontSize 大小,也就是 html 的fontSize大小。

实现

上面我们说了,我们需要根据尺寸的不同去动态修改根元素的字体大小,那实现工作就转换成了

先检测窗口尺寸变化

修改根元素字体大小

好的既然已经知道怎么实现了,我们再来理一下实现思路!

如果我们按照上面的栗子,将段落的文字大小设置为 1.25rem,然后根据移动端机型尺寸大小的不同,去动态修改根元素,也就是 html 的 font-size 的大小。

如果根元素的字体大小发生变化rem 会自动进行计算,从而改变段落字体的大小,这样是不是就实现了自适应。

所以我们现在需要将段落字体大小写成 1.25rem,注意这里需要写死,随着窗口的变化,1.25rem 会自动进行计算。

那如果所有的 px 单位我们都手动写成 rem 是不是有些麻烦,我们需要自己去计算,不太符合我们的实际开发。

我们肯定希望只写 px 单位,rem 可以自动转换。

这里就介绍一下 postcss-pxtorem 这款插件。

postcss-pxtorem插件

postcss-pxtorem 是一个 PostCSS 插件,用于将像素单位(px)转换为 rem 单位,以便更好地适应不同屏幕尺寸和密度。

安装

npm install postcss-pxtorem --save-dev

 配置

// postcss.config.js

module.exports = {
  plugins: {
    'postcss-pxtorem': {
      rootValue: 10, // 1rem 等于 10px
      propList: ['*'], // 所有属性都转换
    },
  },
};

使用

安装并配置好 postcss-pxtorem 后,在编写 CSS 时,你可以使用 px 单位,插件会自动将其转换为 rem 单位。

/* 输入 */
.example {
  font-size: 16px;
  margin: 20px 10px;
}

/* 输出 */
.example {
  font-size: 1rem; /* 如果 rootValue 设置为 16 */
  margin: 1.25rem 0.625rem;
}

 如图所示:

这样一来,我们只需要负责编写 px 即可,转换 rem 的事情交给插件即可。 

注意:如若vue-cli-service的版本为5,则按以上配置。如若vue-cli-service的版本为4,可直接在vue.config.js中进行配置。详情可参考下面这篇文章。

参考链接如下:(23条消息) vue项目中postcss-pxtorem的配置失败问题 style-resources-loader的相关配置_postcss-pxtorem不生效_清9余人的博客-CSDN博客

监听窗口变化

上面我们已经使用插件将 px 转化成了 rem,接下来我们就需要检测窗口的变化,动态修改 rem 即可。

创建 src\plugin\flexible\index.js

/* eslint-disable */
(function () {
  changeSize()
  function changeSize() {
    document.documentElement.style.fontSize = (document.documentElement.clientWidth * 10) / 375 + 'px'
  }
  window.addEventListener('resize', changeSize, false)
  // 当一条会话历史记录被执行的时候将会触发页面显示 (pageshow) 事件。(这包括了后退/前进按钮操作,同时也会在 onload 事件触发后初始化页面时触发)
  window.addEventListener('pageshow', function (e) {
    if (e.persisted) {
      changeSize()
    }
  })
})()

这是一段自执行代码,我们把它引入 main.js,页面加载时将会自动执行。

这里的 html 字体大小利用了一个简单的数学公式,当我们默认设置以屏幕 375px 为基准,此时的字体大小为 10px

 那么浏览器窗口大小改变的时候新的 htm 的 fontSize(clientWidth  新的值)就是clientWidth*10/375(交叉相乘)

375      clientWidth  

10        newFontSize

newFontSize = clientWidth*10/375

默认我们配置的字体大小为10px(与postcss.config.js文件中一致),大家可以根据自己所需要去配置即可。

记得引入main.js文件中

import './plugin/flexible/index'

测试

窗口大小为375时

窗口大小为414时

newFontSize = clientWidth*10/375 = 414*10/375 = 11.04

 窗口大小为390时

newFontSize = clientWidth*10/375 = 390*10/375 = 10.4

可以看到随着尺寸的变化,fontSize 也是在变化的。

我们右侧的宽高字体大小始终为 rem单位不变,这样随着根元素字体大小的变化,我们的元素也可以自适应变化了!

总结

实现 rem 单位自适应,需要借助 postcss-pxtorem 这款插件将 px 转换为 rem,需要检测窗口的变化去设置根元素的字体大小,从而实现 rem 自动计算,实现自适应。

以上就是 rem 单位实现自适应的所有内容,如果你感觉写的还不错,对你有帮助的话,可以点个赞支持一下,你的支持就是作者最大的动力 !

源码

所有代码都已经提交到 GitHub

GitHub:chenyajun-create/pxToRem (github.com)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1472242.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql学习之事务日志undolog深入剖析

Undo log redo log 是事务持久性的保证,undo log是事务原子性的保证。在事务中更新数据的前置操作其实是要先写入一个undo log。 如何理解undo 日志? 事务需要保证原子性,也就是事务中的操作要么全部完成,要么什么也不做。但有时…

SQLServer 格式化数据的方法

格式化数据一般考虑使用FORMAT 或者CONVERT ​​​​​​​函数,FORMAT 函数是在 SQL Server 2012 中引入的,如果你使用的是较早版本的 SQL Server,则可能需要考虑使用其他方法,如 CONVERT 函数。 在 SQL Server 中,FO…

动态规划--状态转移

解码方法 1.题目 2.思路 1)我们定义一个数组dp,其中dp[i]表示字符串s的前i个字符的解码方法总数。初始化时,dp[0]为1,因为空字符串有一种解码方式。dp[1]的值取决于第一个字符是否是0,如果不是0,则有一种…

Unity—MVC分层开发思想

每日一句:当你不努力的时候,天赋就会一点一点被收回 目录 MVC分层开发思想 MVC是什么 MVC的开发步骤 案例:点击按钮实现金币进行添加,并且把金币记录到JSON里 MVC模式实现 背包系统基础代码 背包项目实现步骤 MVC分层开发思…

第十三天-mysql交互

目录 1.安装MySQL connector 方式1:直接安装 方式2:下载 2.创建链接 3.游标Cursor 4.事务控制 5. 数据库连接池 1. 使用 6.循环执行SQL语句 不了解mysql的可以先了解mysql基础 1.安装MySQL connector 1. MySQL connector 是MySQL官方驱动模块…

VirtualBox+Vagrant安装linux

一、VirtualBox安装 VirtualBox官网:Oracle VM VirtualBox 这里采用VirtualBox--7.0.0 版本 二、Vagrant安装 Vagrant官网:Vagrant by HashiCorp Vagrant镜像仓库:Discover Vagrant Boxes - Vagrant Cloud 这里采用Vagrant--2.4.1版本 在…

Python从入门到精通指南【第101篇—入门到精通】【文末送书-24】

文章目录 Python从入门到精通指南第一步:入门基础1.1 安装Python1.2 Hello World1.3 变量和数据类型1.4 控制流程 第二步:深入学习2.1 函数和模块2.2 列表、元组和字典2.3 文件操作 第三步:高级主题3.1 面向对象编程3.2 异常处理3.3 正则表达…

猫头虎分享已解决Bug || 无效的请求参数:InvalidRequestException

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

DP读书:《工程热力学(第二版)》(一)绪论——能量及其利用

DP读书:《工程热力学(第二版)》绪论 0.1 能量及其利用 热力学——研究对象:能量 能量 物质能量传递 普遍规律 能源:直接提供能量的物质资源 一次能源:热能占比85% 直接利用——>冶金、采暖、炊煮 …

全网最全AI绘画工具汇总(二)

一.AI绘画 图像 创造人工智能艺术的方式共有多种方法,包括使用数字模式的程序“基于规则”的图像生成、模拟笔触和其他绘画效果的算法,以及人工智能或深度学习算法等。 最早的重要人工智能艺术系统之一是AARON,由哈罗德科恩于1960年代末开…

PureFlash v1.9.1特性介绍

PureFlashv1.9.1版本特性主要有3个: 1. 支持RDMA网络 使用RDMA协议可以大大减少对CPU的消耗,性能提升30%以上。 PureFlash的网络配置分为存储节点间网络(存储后端网)和客户端网络(前端网)。都支持使用RD…

使用vuetify实现全局v-alert消息通知

前排提示,本文为引流文,文章内容不全,更多信息前往:oldmoon.top 查看 简介 使用强大的Vuetify开发前端页面,结果发现官方没有提供简便的全局消息通知组件(像Element中的ElMessage那样)&#xf…

桶装水配送小程序有什么功能 怎么制作

桶装水配送小程序是一种方便快捷的订水服务工具,可以帮助用户轻松订购桶装水,并实时跟踪订单配送情况。下面具体介绍送水小程序的功能。 1. 客户订水功能:用户可以通过小程序轻松选择需要的桶装水数量和配送时间,填写联系信息和地…

【AI Agent系列】【MetaGPT多智能体学习】0. 环境准备 - 升级MetaGPT 0.7.2版本及遇到的坑

之前跟着《MetaGPT智能体开发入门课程》学了一些MetaGPT的知识和实践,主要关注在MetaGPT入门和单智能体部分(系列文章附在文末,感兴趣的可以看下)。现在新的教程来了,新教程主要关注多智能体部分。 本系列文章跟随《M…

【VTKExamples::PolyData】第三十八期 Outline

很高兴在雪易的CSDN遇见你 VTK技术爱好者 QQ:870202403 前言 本文分享VTK样例Outline,并解析接口vtkOutlineFilter,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞+关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^)ノ~YO 1. Outline // Create…

DP读书:《半导体物理学(第八版)》(一)绪论 3min速通

DP读书:《半导体物理学(第八版)》刘恩科 3min速通半导体物理之绪论 DP读书:《半导体物理学(第八版)》刘恩科绪论第一章 半导体中的电子状态1.1 半导体的晶格结构和结合性质1.1.1 金刚石型结构和共价键1.1.2…

docker下gitlab安装配置

一、安装及配置 1.gitlab镜像拉取 docker pull gitlab/gitlab-ce:latest2.运行gitlab镜像 docker run -d -p 443:443 -p 80:80 -p 222:22 --name gitlab --restart always --privilegedtrue -v /home/gitlab/config:/etc/gitlab -v /home/gitlab/logs:/var/log/gitlab -v …

SAP MD81创建客户独立需求简介

正常我们用的最多的计划独立需求都是使用的是MD61 ,今天我们说下SAP的另外的一个标准功能客户独立需求MD81。虽然SAP给这个TCODE的描述是客户独立需求,但是实际是没有地方去关联对应的客户信息的。或者可以理解为是一个关联销售订单的一个计划独立需求。 1、MD81在SAP中的路…

交换两个整数

交换两个整数 题目描述:解法思路:解法代码:运行结果: 题目描述: 写⼀个函数Swap,可以交换两个整数的内容。注意必须实现成函数完成。 输入2个整数,调用自定义函数Swap,完成2个整数的…

赵本山念王小利写给李琳的信真费劲,原来不会写的字就打个圈(零)

赵本山念王小利写给李琳的信真费劲,原来不会写的字就打个圈(零) --小品《同桌的你》(中3)的台词 王小利:多亏桂琴给我帮助,借我铅笔给我橡皮,考试时候让我抄题, 赵本山&…