激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

服務(wù)器之家 - 編程語言 - 編程技術(shù) - 快速入門 Postcss 插件:自動(dòng)轉(zhuǎn)換 Px 到 Rem

快速入門 Postcss 插件:自動(dòng)轉(zhuǎn)換 Px 到 Rem

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

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

快速入門 Postcss 插件:自動(dòng)轉(zhuǎn)換 Px 到 Rem

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

這一節(jié),我們通過一個(gè) px 自動(dòng)轉(zhuǎn) rem 的功能來入門一下 postcss 的插件。

postcss 的原理

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

快速入門 Postcss 插件:自動(dòng)轉(zhuǎn)換 Px 到 Rem

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

atrule:以 @ 開頭的規(guī)則,比如:

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

rule:選擇器開頭的規(guī)則,比如:

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

decl:具體的樣式,比如:

  1. padding: 5px;

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

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

快速入門 Postcss 插件:自動(dòng)轉(zhuǎn)換 Px 到 Rem

postcss 插件的寫法

postcss 插件是工作在 transform 階段,處理 ast 節(jié)點(diǎn),插件的形式是這樣的:

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

外層函數(shù)接受 options,返回一個(gè)插件的對象,聲明對什么節(jié)點(diǎn)做處理的 listener,然后在對應(yīng)的 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,這樣比起第一種來,好處是可以存放一些公共的邏輯。

然后可以這樣來運(yùn)行插件:

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

下面我們來寫一個(gè)簡易的 px 自動(dòng)轉(zhuǎn) rem 的插件來練練手。

實(shí)戰(zhàn)案例

需求描述

px 是一個(gè)固定的長度單位,而設(shè)備視口的尺寸是各種各樣的,我們想通過一套樣式來適配各種設(shè)備的顯示,就需要相對的單位,常用的是 rem。

rem 的本質(zhì)就是等比縮放,相對于 html 元素的 font-size。

比如 html 的 font-size 設(shè)置為 100px,那 1rem 就等于 100px,之后的樣式如果是 200px 就寫為 2rem。

這樣我們只需要修改 html 的 font-size 就可以適配各種屏幕寬度的顯示,具體的單位會(huì)做等比縮放。

我們要根據(jù) html 的 font-size 值來把所有的 px 轉(zhuǎn)換為 rem,一般都是手動(dòng)來做這件事情的,但比較繁瑣,知道了計(jì)算方式之后,完全可以用 postcss 插件來自動(dòng)做。

接下來我們就實(shí)現(xiàn)下這個(gè) postcss 插件

代碼實(shí)現(xiàn)

我們搭一下插件的基本結(jié)構(gòu),只需要聲明對 Declaration 處理的 listener:

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

然后要做的就是把 decl 的樣式值中的 px 轉(zhuǎn)換為 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 方法來做替換,第一個(gè)參數(shù)是匹配的字符串,后面的參數(shù)是分組,第一個(gè)分組就是 px 的值。

計(jì)算 px 對應(yīng)的 rem 需要 1rem 對應(yīng)的 px 值,可以支持通過 options 來傳入。

然后我們測試下:

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

可以看到,已經(jīng)正確的做了轉(zhuǎn)換:

快速入門 Postcss 插件:自動(dòng)轉(zhuǎn)換 Px 到 Rem

當(dāng)然,我們這個(gè)插件只是案例,還不夠完善,要做的完善的話需要更復(fù)雜的正則。

總結(jié)

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

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

我們實(shí)現(xiàn)了簡單的 px 自動(dòng)轉(zhuǎn) rem 的插件:

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

其實(shí) postcss 插件的分析和轉(zhuǎn)換功能還有很多的應(yīng)用,比如切換主題色,從白到黑,完全就可以用 postcss 自動(dòng)分析顏色的值,然后做轉(zhuǎn)換。

postcss 分析和轉(zhuǎn)換 css 的能力還是很強(qiáng)大很有用的,有很多在業(yè)務(wù)中的應(yīng)用場景等你去發(fā)掘。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 草人人| 4399一级成人毛片 | 九色 在线 | 久久久久久中文字幕 | 久久精热 | 亚洲小视频在线播放 | 免费看日产一区二区三区 | 成年免费观看视频 | 久久久久久久久淑女av国产精品 | 黄色欧美精品 | 欧美性受xxxxxx黑人xyx性爽 | 老女人碰碰在线碰碰视频 | 国产一级伦理片 | 日本成年免费网站 | 调教小男生抽打尿孔嗯啊视频 | 日本黄色一级视频 | 国产一区二区三区视频在线 | 久久久久久久久久久国产精品 | 九一免费版在线观看 | 看毛片电影 | 国产羞羞视频 | 92精品国产自产在线 | 中文字幕综合在线观看 | 国产日韩大片 | 国产精品美女久久久久久不卡 | 孕妇体内谢精满日本电影 | 精品久久久久久综合日本 | 久久精品国产99国产精品澳门 | 毛片免费一区二区三区 | 欧美日韩在线播放 | 精品久久一区二区 | 亚洲一区二区中文 | 久久久综合久久久 | 日本在线观看一区二区 | 日韩视频在线观看免费视频 | 国产精品久久久久久久久久免 | 亚洲精品aa| 国产精品一区二区视频 | 一级大黄毛片免费观看 | 国产羞羞视频在线观看免费应用 | 中文在线观看视频 |