移动端适配rem方案

news2025/1/11 6:17:31

做移动端的适配我们就是要考虑,对于不同大小的手机屏幕,怎么动态改变页面布局中所有盒子的宽度高度、字体大小等。

这个问题我们可以使用相对单位rem

那么什么是 rem?

rem(font size of the root element)是指相对于根元素的字体大小的单位。简单的说它就是一个相对单位。设置 html 的 font-size 属性,rem 是根据它的大小来动态变化整个项目中使用 rem 单位的元素大小。

比如说:我们设置了根元素字体大小为37.5,之后如果有一个盒子宽为75px,则,我们可以给盒子设置成2rem。

那么接下来,我们要做得就是根据屏幕大小动态改变根元素的font-size

比如说,有一个宽高都为2rem的盒子。当在一个很小的屏幕上展示的时候,我们把font-size设置为37.5。那么这个盒子展示出来的就是75px * 75px的正方形。当在一个大屏幕上展示的时候,我们把font-size设置成75px,那么这个盒子展示出来的就是150px乘以150px的正方形。
 

1. rem+动态html的font-size

1.rem单位是相对于html元素的font-size来设置的,那么如果我们需要在不同的屏幕下有不同的尺寸,可以动态的修改html的font-size尺寸。
2.比如如下案例:
设置一个盒子的宽度是2rem;
设置不同的屏幕上html的font-size不同;

3.这样在开发中,我们只需要考虑两个问题:
   问题一:针对不同的屏幕,设置html不同的font-size;
   问题二:将原来要设置的尺寸,转化成rem单位;

2. rem的font-size尺寸

2.1 方案一:媒体查询

  1. 可以通过媒体查询来设置不同尺寸范围内的屏幕html的font-size尺寸;
  2. 缺点:
    1.我们需要针对不同的屏幕编写大量的媒体查询;
    2.如果动态改变尺寸,不会实时的进行更新;(媒体查询只能修改某个范围区间里面的html的字体大小,在这个区间里面,盒子大小都是一样的,我们是希望实时改变的)
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
  <style>
    @media screen and (min-width: 320px) {
      html {
        font-size: 20px;
      }
    }

    @media screen and (min-width: 375px) {
      html {
        font-size: 24px;
      }
    }

    @media screen and (min-width: 414px) {
      html {
        font-size: 28px;
      }
    }

    @media screen and (min-width: 480px) {
      html {
        font-size: 32px;
      }
    }

    .box {
      width: 5rem;
      height: 5rem;
      background-color: orange;
    }
  </style>
</head>
<body>

  <div class="box">

  </div>

</body>
</html>

 

2.2 方案二:编写js代码

  1. 如果希望实时改变屏幕尺寸时,font-size也可以实时更改,可以通过js代码;
  2. 方法:
    1.根据html的宽度计算出font-size的大小,并且设置到html上;
    2.监听页面的实时改变,并且重新设置font-size的大小到html上;
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>

  <script src="./js/hy_flexible.js"></script>

  <style>
    body {
      font-size: 16px;
    }

    .box {
      width: 5rem;
      height: 5rem;
      background-color: orange;
    }

    p {
      font-size: 0.5rem;
    }
  </style>
</head>
<body>

  <div class="box">

  </div>

  <p>我是文本</p>

  <!-- 动态的修改html的font-size -->
  <span>哈哈哈哈哈哈</span>

</body>
</html>

 js

// 1.获取html的元素
const htmlEl = document.documentElement;

function setRemUnit() {
  // 2.获取html的宽度(视口的宽度)
  const htmlWidth = htmlEl.clientWidth;
  // 3.根据宽度计算一个html的font-size的大小
  const htmlFontSize = htmlWidth / 10;
  // 4.将font-size设置到html上
  htmlEl.style.fontSize = htmlFontSize + "px";
}
// 保证第一次进来时, 可以设置一次font-size
setRemUnit();

// 当屏幕尺寸发生变化时, 实时来修改html的font-size
window.addEventListener("resize", setRemUnit);

3. vue项目中使用 postcss-pxtorem

首先,在项目中引入css转rem的插件

npm i postcss-pxtorem -D 

在项目根目录下新建 .postcssrc.js 配置文件,配置代码如下:

module.exports = {
    plugins: {
        // flexible配置
        "postcss-pxtorem": {
            "rootValue": 37.5, // 设计稿宽度的1/10
            "propList": ["*"] // 需要做转化处理的属性,如`hight`、`width`、`margin`等,`*`表示全部
        }
    }
}

有了这个之后,我们就不用每次去手动计算多少px需要写成多少rem了。比如我们拿到的设计稿宽度是375px(上边代码的rootValue我们写成37.5)  ,里面有一个375px*375px的正方形。我们直接写375px就行,这个插件会自动帮我们计算width和height是10rem

 那么,怎么动态改变根元素的字体大小呢?

可以引入另外一个插件,lib-flexible

npm install lib-flexible --save-dev

 在main.js中引入 

这样就可以做到不同的屏幕大小根元素font-size不同啦。 然后页面布局我们使用的又是rem单位,那么盒子大小也就不同啦。

需要注意:如果我们想写死页面中的某个长度大小,比如border-radius为1px,我们只需要使用大写的PX就可。

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

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

相关文章

Linux-中断和时间管理(上)

目录 中断的进入过程 中断的进入过程 为方便实验&#xff0c;本章以配套的目标板 FS4412为例来介绍 Linux 的中断子系统&#xff0c;并且编写相应的中断处理程序。FS4412 上的处理器是 SAMSUNG公司的 Exynos4412&#xff0c;该处理器使用的是4核的 Cortex-A9&#xff0c;&…

c++Lambda匿名函数

cLambda匿名函数 &#xff08;1&#xff09; 定义a. [外部变量方位方式说明符]b. (参数)c. mutabled.noexcept/throw()e.->返回值类型f.函数体 2&#xff09;c11中的拉姆达表达式中的&#xff08;&#xff09;可以省略吗 所谓匿名函数&#xff0c;简单地理解就是没有名称的函…

《C++ Primer Plus》(第6版)第17章编程练习

《C Primer Plus》&#xff08;第6版&#xff09;第17章编程练习 《C Primer Plus》&#xff08;第6版&#xff09;第17章编程练习1. 计算输入流中第一个\$之前的字符数目2. 将键盘输入&#xff08;直到模拟的文件尾&#xff09;复制到通过命令行指定的文件中3. 将一个文件复制…

完全免费的基于区块链和 IPFS 的去中心化博客平台

一、前言 xLog是一个基于Crossbell区块链的博客解决方案&#xff0c;专注于Web3数据由用户掌控。Crossbell是一个基于Web3技术的去中心化博客平台&#xff0c;用户可以在该平台上发布文章并进行交流和创作。社区提供多种交流平台和有奖创作活动。 xLog是基于 Crossbell 区块链…

【AI回复】“我问它,你对五一调休怎么看”

前言 马上就要到五一啦&#xff0c;放假打算去哪里玩呢&#xff1f; “我肯定是宅在家里写博客啊” 最近五一调休在某博上引起大家的共鸣&#xff0c;看了评论那叫一个惨不忍睹哇。 因为我比较对AI感兴趣&#xff0c;所以想看看它是怎么看待调休的。 首先&#xff0c;在百度…

【UE】简易的水材质

引擎版本&#xff1a;4.26 效果 步骤 1. 创建一个材质&#xff0c;命名为“M_Water” 2. 打开“M_Water”&#xff0c;将混合模式设为半透明&#xff0c; 光照模式设为表面半透明体积&#xff0c;在这种模式下我们可以使用金属度、粗糙度等接口 3. 创建一个4维常量节点&…

Android 基于NumberPicker自定义弹出窗口Dialog整合日期选择器

Android实现把年月选择器放到AlertDialog中_左眼看成爱的博客-CSDN博客 Android使用NumberPicker实现年月滚动选择器_左眼看成爱的博客-CSDN博客 前面两篇文章我们分别讲了 1&#xff0c;如何用NumberPicker实现年月选择器 2&#xff0c;如何把1中的用NumberPicker实现的年…

基于DE2-115平台实现VGA显示器的显示实验

目录 什么是VGA协议VGA显示原理VGA时序图VGA参数图实验记录准备PLLROM取模代码data_drive.vkey_debounce.vvga_drive.vvga_top.v 实验现象 什么是VGA协议 这一部分摘录自野火的征途Pro《FPGA Verilog开发实战指南——基于Altera EP4CE10》2021.7.10&#xff08;上&#xff09;…

ctfshow web入门phpcve web311-315

1.web311 通过抓包发现php版本时为PHP/7.1.33dev 漏洞cve2019-11043 远程代码执行漏洞 利用条件&#xff1a; nginx配置了fastcgi_split_path_info 受影响系统&#xff1a; PHP 5.6-7.x&#xff0c;Nginx>0.7.31 下载工具进行利用 需要安装go环境 yum install golang -y …

一文技术解析ART虚拟机method tracing

一、method tracing介绍 概述 这个是谷歌提供的对java的函数级trace工具&#xff0c;和systrace只支持打点不同&#xff0c;method tracing能支持到函数&#xff0c;看到具体的函数执行时间&#xff0c;准确的分析出来执行的时间短板。 1.生成trace的方式 sampling方式&…

【数据结构初阶】第七节.树和二叉树的性质

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 前言 一、树 1.1 树的概念 1.2 树的结点分类 1.3 结点之间的关系 1.4 树的存储结构 1.5 其他相关概念 二、 二叉树 2.1 二叉树的概念 2.2 特殊的二叉树 2.3 二叉树的性质 2.4…

快速上线chatGPT软件

ChatGPT是一个由OpenAI开发的自然语言处理模型&#xff0c;您无法将其直接上线。但是&#xff0c;如果您想要在您的应用程序中集成对话系统或聊天机器人&#xff0c;您可以探索以下步骤&#xff1a; 选择开发工具&#xff1a;选择一个适合您的编程语言和平台的开发工具&…

C++ [STL之string的使用]

本文已收录至《C语言和高级数据结构》专栏&#xff01; 作者&#xff1a;ARMCSKGT 文章目录 前言正文编码basic_string类说明basic_string实例成员关于string string类模块构造函数空间大小相关字符串长度及容量大小清空字符串和空串查询字符串大小和容量设置 访问与遍历头尾元…

探索【Stable-Diffusion WEBUI】的插件:界面与中文翻译

文章目录 &#xff08;零&#xff09;前言&#xff08;一&#xff09;主题&#xff08;kitchen Theme&#xff09;&#xff08;二&#xff09;对照翻译&#xff08;Bilingual Localization&#xff09;&#xff08;三&#xff09;自行翻译&#xff08;四&#xff09;提示词翻译…

前端02:CSS选择器等基础知识

CSS基础选择器、设置字体样式、文本样式、CSS的三种引入方式、能使用Chrome调试工具调试样式 HTML专注做结构呈现&#xff0c;样式交给CSS&#xff0c;即结构&#xff08;HTML&#xff09;和样式CSS相分离 CSS主要由量分布构成&#xff0c;选择器以及一条或多条声明 选择器&…

华为OD机试真题(Java),喊7的次数重排(100%通过+复盘思路)

一、题目描述 喊7是一个传统的聚会游戏&#xff0c;N个人围成一圈&#xff0c;按顺时针从1到N编号。 编号为1的人从1开始喊数&#xff0c;下一个人喊的数字为上一个人的数字加1&#xff0c;但是当将要喊出来的数字是7的倍数或者数字本身含有7的话&#xff0c;不能把这个数字直…

ML之DR:基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例

ML之DR&#xff1a;基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例 目录 基于鸢尾花(Iris)数据集利用多种降维算法(PCA/TSVD/LDA/TSNE)实现数据降维并进行二维和三维动态可视化应用案例 # 1、定义数据集 # 2、数…

华为OD机试真题(Java),密码验证合格程序(100%通过+复盘思路)

一、题目描述 密码要求: 长度超过8位包括大小写字母.数字.其它符号,以上四种至少三种不能有长度大于2的包含公共元素的子串重复 &#xff08;注&#xff1a;其他符号不含空格或换行&#xff09; 二、输入描述 一组字符串。 三、输出描述 如果符合要求输出&#xff1a;OK&…

Oxygen Content Fusion carck

Oxygen Content Fusion carck 输入法支持改进-对非拉丁语言输入法编辑器(IME)的支持在稳定性和性能方面得到了改进。 文件比较工具中环绕差异的精确显示-文件比较工具现在可以更好地识别和显示环绕编辑产生的差异。例如&#xff0c;当一段文本标记有标记时&#xff0c;它会识别…

pytorch深度学习框架CUDA版本环境安装记录——牛刀杀鸡——解一个非线性方程组

目录 一、前言二、安装步骤step1. 安装显卡驱动step2. 安装cudastep3. 安装cuDNNstep4. 安装pytorch环境 三、用pytorch解个非线性方程组 一、前言 在深度学习界pytorch框架用得人越来越多&#xff0c;无论是CV机器视觉、NLP还是自然语言处理&#xff0c;目前主流的大的模型如…