基于postCSS手写postcss-px-to-vewiport插件实现移动端适配

news/2024/10/21 10:05:53/

🌟前言

        目前前端实现移动端适配方案千千万,眼花缭乱各有有缺,但目前来说css>postcss-px-to-vewiport是一种非常合适的实现方案,css>postcss-px-to-vewiport是一个基于postCss开发的插件,其原理就是将项目中的px单位转换为vw(视口宽度)。对postCss不了解的朋友可以看看我的上篇文章postCss基本介绍。

🌟实现

        本篇文章是使用vite + vue3 基于postCss来实现css>postcss-px-to-vewiport插件。

1.创建项目

使用vite创建

npm init vite@latest

使用vue脚手架创建

vue create projectname

选自己喜欢的方式创建就OK

2.简单布局

在公司项目开发中,UI会出设计图,会有一个设计稿的宽度,然后我们根据这个宽度去适配,假设我们现在设计稿的宽度是1280,那么我们写出下面的简单布局:

App.vue文件:

<template><div class="page"><div class="left"></div><div class="right">测试自适应</div></div>
</template><style scoped>
.page{width: 1276px;height: 748px;display: flex;border: 2px red solid;.left{width: 600px;height: 300px;background-color: cadetblue;}.right{width: 300px;height: 300px;margin-left: 200px;background-color: #425e5e;font-size: 20px;;}
}
</style>

 可以看到,当页面宽度是1280时,我们上面写的代码是没有问题的,那这时候我们修改页面大小效果如下:

明显不是我们想要的效果,那么开搞。 

3.编写插件

vite中是自带postCss的,我们不需要额外安装,在vite.config.ts文件中如下:

javascript">export default defineConfig({plugins: [vue()],server: {host: '0.0.0.0', //默认情况是不能用ip访问port: 3000},css: {css>postcss: {plugins: []}}
})

plugins数组中就是填写需要使用的插件。下面我们编辑pxtoVewiport方法:

javascript">import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import {Plugin} from 'css>postcss'const pxtoVewiport = (): Plugin => {return {css>postcssPlugin:'pxtoVewiport',Declaration(node){const value = node.valueconsole.log('样式值:',value)}}
}
export default defineConfig({plugins: [vue()],server: {host: '0.0.0.0', //默认情况是不能用ip访问port: 3000},css: {css>postcss: {plugins: [pxtoVewiport()]}}
})

此时可以看到打印的信息:

 

也就是说我们已经拿到项目中的所有样式值,那么接下来我们就是要把所有px单位改成vw。

这里我原本自己写正则实现后,发现还会有margin: 20px 60px;这样的情况,裂开,正则太烧脑,使用程序员必备技能,CV大法,看看css>postcss-px-to-vewiport源码是怎么实现的,然后就拿到了这个正则:

javascript">'"[^"]+"|\'[^\']+\'|url\\([^\\)]+\\)|(\\d*\\.?\\d+)'

ok,能用就行,那接下来就是替换过程:

javascript">import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import {Plugin} from 'css>postcss'const getUnitRegexp = (unit: string) => {return new RegExp('"[^"]+"|\'[^\']+\'|url\\([^\\)]+\\)|(\\d*\\.?\\d+)' + unit, 'g');
}const pxtoVewiport = (): Plugin => {return {css>postcssPlugin:'pxtoVewiport',Declaration(node){const value = node.valueif (value.includes('px')) {const pxRegexp = getUnitRegexp('px')node.value = node.value.replace(pxRegexp, (match) => {return match.replace(/(\d*\.?\d+)/g, (m) => {return (parseFloat(m) / 1280 * 100).toFixed(3) + 'vw'})})let reg = new RegExp(/px/,'ig') //在这儿把px删掉node.value = node.value.replace(reg,'')}}}
}export default defineConfig({plugins: [vue()],server: {host: '0.0.0.0', //默认情况是不能用ip访问port: 3000},css: {css>postcss: {plugins: [pxtoVewiport()]}}
})

 跑起项目:

 

 这时候单位都转换成了vw,在各种大小的屏幕都是我们想看到的效果了。

继续看代码

这里的1280就是我们开发中的设计稿宽度,3是保留的位数。那么继续优化一下,将设计稿宽带和保留位数改为可传参数:

javascript">import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import {Plugin} from 'css>postcss'const getUnitRegexp = (unit: string) => {return new RegExp('"[^"]+"|\'[^\']+\'|url\\([^\\)]+\\)|(\\d*\\.?\\d+)' + unit, 'g');
}
const pxtoVewiport = (viewportSize = 375,Places = 2): Plugin => {return {css>postcssPlugin:'pxtoVewiport',Declaration(node){const value = node.valueif (value.includes('px')) {const pxRegexp = getUnitRegexp('px')node.value = node.value.replace(pxRegexp, (match) => {return match.replace(/(\d*\.?\d+)/g, (m) => {return (parseFloat(m) / viewportSize * 100).toFixed(Places) + 'vw'})})let reg = new RegExp(/px/,'ig') //在这儿把px删掉node.value = node.value.replace(reg,'')}}}
}
export default defineConfig({plugins: [vue()],server: {host: '0.0.0.0', //默认情况是不能用ip访问port: 3000},css: {css>postcss: {plugins: [pxtoVewiport(1280,3)]}}
})

 到里就完成了一个移动端适配的小插件。

🌟总结

基于postCss还可以做很多事情,postCss就是css界的babel,我们这里也是基本实现了css>postcss-px-to-vewiport插件的功能。后续还可以继续改进。


http://www.ppmy.cn/news/1444264.html

相关文章

mybatis-plus 动态表名简易使用

场景&#xff1a;由于有些表是分表的&#xff0c;需要给表名添加后缀才能正确地访问表&#xff0c;如sys_user_2024_01 代码 依赖版本 <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><ve…

MySQL随便聊----之MySQL的调控按钮-启动选项和系统变量

-------MySQL是怎么运行的 基本介绍 如果你用过手机&#xff0c;你的手机上一定有一个设置的功能&#xff0c;你可以选择设置手机的来电铃声、设置音量大小、设置解锁密码等等。假如没有这些设置功能&#xff0c;我们的生活将置于尴尬的境地&#xff0c;比如在图书馆里无法把手…

编译Qt6.5.3LTS版本(Mac/Windows)的mysql驱动(附带编译后的全部文件)

文章目录 0 背景1 编译过程2 福利参考 0 背景 因为项目要用到对MYSQL数据库操作&#xff0c;所以需要连接到MYSQL数据库。但是连接需要MYSQL驱动&#xff0c;但是Qt本身不自带MYSQL驱动&#xff0c;需要自行编译。网上有很多qt之前版本的mysql驱动&#xff0c;但是没有找到qt6…

细说温度测量-热电偶1

细说温度测量——热电偶1 四种现代温标的转换公式热电偶测量热电偶电压参比端基准电路 四种现代温标的转换公式 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ K ˚C 273.15 ˚R ˚F 459.67 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ˚C 5/9 (…

利用Spring Boot后端与Vue前端技术构建现代化电商平台

作者介绍&#xff1a;✌️大厂全栈码农|毕设实战开发&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 &#x1f345;获取源码联系方式请查看文末&#x1f345; 推荐订阅精彩专栏 &#x1f447;&#x1f3fb; 避免错过下次更新 Springboot项目精选实战案例 更多项目…

Centos编译安装python3.9

Centos编译安装python3.9 2024年4月24日, 当前Linux环境只能下载tar.gz包, 然后编译安装, 不能直接使用yum快速安装 准备相关依赖 yum -y install epel-release yum -y update 安装开发者工具 yum groupinstall "Development Tools" -y yum install openssl-de…

浏览器的同源策略与解决跨域

同源策略&#xff08;协议、域名、端口&#xff09; 同源策略&#xff08;Same-Origin Policy&#xff09;是一个在浏览器安全模型中被实施的重要安全机制。它是基于域名、协议和端口号的限制&#xff0c;用于防止不同源的网页间的恶意行为和信息泄露。 根据同源策略&#xf…

Swish和H-Swish激活函数:提升模型训练效率

文章目录 Swish激活函数H-Swish激活函数实现总结参考 在深度学习领域&#xff0c;激活函数是神经网络中的关键组成部分&#xff0c;它决定了网络的输出和性能。近年来&#xff0c;研究人员提出了许多新的激活函数&#xff0c;其中Swish激活函数因其独特的性能优势而备受关注。这…