vue - 常见的移动端rem适配方案

news2024/11/16 8:52:57

移动端rem适配方案

    • rem适配原理
    • 方案1:rem+媒体查询
    • 方案2:js+rem
    • 方案3:vw+rem(不用查询屏幕宽度)

移动端适配经常使用的就是 rem; 主要有以下几种方案:
1rem + 媒体查询(@media)
2js + rem(查询屏幕宽度)
3VW + rem(不需要查询屏幕宽度)
这几种方式最终css写的单位是 rem;

rem适配原理

rem是一个相对单位。
是相对于根元素html的font-size宽度值。大多数浏览器默认字体宽度是16px(如果没有设置过),也就是 1rem = 16px;

如下图所示:
在这里插入图片描述
既然rem相对于根据html的font-size来的,那再不同的屏幕宽度时改变html的字体宽度值,那么rem的值也会相应的改变;这也就是为什么要频繁的改变html下面font-size值的原因;

方案1:rem+媒体查询


计算公式当前屏幕宽度下的html字体值 = 当前屏幕宽度*预设字体值/psd设计稿的宽度(750px)

预设字体值可以随意设,计算方便我通常设置为100;

媒体查询适配模板

以下font-size的字体值是根据预设字体值 100;

common.css

/* 媒体查询适配模板 预设值为 100 	*/
@media screen and (min-width: 320px) {
  html {
    font-size: 42.667px;
  }
}

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

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

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

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

在main.js引入

main.js

import Vue from 'vue'
import App from './App.vue'
// 引入适配css
import '@/assets/common.scss'

Vue.config.productionTip = false

new Vue({
  render: h => h(App),
}).$mount('#app')

使用:如果量得设计图其中一个元素的宽度是235px,那么在css代码中需要写成 :先除以预设值 再加上rem即可;如下:

.div{
	width:2.35rem; // 235/100=2.35+rem
}

方案2:js+rem


这种方案也是阿里早期开源的一个[移动端适配]解决方案(flexible.js);

原理是需要查询屏幕的宽度,只不过这种需要通过监听屏幕的尺寸变化 ,实时调用clientWidth方法获取屏幕宽度来更改html的字体值;

分析如下:

350:当前屏幕宽度(设备宽度) curScreenWidth
750:psd设计稿宽度  psdWidth
100:预设字体基础值  1rem = 100px  preFontSize
  x: 当前屏幕宽度字体的基础值(html的font-size的值)curFontSize

320      x 
———  =  ———
640     100

x = (320*100)/640  公式如下:

curFontSize=(curScreenWidth*100)/psdWidth

牢记公式当前屏幕宽度下的html字体值 = 当前屏幕宽度*预设字体值/psd设计稿的宽度(750px);

1,开始封装

autoSize.js

// 封装 rem + js 移动端适配方案
export function autoSize() {
  //设计稿的宽度
  var psdWidth = 750;

  //预设字体值
  var preFontSize = 100;

  //当前屏幕宽度
  var curScreenWidth = document.documentElement.clientWidth;
  //当前屏幕对应的html字体值
  var curFontSize = (curScreenWidth * preFontSize) / psdWidth;

  //设备宽度在750px 
  if (curScreenWidth > 750) {
    curScreenWidth = 750;
  }
  //把计算下来的当前屏幕html字体值 赋值给html元素 documentElement属性会获取到html根元素 然后为之设置字体值
  document.documentElement.style.fontSize = curFontSize + "px";
}

2,vue 中使用 (resize方法监听窗口变化,实时计算html下面的font-size值)

App.vue

<template>
  <div id="app">
  </div>
</template>

<script>
import { autoSize } from "@/assets/auto";
export default {
  name: "App",
 // 监听resize事件
  mounted() {
    window.addEventListener("resize", () => {
      autoSize();
    });
  }
};
</script>

这种方法实际写入到css代码中还是:测量宽度/100 + rem;

方案3:vw+rem(不用查询屏幕宽度)


使用视口单位布局 (纯css) 实现动态改变font-size属性值,不需要引用js文件,但需要在meta标签添加viewport 属性;vue项目会自动添加;

Viewport 介绍:

vw:是css3规范中宽度视口单位,将视口宽度平均分成100份;

vh:将视口高度平均分成100份;


<meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" />

属性说明:
width:控制 viewport 的大小,可以指定的一个值,如 device-width为设备的宽度(单位为缩放为 100% 时的 CSS 的像素)
height:和 width 相对应,指定高度
initial-scale:初始缩放比例,也即是当页面第一次 load 的时候缩放比例
maximum-scale:允许用户缩放到的最大比例  float_value
minimum-scale:允许用户缩放到的最小比例  float_value
user-scalable:用户是否可以手动缩放 no表示不可以  yes为可以

视口布局原理:确定基准值以常见的750像素宽度的设计稿为例,根据vw单位可知:

750px = 100vw ; 1px = 0.133333vw;

100px = 13.33333vw = 1rem;

px和rem关系还是100倍 ; 那么实际写入如到css代码中还是:测量宽度 / 100 + rem;

html {
    font-size:13.33333vw; //100px=1rem = 13.33333vw
}
  • 优点:页面元素随着页面宽度变化
  • 缺点:
    • 兼容性没有rem好 ,得大量计算, 不是很精确
    • 转换后的长度单位不够直观修改维护困难

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

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

相关文章

蓝桥杯最后一战

目录 分巧克力_二分 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码&#xff1a; 巧克力 - 优先队列 题目描述 输入格式 输出格式 输入输出样例 说明/提示 代码&#xff1a; 思路分析&#xff1a; 秘密行动_dp 蓝桥杯算法提高-秘密行动 题目描述 …

Unity之OpenXR+XR Interaction Toolkit 安装和配置

前言 XR Interaction Toolkit 是Unity基于OpenXR标准&#xff0c;发布的一套XR工具&#xff0c;目的是方便我们快速接入XR相关的SDK&#xff0c;并且做到兼容不同VR设备的目的&#xff0c;目前流行的VR设备如Oculus&#xff0c;Metal&#xff0c;HTC Vive&#xff0c;Pico等统…

改进YOLOv8 | 主干网络篇 | YOLOv8 更换骨干网络之 MobileNetV3 | 《搜寻 MobileNetV3》

论文地址:https://arxiv.org/abs/1905.02244 代码地址:https://github.com/xiaolai-sqlai/mobilenetv3 我们展示了基于互补搜索技术和新颖架构设计相结合的下一代 MobileNets。MobileNetV3通过结合硬件感知网络架构搜索(NAS)和 NetAdapt算法对移动设计如何协同工作,利用互…

【天秤座区块链】元宇宙知识普以及简单解读清华研究报告

本节目录 温馨提示关于分栏【天秤座区块链】由来提前感受元宇宙区块链的两个注意点区块链革命简单认识清华大学报告解读&#xff08;元宇宙&#xff09;前传《雪崩》元宇宙具体是什么&#xff1f;元宇宙不是什么&#xff1f;那为什么要冲击元宇宙呢&#xff1f; 小补充及感谢 温…

前端搭建打字通游戏(内附源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 打字通功能介绍✨ 页面搭建✨ 样式代码✨ 功能实现 ✨ 写在前面 上周我们实通过前端基础实现了名言生成器&#xff0c;当然很多伙伴再评论区提出了想法&#xff0c;后续我们会考虑实现的&#xff0c;今天还是继续按照我们…

java基础入门-06-【面向对象进阶(多态包final权限修饰符代码块)】

Java基础入门-06-【面向对象进阶&#xff08;多态&包&final&权限修饰符&代码块&#xff09;】 14、面向对象进阶&#xff08;多态&包&final&权限修饰符&代码块&#xff09;1.1 多态的形式1.2 多态的使用场景1.3 多态的定义和前提1.4 多态的运行…

嵌入式设备逆向所需的工具链

导语&#xff1a;本文介绍了嵌入式设备逆向所需的工具链。 相关的应用程序或工具有&#xff1a; UART(Universal Asynchronous Receiver Transmitter&#xff0c;通用异步收发器)&#xff1a; UBoot&#xff1b; Depthcharge&#xff1b; SPI (Serial Peripheral Interface…

利用文本描述替换万物(Inpaint-Anything-Description)

文章目录 引言安装Demo github&#xff1a; https://github.com/Atlas-wuu/Inpaint-Anything-Description 引言 前段时间看了万物分割SAM、文生图Stable Diffusion、开集检测Grounding DINO&#xff0c;它们之间可以互相补充&#xff0c;AIGC变得更加可控。Inpaint Anything将…

RK3568平台开发系列讲解(网络篇)Linux 的 socket 套接字

🚀返回专栏总目录 文章目录 一、套接字的数据结构1.1、struct socket 数据结构1.2、struct sock 数据结构二、套接字的初始化三、套接字与文件四、Socket Buffer沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 Linux 内核支持的套接字如下: 我们创建套接字时,可以…

PCIe物理层弹性缓存机制(详细)解析-PCIe专题知识(四)

目录 前言一、简介二、详细解析2.1 实例解析2.2 具体实现过程 三、总结四、其他相关链接1、PCI总线及发展历程总结2、PCIe物理层总结-PCIE专题知识&#xff08;一&#xff09;3、PCIe数据链路层图文总结-PCIe专题知识&#xff08;二&#xff09;4、PCIe物理层链路训练和初始化总…

国产ChatGPT命名图鉴

很久不见这般热闹的春天。 随着ChatGPT的威名席卷全球&#xff0c;大洋对岸的中国厂商也纷纷亮剑&#xff0c;各式本土大模型你方唱罢我登场&#xff0c;声势浩大的发布会排满日程表。 有趣的是&#xff0c;在这些大模型产品初入历史舞台之时&#xff0c;带给世人的第一印象其…

进程替换函数组介绍exec*

目录 前述 execl execlp execle execv execvp execvpe 前述 介绍后缀的意义&#xff1a; l &#xff08;list&#xff09;&#xff1a;表示参数采用列表。 v&#xff08;vector&#xff09;&#xff1a;参数同数组表示。 p&#xff08;path&#xff09;&#xff1a;自…

力扣题库刷题笔记704-二分查找

1、题目如下&#xff1a; 2、个人Python代码如下&#xff1a; 个人代码如下&#xff1a; class Solution: def search(self, nums: List[int], target: int) -> int: left 0 right len(nums) - 1 while left < right: mid (right left) >> 1 if nums[mid] >…

【C++类和对象之拷贝构造、赋值运算符重载】

拷贝构造、赋值运算符重载 ❀拷贝构造函数 特性 ❀赋值运算符重载 赋值运算符重载格式 &#x1f340;小结&#x1f340; &#x1f389;博客主页&#xff1a;小智_x0___0x_ &#x1f389;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f389;系列…

【数字图像处理】边缘检测

文章目录 0. 前言1. Sobel算子2. Canny算子3. 深度学习算法3.1 Holistically-Nested Edge Detection&#xff08;HED&#xff09;3.2 Richer Convolutional Features&#xff08;RCF&#xff09; 0. 前言 边缘检测是一种图像处理技术&#xff0c;旨在标识和定位数字图像中的边…

【信息系统安全/计算机系统安全】期末复习(HITWH)

PDF版本及更多资料&#xff08;百度网盘&#xff09;&#xff1a; 链接&#xff1a;信息系统安全期末复习 目录 第一章 绪论 第二章 安全认证 填空题 第三章 访问控制 填空题 第四章 安全审计 填空题 第五章 Windows操作系统安全 填空题 第六章 Linux操作系统安全 填…

JDBCSpring:使用Spring JDBC封装Dao

目录标题 1、工程目录pom.xml文件 2、创建数据表student3、在resources目录创建配置文件applicationContext.xmljdbc.properties 4、创建Bean对象Student 5、创建Dao类UserDao接口 6、插入数据一、直接注入jdbctemplate二、继承jdbcdaosupport类 7、运行结果图 1、工程目录 pom…

go 使用pprof分析性能,trace追踪

前言 pprof是Go程序自带的性能分析工具&#xff0c;prof是profile&#xff08;画像&#xff09;的缩写&#xff0c;用于分析go程序的性能。 Profile Descriptions: allocs: A sampling of all past memory allocations 已分配内存采样 block: Stack traces that led to bloc…

梯度下降算法

梯度下降算法的公式&#xff1a; 公式依次代表为“下次迭代的点”、“目前所在的点”、“学习率”和“最大负向梯度”。按照这个公式&#xff0c;每次迭代都会根据上次的步长减去学习率乘以“梯度”的值&#xff0c;去一步一步更新&#xff0c;这样能可以每次迭代都朝着最大负方…

基于xml的Spring应用-1

基于xml的Spring应用 Spring的get方法 方法定义返回值和参数Object getBean (String beanName)根据beanName从容器中获取Bean实例&#xff0c;要求容器中Bean唯一返回值为Object&#xff0c;需要强转T getBean (Class type)根据Class类型从容器中获取Bean实例&#xff0c;要求…