基于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 立即下载

相关推荐

【MATLAB/Simulink】从模型到飞行:基于PX4与Rflysim的无人机MBD实战指南

本文详细介绍了基于MATLAB/Simulink与PX4、Rflysim的无人机模型开发与飞行控制实战指南。通过MBD(基于模型设计)方法,从建模、仿真到代码生成与硬件部署,实现无人机开发的高效闭环。文章涵盖开发环境搭建、动力学建模、控制算法实现及测试验证全流程,为无人机开发者提供实用技巧与优化建议。

weixin_30181209的博客 410

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

Sentence-BERT 语义相似度双塔模型

论文介绍 发表:2019,EMNLP 论文题目:《Sentence-BERT:sentence embeddings using siaese BERT-networks》 论文地址:https://arxiv.org/abs/1908.10084 Github:https://github.com/UKPLab/sentence-transformers 适用领域: 句向量生成 语义相似度计算 语义搜索 无监督任务(聚类) 1 概述 在20年之前的各种预训练模型中,比如bert,XLNet,Alb

weiyaner的博客 9194

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

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

oyy_1126的博客 1800

华硕三频万兆分布式路由组网实战:从AiMesh 2.0到全屋Wi-Fi 6覆盖

Mesh组网是解决大户型Wi-Fi覆盖难题的主流方案,其核心原理是通过多个节点构建网状网络,实现设备间的无缝漫游。在技术层面,Wi-Fi 6标准、三频设计(包括专属回程频段)和有线回程等技术,共同提升了网络的带宽、稳定性和抗干扰能力。这些技术的工程价值在于,能够为多设备并发、高带宽应用(如4K/8K流媒体、在线游戏、内网文件高速传输)提供可靠支撑。具体到应用场景,例如利用华硕AiMesh 2.0系统,配合三频万兆分布式路由器,可以实现智能的设备连接与负载均衡。通过合理规划节点位置、优先采用有线回程,并进行Q

weixin_34054866的博客 433

保姆级教程:用Python脚本一键把选股结果导入通达信自选股(附完整代码)

本文提供了一份详细的Python自动化教程,教你如何将选股结果一键导入通达信自选股。通过解析通达信文件结构、编写Python脚本实现股票代码转换和批量导入,大幅提升量化交易效率。教程包含完整代码示例,特别适合使用通达信(TDX)的投资者和量化交易开发者。

weixin_30915951的博客 360

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

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

m0_68716504的博客 8955

ThingsBoard3.9.1规则引擎方式发送钉钉通知消息

thingsboard3.9.1/4.0规则链方式发送钉钉通知消息。

hssjf的专栏 531

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-terra包|第一节】- 栅格相关性、散点图 、波段的计算与异常值处理

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 —```mermaid flowchat st=>start: 开始 e=>end: 结束 op=>operation: 我的操作 cond=>condition: 确认? st->op->cond cond(yes)->e cond(no)->op 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能.

地理空间科学的博客 5615

【置顶】ARMv8/ARMv9架构入门到精通-[目录]

周贺贺,baron,代码改变世界,coding_the_world,Arm精选,arm_2023,安全启动,加密启动 optee、ATF、TF-A、Trustzone、optee3.14、MMU、VMSA、cache、TLB、arm、armv8、armv9、TEE、安全、内存管理、页表,Non-cacheable,Cacheable, non-shareable,inner-shareable,outer-shareable, optee、ATF、TF-A、Trustzone、optee3.14、MMU、V

baron-周贺贺-代码改变世界ctw 2万+

Vite配置postcss-px-to-viewport

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

walaw11的博客 852

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

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

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

浩星 4307

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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

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

weixin_44023357的博客 1644

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、付费专栏及课程。

余额充值