当前位置: 首页 > news >正文

移动端h5适配方案

🧑‍💻 写在开头
点赞 + 收藏 === 学会🤣🤣🤣

em + PostCSS插件

使用PostCSS插件将项目中的px单位自动转换为rem,搭配JS动态设置根字体大小(监听window.resize)。

vite配置

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import pxtorem from 'postcss-pxtorem'// https://vite.dev/config/
export default defineConfig({plugins: [vue()],css: {postcss:{plugins: [pxtorem({rootValue: 75,//根据设计稿进行配置,如果设计稿宽度为750则配置75propList: ['*'],unitPrecision: 5,minPixelValue: 2,exclude: /node_modules/i,}),],}},
})

配合的js代码,监听视口变化改变根元素大小

// 处理各机型适配的fontsize
function handleRem() {const baseSize = 75;// 与postcss配置中的rootValue保持一致const scale = document.documentElement.clientWidth / 750;document.documentElement.style.fontSize =baseSize * Math.min(scale, 2) + 'px';
}
// 初始化设置根元素的值
handleRem()
// 监听窗口变化,根据窗口变化来改变根元素的值
window.addEventListener('resize', handleRem)

Viewport单位

使用纯CSS的视口单位(vw, vh)进行布局,视口变化时元素尺寸自动缩放

vite配置

// vite.config.ts
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import postcsspxtoviewport from 'postcss-px-to-viewport'export default defineConfig({plugins: [vue()],css: {postcss: {plugins: [postcsspxtoviewport({unitToConvert: 'px', // 要转换的单位viewportWidth: 750, // 设计稿的视口宽度,一般是375unitPrecision: 5, // 转换后的精度,即小数点位数propList: ['*'], // 指定转换的CSS属性的单位,*代表全部css属性都转换viewportUnit: 'vw', // 指定需要转换成的视口单位,建议使用vwfontViewportUnit: 'vw', // 字体使用的视口单位selectorBlackList: ['.ignore-'], // 指定不转换为视口单位的类名minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换mediaQuery: false, // 是否在媒体查询的css代码中也进行转换,默认falsereplace: true, // 是否直接更换属性值,而不添加备用属性exclude: [/node_modules/], // 忽略某些文件夹下的文件或特定文件})]}}
})

Flexible / Rem

淘宝旧方案,通过JS模拟viewport和rem,主要解决过去移动端高清屏的适配问题。没有具体实践过

针对特殊情况进行处理

以下两种方案均适配上面的Rem + PostCSS插件和Viewport单位 比如场景:滚动到遮住头部组件的位置,头部位置在设计稿上是150px,这种怎么实现
方案1:就是通过offsetHeight,直接获取到针对于不同机型上真实的px值
方案2:使用方法进行转,直接传入设计稿上的高度就完事,会自动适配出对应px然后进行scrolltop的赋值即可

// 根据设计稿上的px,计算出当前设备真实适配的 px 值
/*** @param px 设计稿的px值* @param isFormat 是否返回带px单位的字符串,默认true* @param designWidth 设计稿的宽度,默认750px,根据实际情况修改* @returns 适配后的px值* */
export const pxValueToPx = (px: number, isFormat: boolean = true, designWidth: number = 750) => {// 基准设计稿宽度(通常为 750px)const _designWidth = designWidth;// 获取当前设备的屏幕宽度const windowWidth = document.documentElement.clientWidth;// 计算缩放比例const scale = windowWidth / _designWidth;// 返回自适应后的 px 值return isFormat ? `${px * scale}px` : px * scale;
}

如果对您有所帮助,欢迎您点个关注,我会定时更新技术文档,大家一起讨论学习,一起进步。

在这里插入图片描述

http://www.dtcms.com/a/552976.html

相关文章:

  • 【雅思备考】雅思写作笔记
  • 亚马逊产品备案网站建设要求域名不变修改网站怎么做
  • 6-3〔O҉S҉C҉P҉ ◈ 研记〕❘ 客户端攻击▸通过宏文件实现反向shell
  • Python 实现 Excel 连续数据分组求平均值
  • 小红书获取笔记详情API接口运用指南
  • SQL 自连接详解:当数据表需要与自己对话(组织层级实战)
  • AI代码开发宝库系列:Text2SQL技术入门
  • 网站充值链接怎么做三亚做网站推广
  • 在Azure webapp中搭建 基于chroma的 RAG agent
  • 【春秋云境】CVE-2024-38856 Apache OFbiz从未授权到RCE
  • 货拉拉用户画像基于 Apache Doris 的数据模型设计与实践
  • JAR 包中替换依赖jar的正确姿势(Windows 环境)
  • linux驱动开发之pr_warn和pr_warning
  • Keil(MDK-ARM)和 STM32CubeIDE对比
  • Linux上使用Docker安装MinIO指南
  • Maven 依赖冲突:解决 jar 包版本不一致的 3 种方法
  • android集成react native组件踩坑笔记(Activity局部展示RN的组件)
  • 多语言网站思路十大h5页面制作工具
  • 汽车之家网站系统是什么做的防爆玻璃门网站建设
  • k8s——services资源+pod详解1
  • 基于深度学习的医疗器械分类编码映射系统:实现篇
  • [人工智能-大模型-122]:模型层 - RNN是通过神经元还是通过张量时间记录状态信息?时间状态信息是如何被更新的?
  • React 18.x 学习计划 - 第六天:React路由和导航
  • 逻辑回归正则化参数选择实验报告:贝叶斯优化与网格搜索的效率对比
  • 建设景区网站推文网站中了木马了怎么办
  • 【JAVA 进阶】重生之我要学会 JUC 并发编程
  • POST 数据提交注入测试sqlilabs less 11
  • 微服务高并发设计考虑要点
  • 解码LVGL Linux 系统(Ubuntu/WSL + 开发板)移植
  • 长春网站制作昆明君创网络科技有限公司