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

vue3 postcss-px-to-viewport 页面自适应 postcss-px-to-viewport 是一个 PostCSS 插件,它可以将 px 单位转换为视口单位(vw、vh 或 vmin)。视口单位是相对于视口尺寸来计算的长度单位,而不是相对于父元素或根元素。这意味着使用视口单位进行布局和样式设置时,元素会随着屏幕尺寸的变化而自适应。 阅读详情

🌟前言

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

🌟实现

        本篇文章是使用vite + vue3 基于postCss来实现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文件中如下:

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

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

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import {Plugin} from 'postcss'

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

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

 

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

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

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

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

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import {Plugin} from 'postcss'

const getUnitRegexp = (unit: string) => {
  return new RegExp('"[^"]+"|\'[^\']+\'|url\\([^\\)]+\\)|(\\d*\\.?\\d+)' + unit, 'g');
}

const pxtoVewiport = (): Plugin => {
  return {
    postcssPlugin:'pxtoVewiport',
    Declaration(node){
      const value = node.value
      if (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: {
    postcss: {
      plugins: [pxtoVewiport()]
    }
  }
})

 跑起项目:

 

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

继续看代码

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

import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import {Plugin} from 'postcss'

const getUnitRegexp = (unit: string) => {
  return new RegExp('"[^"]+"|\'[^\']+\'|url\\([^\\)]+\\)|(\\d*\\.?\\d+)' + unit, 'g');
}
const pxtoVewiport = (viewportSize = 375,Places = 2): Plugin => {
  return {
    postcssPlugin:'pxtoVewiport',
    Declaration(node){
      const value = node.value
      if (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: {
    postcss: {
      plugins: [pxtoVewiport(1280,3)]
    }
  }
})

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

🌟总结

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

postcss-px2vw:一款 PostCSS 插件,将 px 转换成 vw 和 rem postcss-px2vw 一款 插件,将 px 转换成 vw 和 rem。 该插件主要结合了 和 的功能,精简了不常用的配置。默认将 vw 作为优先单位使用,以 rem 作为回退模式。考虑到 vw 在移动设备的支持度不如 rem,这款插件很好的解决了该问题。 安装 $ npm i @moohng/postcss-px2vw -D 使用 // .postcssrc.js module.exports = { plugins: { '@moohng/postcss-px2vw': {} } } 举例: // input .class { border: 1px solid black; margin-bottom: 1px; font-size: 20px; line-height: 30px; } // output .class { border 立即下载

相关推荐

统信UOS上Qt5.12.8离线安装保姆级教程(避坑网络登录与GCC选择)

本文提供统信UOS系统下Qt5.12.8离线安装的完整教程,涵盖环境准备、安装步骤、常见问题解决及开发优化建议。特别针对无网络环境下的登录验证跳过、GCC版本匹配等关键问题提供解决方案,帮助开发者快速搭建稳定的Qt开发环境。

weixin_30666401的博客 462

vite中使用postcss-px-to-viewport,适配vant

由于不是将所有的页面进行适配,所以我们只能通过vw的include配置来将某几个页面进行适配,如果使用rem的话,则会将所有的页面都进行rem适配了。于是我们正常去使用postcss-px-to-viewport,但是会发现include配置并没有什么用。cnjm的postcss-px-to-viewport,这个我没有去试,因为看了md发现是只增加了暴露文件的代码。我们使用完整版的’postcss-px-to-viewport’,安装使用以下命令。效果:可以看到vant组件中的单位也已经变成了vw了。

weixin_43239880的博客 4354

Telegram AI Bot自动化实战:5步用Make搭建业务工作台

Telegram Bot 是一种轻量级、高抵达率的消息自动化载体,其核心价值在于将结构化消息(如text、photo、callback_query)转化为可编程的事件流。基于 Bot API 的简洁设计与 Webhook 机制,开发者无需复杂鉴权即可实现毫秒级响应。结合低代码平台 Make,可快速构建具备上下文识别、条件路由、多系统分发与错误熔断能力的自动化流程。该方案特别适用于客服分发、数据同步、IoT告警等高频、规则明确、需即时反馈的业务场景,显著降低对 Python/Node.js 编程与 DevOp

weixin_33158887的博客 301

vite+postcss-px-to-viewport适配配置

vite+postcss-px-to-viewport 适配配置

oyy_1126的博客 1800

Cesium中实现GPU计算的泥石流地形侵蚀

通过模拟分析,可以提前识别可能发生泥石流的区域,为防灾减灾提供依据,及时发布预警,避免或减少人员伤亡和财产损失。:在建设公路、桥梁、水库等基础设施时,通过泥石流模拟分析,可以预测泥石流可能对这些设施的影响,帮助工程设计者采取合适的防护措施,确保设施的安全性。:模拟分析有助于为灾后救援工作提供科学依据,确定受灾区域的范围、救援难度等,为救援队伍制定合理的行动方案,提升救援效率。:泥石流是山区常见的地质灾害之一,通过模拟分析可以评估某一地区发生泥石流的风险,指导土地使用规划、人口迁移等决策。

weixin_43481439的博客 1321

使用PlotNeuralNet绘制深度学习网络图的基本操作

使用PlotNeuralNet绘制深度学习网络图的基本操作

weixin_46877907的博客 2111

vue3 vite使用postcss-px-to-viewport 实现页面自适应

视口单位是相对于视口尺寸来计算的长度单位,而不是相对于父元素或根元素。这意味着使用视口单位进行布局和样式设置时,元素会随着屏幕尺寸的变化而自适应。

m0_68716504的博客 8955

Tesla V100 Windows 部署实战:从驱动安装到模式切换的避坑指南

本文是一份详细的Tesla V100在Windows系统下的部署实战指南。文章从硬件组装、系统选择讲起,重点阐述了驱动安装的正确方法,并深入剖析了将计算卡从TCC模式切换至WDDM模式的诱惑与潜在陷阱。最终,作者推荐保持默认TCC模式,并提供了使用nvidia-smi命令行等稳定可靠的显卡监控方案,旨在帮助用户避开常见坑点,高效利用这张专业计算卡进行AI计算等任务。

java5的博客 1711

Vue使用 postcss-px-to-viewport 适配移动端、PC端布局 px自动转换vw

移动端适配方案中,可以使用vw作为页面中各元素的单位,以此来完成适配效果。下面我们来讲怎样在vue-cli 项目中使用 postcss-px-to-viewport插件,vue-cli2、vue-cli3、vue-cli4、vue-cli5 方法集合。

森海か的博客 6553

【R语言】基于Biomod2集成平台探究物种分布区的构建流程(SDMs)

我为什么想要写这个内容呢?其实我已经想了很久了,但是一直没有把所有的代码给理清楚,此外这将是我之后研究的主要方向。本博客讲述了如何基于Biomod2集成平台构建物种分布模型的全流程,以及我在使用该模型时的一些心得,同时还有我提供的一些小福利(一键处理代码),可以十分快捷的帮助你完成SDMs的构建,写出你的中英文论文。

amyniez的博客,欢迎交流讨论 3890

萤石云cs刷机解绑固件

萤石CS-C2C-32WFR刷机包,萤石CS-C6TC刷机包,萤石CS-C6H刷机包,萤石猫眼产品等等。萤石云摄像头固件修改,绑定手机号解绑,更换序列号教程。

海康威视技术支持 2万+

Vite配置postcss-px-to-viewport

【代码】Vite配置postcss-px-to-viewport。

walaw11的博客 852

【从零开始学习 UVM】1.2、UVM 概述 —— UVM Installation(UVM 安装)

【从零开始学习 UVM】1.2、UVM 概述 —— UVM Installation(UVM 安装)

努力,加油每一天鸭~ 1946

vue3实现本地开发使用的px转换成vw,px转换成rem方法整理

项目中如果想本地开发使用px,但是界面上线以后界面是自适应的效果,可以有多种方式来实现效果。

浩星 4307

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

vue3使用postcss-px-to-viewport 附带vite配置

postcss-px-to-viewport做前端自适应,适用于pc和移动。3、element-ui、vant-ui 等UI组件库 默认会被转换。1.下载 postcss-px-to-viewport 插件。1、直接在dom元素上使用 style 是不会被转换的。2.在vite.config.ts中添加配置。2、用类选择器、id选择器等才会被转换。

善假于物 1915

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Vite构建的Vue3移动端项目使用postcss-px-to-viewport

Vite构建的Vue3移动端项目怎么使用postcss-px-to-viewport

weixin_44023357的博客 1644

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

vue2+vant开发H5项目如何将单位px转换成vw--postcss插件

vue2+vant开发H5项目如何将单位px转换成vw

Jolly_zhang的博客 1003

pc端转移动端 与 px转vw适配插件postcss-px-to-viewport

响应式网站,h5 网站,宽屏网站,这些都可以称为自适应网站,简单的说就是「一个网站可以兼容不同的终端」,比如:电脑、ipad、手机等。至于在网上看到的这句<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, minimum-scale=1, user-scalable=no" />把其中的user-scalable设置为yes或者是no,对于我的项目都是不生效的,目前还没有找到原因。

weixin_48924995的博客 1187

【postcss】解决vite中使用postcss-px-to-viewport无法使用vant等多种设计尺寸问题|postcss-plugins

vite中使用postcss-px-to-viewport适配vant的375和自己的750等其他设计尺寸

页面仔的博客 1万+

vue-cli中使用postcss-px-to-viewport 将px转换成vw

移动端适配方案中,可以使用vw作为页面中各元素的单位,以此来完成适配效果。下面我们来讲怎样在vue-cli 项目中使用 postcss-px-to-viewport插件。 前言 先来认识一下postcss,postcss是一个用 JavaScript 工具和插件转换 CSS 代码的工具。 postcss的作用: 兼容各个内核的浏览器,增强代码的可读性。autoprefixer 插件可以自动获取浏...

蒲公英芽的博客 1万+

vue移动端适配(px转vw)postcss-px-to-viewport配置

安装postcss-px-to-viewport npm install postcss-px-to-viewport 根目录新建postcss.config.js文件 //postcss.config.js文件 module.exports = { plugins: { 'postcss-px-to-viewport': { unitToConvert: ...

农码精神 4086

vue3 vite 中使用post-css-to-viewport 适配屏幕步骤

屏幕适配

曾经蜡笔没有小新 1742

移动端布局之postcss-px-to-viewport(兼容vant)

在今天这篇文章中,我并不会在这里讲一些移动端视口的概念,包括物理像素和逻辑像素,理想视口,dpr等等等等,我只介绍这样一种非常不错的移动端适配方案:post-css-to-viewport,如果我说这种方案能解决98%以上的移动端布局痛点,我想整个掘金,应该没有人会反驳。

woniuyibuyibu的博客 3940

移动端项目vw单位,px-to-vw插件

输入px-to-vw--可以看到px单位被自动转换为vw单位了

angrynouse的博客 5076

vite项目 postcss-px-to-viewport适配vant

【代码】vite项目 postcss-px-to-viewport适配vant。

slice_93的博客 2235
上一篇: postCss基本介绍
琢鸣
琢鸣 新星创作者: 前端开发技术领域 新星创作者: 前端开发技术领域
博客等级 码龄7年 9626粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

琢鸣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值