返回顶部
首页 > 资讯 > 前端开发 > JavaScript >postcss插件中怎么自动转换px到rem
  • 350
分享到

postcss插件中怎么自动转换px到rem

2024-04-02 19:04:59 350人浏览 独家记忆
摘要

这篇文章将为大家详细讲解有关postCSS插件中怎么自动转换px到rem,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 post

这篇文章将为大家详细讲解有关postCSS插件中怎么自动转换px到rem,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

postcss 是 css 的 transpiler,它对于 css 就像 babel 对于 js 一样,能够做 css 代码的分析和转换。同时,它也提供了插件机制来做自定义的转换。

postcss 的原理

postcss 是 css 到 css 的转译器,它也和 babel 一样,分为 parse、transfORM、generate 3个阶段。各种转换插件都是工作在 transform 阶段,基于 AST 做分析和转换。

postcss插件中怎么自动转换px到rem

css 的 AST 比 js 的简单多了,主要有这么几种:

atrule:以 @ 开头的规则,比如:

@media screen and (min-width: 480px) {
    body {
        background-color: lightgreen;
    }
}

rule:选择器开头的规则,比如:

ul li {
 padding: 5px;
}

decl:具体的样式,比如:

padding: 5px;

比起 js parser 的那几十种 AST 是不是简单的多?

这些可以通过 astexplorer.net可视化的查看

postcss插件中怎么自动转换px到rem

postcss 插件的写法

postcss 插件是工作在 transform 阶段,处理 ast 节点,插件的形式是这样的:

const plugin = (options = {}) => {
  return {
    postcssPlugin: '插件名字',

    Rule (node) {},
    Declaration (node) {},
    AtRule (node) {}
  }
}

外层函数接受 options,返回一个插件的对象,声明对什么节点做处理的 listener,然后在对应的 listener 里写处理逻辑就行。

还可以这样写:

module.exports = (opts = {}) => {
  return {
    postcssPlugin: '插件名字',
    prepare (result) {
      // 这里可以放一些公共的逻辑
      return {
        Declaration (node) {},
        Rule (node) {},
        AtRule (node) {}
      }
    }
  }
}

在 prepare 里返回各种 listener,这样比起第一种来,好处是可以存放一些公共的逻辑。

然后可以这样来运行插件:

const postcss = require('postcss');

postcss([plugin({
    // options
})]).process('a { font-size: 20px; }').then(result => {
    console.log(result.css);
})

下面我们来写一个简易的 px 自动转 rem 的插件来练练手。

实战案例

需求描述

px 是一个固定的长度单位,而设备视口的尺寸是各种各样的,我们想通过一套样式来适配各种设备的显示,就需要相对的单位,常用的是 rem。

rem 的本质就是等比缩放,相对于 html 元素的 font-size。

比如 html 的 font-size 设置为 100px,那 1rem 就等于 100px,之后的样式如果是 200px 就写为 2rem。

这样我们只需要修改 html 的 font-size 就可以适配各种屏幕宽度的显示,具体的单位会做等比缩放。

我们要根据 html 的 font-size 值来把所有的 px 转换为 rem,一般都是手动来做这件事情的,但比较繁琐,知道了计算方式之后,完全可以用 postcss 插件来自动做。

接下来我们就实现下这个 postcss 插件

代码实现

我们搭一下插件的基本结构,只需要声明对 Declaration 处理的 listener:

const plugin = (options) => {
    return {
        postcssPlugin: 'postcss-simple-px2rem',
        Declaration (decl) {
           
        }
    }
}

然后要做的就是把 decl 的样式值中的 px 转换为 rem,简单的正则替换就行:

const plugin = (options) => {
    const pxReg = /(\d+)px/ig;
    return {
        postcssPlugin: 'postcss-simple-px2rem',
        Declaration (decl) {
            decl.value = decl.value.replace(pxReg, (matchStr, num) => {
                return num/options.base + 'rem';
            });
        }
    }
}

通过字符串的 replace 方法来做替换,第一个参数是匹配的字符串,后面的参数是分组,第一个分组就是 px 的值。

计算 px 对应的 rem 需要 1rem 对应的 px 值,可以支持通过 options 来传入。

然后我们测试下:

postcss([plugin({
    base: 100
})]).process('a { font-size: 20px; }').then(result => {
    console.log(result.css);
})

可以看到,已经正确的做了转换:

postcss插件中怎么自动转换px到rem

当然,我们这个插件只是案例,还不够完善,要做的完善的话需要更复杂的正则。

总结

postcss 是 css 的 transpiler,就像 babel 是 js 的 transpiler 一样,而且 postcss 的 AST 只有几种节点,比较简单,也可以通过 astexplorer.net 来可视化的查看。

postcss 也提供了插件功能,可以做一些自定义的分析和转换。

我们实现了简单的 px 自动转 rem 的插件:

rem 是通过等比缩放的方式来达到一套样式适配不同设备宽度的显示的方案,需要做 px 到 rem 的转换,这件事可以用 postcss 插件来自动来做。

其实 postcss 插件的分析和转换功能还有很多的应用,比如切换主题色,从白到黑,完全就可以用 postcss 自动分析颜色的值,然后做转换。

关于postcss插件中怎么自动转换px到rem就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: postcss插件中怎么自动转换px到rem

本文链接: https://lsjlt.com/news/88765.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • postcss插件中怎么自动转换px到rem
    这篇文章将为大家详细讲解有关postcss插件中怎么自动转换px到rem,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。 post...
    99+
    2024-04-02
  • 移动端适配如何使px自动转换rem
    小编给大家分享一下移动端适配如何使px自动转换rem,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!先安装postcss-pxto...
    99+
    2024-04-02
  • vue项目中怎么使用pinyin转换插件
    今天小编给大家分享一下vue项目中怎么使用pinyin转换插件的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。使用pinyin...
    99+
    2023-06-29
  • 怎样自动把报表插入到 word 文档中
    在很多业务场景中需要在 word 文档中嵌入报表。比如下图这个报告:这是一个某大学年度毕业生就业报告,其中表格和统计图的数据来自数据库,如果通过报表工具,制作这样的表格和统计图是轻而易举的事情,但如果要把这些报表和统计图做到 word 报告...
    99+
    2023-06-02
  • 怎么自动安装Composer的php-build插件
    这篇文章主要介绍“怎么自动安装Composer的php-build插件”,在日常操作中,相信很多人在怎么自动安装Composer的php-build插件问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么自动安...
    99+
    2023-06-20
  • vue3 api自动导入插件怎么使用
    这篇文章主要介绍了vue3 api自动导入插件怎么使用的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇vue3 api自动导入插件怎么使用文章都会有所收获,下面我们一起来看看吧。1. vue3...
    99+
    2023-07-05
  • windows中bartender怎么自动换行
    本文小编为大家详细介绍“windows中bartender怎么自动换行”,内容详细,步骤清晰,细节处理妥当,希望这篇“windows中bartender怎么自动换行”文章能帮助大家解决疑惑,下面跟着小编的思...
    99+
    2022-12-02
    windows bartender
  • php数据类型自动转换怎么实现
    这篇文章主要讲解了“php数据类型自动转换怎么实现”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“php数据类型自动转换怎么实现”吧!1.强类型和弱类型PHP变量有两种类型:强类型和弱类型。强...
    99+
    2023-07-05
  • CSS中怎么实现自动换行
    这篇文章将为大家详细讲解有关 CSS中怎么实现自动换行,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。CSS内容自动换行CSS自动换行问题你是否了解?正常字符...
    99+
    2024-04-02
  • ionic2中自定义cordova插件怎么用
    这篇文章主要介绍了ionic2中自定义cordova插件怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。假设需求是 写一个日志插件,可以...
    99+
    2024-04-02
  • css3中怎么实现一个可滑动跳转的分页插件
    css3中怎么实现一个可滑动跳转的分页插件,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。代码如下:<div class="pa...
    99+
    2024-04-02
  • 怎么在Golang中转换自定义类型
    怎么在Golang中转换自定义类型?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。golang适合做什么golang可以做服务器端开发,但golang很适合做日志...
    99+
    2023-06-06
  • 怎么在html中禁止自动换行
    怎么在html中禁止自动换行?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。禁止html自动换行的方法:1、给html元素添加“display:inline”样式,将元素设置为行...
    99+
    2023-06-14
  • Spring Boot结合IDEA自带Maven插件怎么快速切换profile
    这篇“Spring Boot结合IDEA自带Maven插件怎么快速切换profile”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们...
    99+
    2023-07-05
  • windows中tmp文件怎么转换格式
    这篇文章主要介绍了windows中tmp文件怎么转换格式的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇windows中tmp文件怎么转换格式文章都会有所收获,下面我们一起来看看吧。tmp文件转换格式的方法tmp...
    99+
    2023-07-01
  • linux中的文件编码怎么转换
    本篇内容主要讲解“linux中的文件编码怎么转换”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux中的文件编码怎么转换”吧! ...
    99+
    2023-05-25
    linux
  • 怎么在html中自动跳转页面
    怎么在html中自动跳转页面?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。html有什么特点1、简易性:超级文本标记语言版本升级采用超集方式,从而更加灵活方便,...
    99+
    2023-06-14
  • C++中用户怎么自定义转换过程
    本篇文章为大家展示了C++中用户怎么自定义转换过程,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。传统转换方式(Traditional Type-Casting)C++作为C语言的超集,完全继承了C语...
    99+
    2023-06-17
  • C#中怎么自定义类型转换函数
    C#中怎么自定义类型转换函数,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。/// <summary>  /// 将字符型...
    99+
    2023-06-18
  • php怎么实现自动将链接转换成二维码
    本文小编为大家详细介绍“php怎么实现自动将链接转换成二维码”,内容详细,步骤清晰,细节处理妥当,希望这篇“php怎么实现自动将链接转换成二维码”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。一、生成二维码在PHP...
    99+
    2023-07-05
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作