一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - 編程技術 - 快速入門 Postcss 插件:自動轉換 Px 到 Rem

快速入門 Postcss 插件:自動轉換 Px 到 Rem

2021-11-18 21:47神光的編程秘籍神說要有光zxg 編程技術

postcss 是 css 的 transpiler,它對于 css 就像 babel 對于 js 一樣,能夠做 css 代碼的分析和轉換。同時,它也提供了插件機制來做自定義的轉換。

快速入門 Postcss 插件:自動轉換 Px 到 Rem

postcss 是 css 的 transpiler,它對于 css 就像 babel 對于 js 一樣,能夠做 css 代碼的分析和轉換。同時,它也提供了插件機制來做自定義的轉換。

這一節,我們通過一個 px 自動轉 rem 的功能來入門一下 postcss 的插件。

postcss 的原理

postcss 是 css 到 css 的轉譯器,它也和 babel 一樣,分為 parse、transform、generate 3個階段。各種轉換插件都是工作在 transform 階段,基于 AST 做分析和轉換。

快速入門 Postcss 插件:自動轉換 Px 到 Rem

css 的 AST 比 js 的簡單多了,主要有這么幾種:

atrule:以 @ 開頭的規則,比如:

  1. @media screen and (min-width: 480px) {
  2. body {
  3. background-color: lightgreen;
  4. }
  5. }

rule:選擇器開頭的規則,比如:

  1. ul li {
  2. padding: 5px;
  3. }

decl:具體的樣式,比如:

  1. padding: 5px;

比起 js parser 的那幾十種 AST 是不是簡單的多?

這些可以通過 astexplorer.net 來可視化的查看:

快速入門 Postcss 插件:自動轉換 Px 到 Rem

postcss 插件的寫法

postcss 插件是工作在 transform 階段,處理 ast 節點,插件的形式是這樣的:

  1. const plugin = (options = {}) => {
  2. return {
  3. postcssPlugin: '插件名字',
  4. Rule (node) {},
  5. Declaration (node) {},
  6. AtRule (node) {}
  7. }
  8. }

外層函數接受 options,返回一個插件的對象,聲明對什么節點做處理的 listener,然后在對應的 listener 里寫處理邏輯就行。

還可以這樣寫:

  1. module.exports = (opts = {}) => {
  2. return {
  3. postcssPlugin: '插件名字',
  4. prepare (result) {
  5. // 這里可以放一些公共的邏輯
  6. return {
  7. Declaration (node) {},
  8. Rule (node) {},
  9. AtRule (node) {}
  10. }
  11. }
  12. }
  13. }

在 prepare 里返回各種 listener,這樣比起第一種來,好處是可以存放一些公共的邏輯。

然后可以這樣來運行插件:

  1. const postcss = require('postcss');
  2. postcss([plugin({
  3. // options
  4. })]).process('a { font-size: 20px; }').then(result => {
  5. console.log(result.css);
  6. })

下面我們來寫一個簡易的 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:

  1. const plugin = (options) => {
  2. return {
  3. postcssPlugin: 'postcss-simple-px2rem',
  4. Declaration (decl) {
  5. }
  6. }
  7. }

然后要做的就是把 decl 的樣式值中的 px 轉換為 rem,簡單的正則替換就行:

  1. const plugin = (options) => {
  2. const pxReg = /(\d+)px/ig;
  3. return {
  4. postcssPlugin: 'postcss-simple-px2rem',
  5. Declaration (decl) {
  6. decl.value = decl.value.replace(pxReg, (matchStr, num) => {
  7. return num/options.base + 'rem';
  8. });
  9. }
  10. }
  11. }

通過字符串的 replace 方法來做替換,第一個參數是匹配的字符串,后面的參數是分組,第一個分組就是 px 的值。

計算 px 對應的 rem 需要 1rem 對應的 px 值,可以支持通過 options 來傳入。

然后我們測試下:

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

可以看到,已經正確的做了轉換:

快速入門 Postcss 插件:自動轉換 Px 到 Rem

當然,我們這個插件只是案例,還不夠完善,要做的完善的話需要更復雜的正則。

總結

postcss 是 css 的 transpiler,就像 babel 是 js 的 transpiler 一樣,而且 postcss 的 AST 只有幾種節點,比較簡單,也可以通過 astexplorer.net 來可視化的查看。

postcss 也提供了插件功能,可以做一些自定義的分析和轉換。

我們實現了簡單的 px 自動轉 rem 的插件:

rem 是通過等比縮放的方式來達到一套樣式適配不同設備寬度的顯示的方案,需要做 px 到 rem 的轉換,這件事可以用 postcss 插件來自動來做。

其實 postcss 插件的分析和轉換功能還有很多的應用,比如切換主題色,從白到黑,完全就可以用 postcss 自動分析顏色的值,然后做轉換。

postcss 分析和轉換 css 的能力還是很強大很有用的,有很多在業務中的應用場景等你去發掘。

原文鏈接:https://mp.weixin.qq.com/s/8yqapnAHWvGrRqrv7BH1FA

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 我的家教老师在线观看 | 亚洲精美视频 | 手机国产乱子伦精品视频 | 关晓彤被调教出奶水的视频 | 欧美一卡2卡三卡4卡5卡免费观看 | 国产精品视频在线观看 | 国产精品热久久毛片 | 日韩中文字幕视频在线观看 | kk4444了欧美| 亚洲欧美日韩高清 | 办公室恋情在线 | 免费人成在线观看 | 金莲一级淫片aaaaaa | 亚洲AV国产国产久青草 | 国产一区二区三区四卡 | 精品亚洲欧美中文字幕在线看 | 免费超级乱淫播放手机版 | 国产一卡2卡3卡四卡国色天香 | 爱色成人网 | 久久综久久美利坚合众国 | 国产好深好硬好爽我还要视频 | 久久精品免视看国产 | 好大用力深一点视频 | 狠狠久久久久综合网 | 公园暴露娇妻小说 | sese在线观看 | 天天碰夜夜操 | 婷婷综合亚洲 | 国产成人精品实拍在线 | 亚洲狠狠婷婷综合久久蜜桃 | 香蕉动漫库 | 女人把私密部位张开让男人桶 | avav男人天堂 | 国产精品va在线观看手机版 | 国产精品怡红院在线观看 | 欧美最猛性xxxxx69交 | 免费视频亚洲 | 日本大尺度动漫在线观看缘之空 | 国产传媒在线播放 | 美女无内裤下部黄 | 国产盗摄wc厕所撒尿视频 |