postcss-px-to-viewport 移动端适配

news/2024/11/13 18:36:48/文章来源:https://www.cnblogs.com/scale/p/18539376

以前做移动端项目的时候都是用rem来做适配,现在基本上都是通过viewport单位来做。 postcss-px-to-viewport就是一个将px单位转换为视口单位的 (vw, vh, vmin, vmax) 的 PostCSS 插件,它可以将你CSS中的px单位转化为vw,1vw等于1/100视口宽度。

1.安装

 
javascript
代码解读
复制代码
$ npm install postcss-px-to-viewport --save-dev

2.配置参数

在项目根目录创建postcss.config.js文件,添加如下配置。

 
javascript
代码解读
复制代码
module.exports = ({ webpack }) => {return {plugins: {autoprefixer: {},"postcss-px-to-viewport": {unitToConvert: "px", // 要转化的单位viewportWidth: 750, // UI设计稿的宽度unitPrecision: 6, // 转换后的精度,即小数点位数propList: ["*"], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换viewportUnit: "vw", // 指定需要转换成的视窗单位,默认vwfontViewportUnit: "vw", // 指定字体需要转换成的视窗单位,默认vwselectorBlackList: [], // 指定不转换为视窗单位的类名,minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false// replace: true, // 是否转换后直接更换属性值exclude: [/node_modules/], // 设置忽略文件,用正则做目录名匹配landscape: false // 是否处理横屏情况}}}
}

启动项目,此时已经自动进行了转换,会根据postcss.config.js文件中的viewportWidth的值将px转换为vw,比如说设置div宽度为750px,转换后就是100vw。此时的样式如下:

输入

 
css
代码解读
复制代码
.class {margin: -10px .5vh;padding: 5vmin 9.5px 1px;border: 3px solid black;border-bottom-width: 1px;font-size: 14px;line-height: 20px;
}

输出

 
css
代码解读
复制代码
.class {margin: -3.125vw .5vh;padding: 5vmin 2.96875vw 1px;border: 0.9375vw solid black;border-bottom-width: 1px;font-size: 4.375vw;line-height: 6.25vw;
}

3.vant

(1).问题1 vant中组件的css单位没有转换

将所有的配置好之后,启动项目,添加了vant的组件后,打开检查,发现仍然是px单位,没有进行转换。

 因为postcss.config.js文件中的exclude参数将整个node_modules文件夹中的组件都给排除掉了,安装的插件会使用它默认的单位,将exclude改为[]

(2).问题2 转换后的vant组件特别小

此时vant组件的单位也进行了转换,但是展示会特别的小。

通过排查,在github上找到vant的官方demo,发现vant设置视口宽度是375,而我们设置的宽度为750,所以vant组件在转换之后会宽高都变为原来的一半大小。

所以我们要设置当转换到vant组件样式的单位时,将视口宽度设置为375,通过百度(cv工程师),将postcss.config.js配置修改如下:

 
javascript
代码解读
复制代码
const path = require("path")
module.exports = ({ webpack }) => {const designWidth = webpack.resourcePath.includes(path.join("node_modules", "vant")) ? 375 : 750return {plugins: {autoprefixer: {},"postcss-px-to-viewport": {unitToConvert: "px", // 要转化的单位viewportWidth: designWidth,unitPrecision: 6, // 转换后的精度,即小数点位数propList: ["*"], // 指定转换的css属性的单位,*代表全部css属性的单位都进行转换viewportUnit: "vw", // 指定需要转换成的视窗单位,默认vwfontViewportUnit: "vw", // 指定字体需要转换成的视窗单位,默认vwselectorBlackList: [], // 指定不转换为视窗单位的类名,minPixelValue: 1, // 默认值1,小于或等于1px则不进行转换mediaQuery: true, // 是否在媒体查询的css代码中也进行转换,默认false// replace: true, // 是否转换后直接更换属性值exclude: [], // 设置忽略文件,用正则做目录名匹配 /node_modules/landscape: false // 是否处理横屏情况}}}
}

此时页面已经恢复了正常。

4.行内样式

后续在使用vant的image组件的时候发现,在传入width和height750之后,图片超出了页面,打开检查发现仍然是px单位,没有转化为vw,传入的width和height是加到了img标签父元素的行内样式上,创建一个div实验了一下,postcss-px-to-viewport不会对行内样式进行转换,只会转换卸载style标签中的样式。给image组件添加了class,展示正常。

使用width和height传入:

使用class控制样式: 

至此,结束

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/831712.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

支持多语言、多商店的商城,.Net7 + EF7领域驱动设计架构

推荐一个跨平台、模块化、可扩展且超快速的开源一体化电子商务平台。01项目简介 Smartstore 支持桌面和移动平台、多语言、多商店、多货币的商城,并支持SEO优化,支持无限数量的产品和类别、报表、ESD、折扣、优惠券等等。 还有一套全面的 CRM 和 CMS、销售、营销、付款和物流…

连接数据库-mysql

连接前的三个条件:下载好JDK环境、Mysql、数据库驱动jar包 jar包也去MySQL官网上下就可以 然后创建数据库,我是在Navicat上建的数据库然后创建的表。也尝试在小黑框那创建了但总出错。跟着up主改配置改了一通up主是成果了,我也没成功。。。、 然后在eclipse上新建项目,连上…

联影医疗王欢:智能管理驾驶舱推动业务闭环管理

在当今竞争激烈的市场环境下,市场的瞬息万变和客户需求的多样化,使得传统封闭式的经营管理模式难以为继,企业内部管理的复杂性也在不断加剧。许多企业在经营管理中普遍存在着管理效率低下、管理决策滞后、缺少闭环机制、目标缺乏协同、绩效信息黑匣等问题。 面对这些挑战,“…

代码语言模型是如何训练的:Qwen2.5-Coder 技术报告学习

Qwen2.5-Coder 是通义千问最新的代码语言模型,基于 Qwen2.5 的架构继续 pretrain 了 5.5T 的 token。通过细致的数据清洗、可扩展的合成数据生成和平衡的数据混合,Qwen2.5-Coder在展示令人印象深刻的代码生成能力的同时,还保留了通用的多功能性。本文根据官方的技术报告(Qw…

Codigger之配置LunarVim

Lunarvim是一款先进的集成开发环境(IDE),构建于Neovim之上,致力于为用户提供一个高效且个性化的编程平台。该环境融合了Neovim的核心优势,并增添了多项扩展功能,以支持诸如代码高亮、自动补齐、以及语言服务器协议(LSP)等特性,旨在为Codigger用户在Neovim中复现熟悉的…

从源码分析,MySQL优化器如何估算SQL语句的访问行数

本文将从源码角度分析SQL优化器代价估算的基础——行数估算,并总结MySQL当前设计存在的局限性。最后用一个现网问题的定位过程作为例子,给出该类问题的解决方案。本文分享自华为云社区《【华为云MySQL技术专栏】MySQL优化器如何估算SQL语句的访问行数》,作者:GaussDB数据库…

乐维网管平台(六):如何正确管理设备端口

一、什么是端口下联 在网络环境中,端口下联是指网络设备(通常是交换机)的端口与其他设备相连接的一种网络架构关系。交换机作为网络中的核心连接设备,其端口下联可以连接多种类型的终端设备,如计算机、服务器、IP 电话等,也可以连接下级网络设备,如接入层交换机连接到汇…

自动驾驶中的ego states包含的内容

截图来自论文:[2305.10430] Rethinking the Open-Loop Evaluation of End-to-End Autonomous Driving in nuScenes

ABB机器人维修之IRB 4600助力半导体晶圆

"ABB机器人:半导体晶圆运输盒拆包自动化的革新方案 在现代电子设备中,半导体无疑扮演着至关重要的角色,而其制造过程之精密复杂,更是令人叹为观止。然而,在半导体必要材料——晶圆于各机器或工厂间频繁转移的过程中,如何有效减少其所受的污染与损耗,却始终是一大亟…

如何处理微信小程序大量未捕获的异常

1)如何处理微信小程序大量未捕获的异常2)如何关闭代码创建的纹理的读写,或者创建不带读写的图片3)回收带有贴图和Collider的Mesh,如何正确用对象池维护4)Cloth组件使用在一个篮筐上,运行后篮网扭曲,是什么原因这是第408篇UWA技术知识分享的推送,精选了UWA社区的热门话…

2024年最新21款精品项目管理软件推荐:提高工作效率必备

在项目管理中,选择合适的软件工具能显著提高工作效率,优化团队协作,增强项目透明度和跟踪能力。以下是2024年最新、最受欢迎的20款精品项目管理软件推荐,它们涵盖了不同团队规模、行业需求以及功能特点,帮助用户更好地管理任务、时间、资源和预算。 1. 禅道 (ZenTao)功能:…

代码随想录之滑动窗口、Java日期api、集合(11.4-11.11)

代码 1、长度最小的子数组⭐ 使用滑动窗口的思想,外层循环控制结束位置j,内层循环控制起始位置i,看似是双层循环,但时间复杂度是o(2n)。 2、水果成篮 自己想法:使用backet1和backet2表示篮子1和篮子2;使用backet1Account和backet2Account分别表示两个篮子里水果的数量,内…