移动端适配方案

embedded/2024/9/25 21:29:12/

移动端适配

方案 1:rem + html font-size

方案 2:vw



rem + html font-size

rem 是相对于 html 元素的 font-size 来设置的单位,通过在不同屏幕尺寸下动态修改 html 元素的 font-size 可达到适配效果

在开发中,我们只需要考虑两个问题:

  1. 针对不同的屏幕尺寸设置不同的 html font-size

  2. 将元素尺寸单位转为 rem


动态设置 html font-size


方法一:通过媒体查询设置 html font-size

思路:通过媒体查询根据不同屏幕尺寸设置不同的 html font-size

缺点:① 如果动态改变屏幕尺寸,不能实时更新、 ② 只能针对某个尺寸范围设置 html font-size

@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: blue;
}

方法二:通过 JS 设置 html font-size

思路:通过监听屏幕尺寸的变化动态修改 html font-size

一般会将 html font-size 设置为屏幕宽度的 1/10,方便计算

function setRemUnit() {const htmlEl = document.documentElement;const htmlFontSize = htmlEl.clientWidth / 10;htmlEl.style.fontSize = htmlFontSize + 'px';
}
setRemUnit();
window.addEventListener('resize', setRemUnit);

px 与 rem 的单位换算

假设原型图中屏幕宽度为 375px,现有一宽度为 100px 的 div。我们想将 100px 转成对应的 rem 值:

  1. 根元素 html 的 font-size = 375px / 10 = 37.5px (37.5px 即为 “基准字体大小”)

  2. 元素的 rem 值 = 100px / 37.5px


手动计算

编写 scss 函数:

$baseFontSize: 37.5px; // 基准字体大小
@function pxToRem($pxValue) {@return $pxValue / $baseFontSize * 1rem;
}

使用 scss 函数编写样式:

.example {font-size: pxToRem(24px); // 将 24px 转换为对应的 rem 值margin: pxToRem(16px) pxToRem(8px); // 将 16px 和 8px 转换为对应的 rem 值
}

工程化自动计算

安装 postcss-pxtorem 依赖包、配置 webpack.config.js 文件:

npm install postcss-pxtorem -D
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const postcssPxToRem = require('postcss-pxtorem');const stylesHandler = MiniCssExtractPlugin.loader;
const postcssLoader = {loader: 'postcss-loader',options: {postcssOptions: {plugins: [postcssPxToRem({rootValue: 37.5, // 基准字体大小, 默认 16propList: ['*'], // 转换的属性, 默认 ['font', 'font-size', 'line-height', 'letter-spacing']}),],},},
};const config = {// ...module: {// ...rules: [// ...{test: /\.css$/i,use: [stylesHandler, 'css-loader', postcssLoader],},],},
};

正常编写样式,px 会自动转换为 rem:

.example {font-size: 24px; /* 将转换为 0.64rem */margin: 16px 8px; /* 将转换为 0.43rem 0.21rem */
}



vw 单位

100vw 相当于整个视口的宽度 innerWidth,1vw 相当于视口宽度的 1%,将 px 转换为 vw 即可完成适配

vw 相对于 rem 的优势:不需要考虑 html font-size 的问题

事实上,rem 作为一种过渡的方案,它利用的也是 vw 的思想


px 与 vw 的单位转换

假设原型图中屏幕宽度为 375px,有一宽度为 100px 的 div。我们需要将 100px 转成对应的 vw 值:

  1. 1vw = 375px / 100 = 3.75px
  2. 元素的 vw 值 = 100px / 3.75px

手动计算

编写 scss 函数:

$baseWidth: 375px; // 设计稿宽度
@function pxToVw($pxValue) {@return $pxValue / $baseWidth * 100vw;
}

使用 scss 函数编写样式:

.example {width: pxToVw(100px); // 将 100px 转换为对应的 vw 值margin: pxToVw(16px) pxToVw(8px); // 将 16px 和 8px 转换为对应的 vw 值
}

工程化自动计算

安装 postcss-px-to-viewport-8-plugin 依赖包、配置 webpack.config.js 文件:

npm install postcss-px-to-viewport-8-plugin -D
const MiniCssExtractPlugin = require('mini-css-extract-plugin');
const postcssPxToViewport = require('postcss-px-to-viewport-8-plugin');const stylesHandler = MiniCssExtractPlugin.loader;
const postcssLoader = {loader: 'postcss-loader',options: {postcssOptions: {plugins: [postcssPxToViewport({viewportWidth: 375, // 设计稿宽度, 默认 320}),],},},
};const config = {// ...module: {// ...rules: [// ...{test: /\.css$/i,use: [stylesHandler, 'css-loader', postcssLoader],},],},
};

正常编写样式,px 会自动转换为 vw:

.example {width: 100px; /* 将转换为 26.67vw */margin: 16px 8px; /* 将转换为 4.27vw 2.13vw */
}


http://www.ppmy.cn/embedded/30105.html

相关文章

2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包

本文来自:2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包 - 源码1688 应用介绍 简介: 2024最新UI发卡盗U/支持多语言/更新UI界面/支持多个主流钱包 自行检查后门,最好是部署智能合约后用合约地址来授权 包含转账支付页面盗U授…

解决iview(view ui)中tabs组件中使用图片预览组件ImagePreview,图片不显示问题

同学们可以私信我加入学习群! 正文开始 前言一、问题描述二、原因分析三、解决方案总结 前言 最近在写个人项目的web端和浏览器插件,其中一个功能是base64和图片的转换。因为分成四个小功能,所以使用的iview的tabs来展示不同功能&#xff0c…

如何编写测试用例

总结 测试用例需求来源 文档 用户角度 编写测试用例步骤 分析需求 写测试点 对需求的拆分 辅助完成测试用例的编写 编写测试用例 编写测试用例原则 能看懂 能执行 测试结果状…

postman一直转圈圈,无法启动

解决 地址栏输入%appdata%进入此目录,删除%appdata%目录下的postman文件可以解决问题。

使用Neo4j和Langchain创建知识图谱

使用Neo4j和Langchain创建知识图谱 知识图谱是组织和整合信息的强大工具。通过使用实体作为节点和关系作为边缘,它们提供了一种系统的知识表示方法。这种有条理的表示有利于简化查询、分析和推理,使知识图在搜索引擎、推荐系统、自然语言处理和人工智能…

程序设计:C语言 UNIX/LINUX 环境变量替换

初级代码游戏的专栏介绍与文章目录-CSDN博客 我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。 这些代码大部分以Linux为目标但部分代码是纯C的,可以在任何平台上使用。 很多时候程序希望对配置参数做…

MATLAB 代数

MATLAB 代数 到目前为止,我们已经看到所有示例都可以在MATLAB及其GNU(也称为Octave)中运行。但是,为了求解基本的代数方程,MATLAB和Octave几乎没有什么不同,因此我们将尝试在单独的部分中介绍MATLAB和Octa…

Java进阶-JINQ详解与使用

本文详细介绍了JINQ(Java Integrated Query),一种强化Java中数据查询能力的库,提供类SQL的查询语法和类型安全的操作。文章首先解释了JINQ的基本功能和应用,随后通过具体示例展示了如何使用JINQ进行数据过滤、投影、连…