postcss-px-to-viewport 將px 轉(zhuǎn)換 使用方式

在vue項(xiàng)目中引入試試(更新于2021年9月27日)

  1. 創(chuàng)建一個(gè)vue項(xiàng)目并安裝該插件
 vue create mobile-px-demo

 cd mobile-px-demo && yarn add postcss-px-to-viewport -D

以下是我的創(chuàng)建配置谭网,本機(jī)node版本為v14.16.1

[圖片上傳失敗...(image-43729b-1677556507802)]

image.png

  1. 在項(xiàng)目根目錄下添加.postcssrc.js文件
  2. 添加如下配置:
module.exports = {
  plugins: {
    autoprefixer: {}, // 用來(lái)給不同的瀏覽器自動(dòng)添加相應(yīng)前綴,如-webkit-坝撑,-moz-等等
    "postcss-px-to-viewport": {
      unitToConvert: "px", // 要轉(zhuǎn)化的單位
      viewportWidth: 750, // UI設(shè)計(jì)稿的寬度
      unitPrecision: 6, // 轉(zhuǎn)換后的精度静秆,即小數(shù)點(diǎn)位數(shù)
      propList: ["*"], // 指定轉(zhuǎn)換的css屬性的單位,*代表全部css屬性的單位都進(jìn)行轉(zhuǎn)換
      viewportUnit: "vw", // 指定需要轉(zhuǎn)換成的視窗單位巡李,默認(rèn)vw
      fontViewportUnit: "vw", // 指定字體需要轉(zhuǎn)換成的視窗單位抚笔,默認(rèn)vw
      selectorBlackList: ["wrap"], // 指定不轉(zhuǎn)換為視窗單位的類(lèi)名,
      minPixelValue: 1, // 默認(rèn)值1侨拦,小于或等于1px則不進(jìn)行轉(zhuǎn)換
      mediaQuery: true, // 是否在媒體查詢的css代碼中也進(jìn)行轉(zhuǎn)換殊橙,默認(rèn)false
      replace: true, // 是否轉(zhuǎn)換后直接更換屬性值
      exclude: [/node_modules/], // 設(shè)置忽略文件,用正則做目錄名匹配
      landscape: false // 是否處理橫屏情況
    }
  }
};

  1. 重新運(yùn)行項(xiàng)目狱从,使配置文件生效
  2. 我們寫(xiě)一段測(cè)試代碼來(lái)驗(yàn)證一下:
<template>
  <div class="test-viewport">測(cè)試轉(zhuǎn)換</div>
</template>

<style lang="less" scoped>
.test-viewport {
  width: 750px;
  height: 100px;
  font-size: 40px;
  text-align: center;
  line-height: 100px;
  background: #13b5b1;
}
</style>

  1. 打開(kāi)控制臺(tái)膨蛮,可以看到已經(jīng)進(jìn)行了轉(zhuǎn)換

[圖片上傳失敗...(image-c5c955-1677556507802)]

image.png

需要注意的配置

  • propList: 當(dāng)有些屬性的單位我們不希望轉(zhuǎn)換的時(shí)候,可以添加在數(shù)組后面季研,并在前面加上!號(hào)敞葛,如propList: ["*","!letter-spacing"],這表示:所有css屬性的屬性的單位都進(jìn)行轉(zhuǎn)化,除了letter-spacing
  • selectorBlackList:轉(zhuǎn)換的黑名單与涡,在黑名單里面的我們可以寫(xiě)入字符串惹谐,只要類(lèi)名包含有這個(gè)字符串,就不會(huì)被匹配驼卖。比如selectorBlackList: ['wrap'],它表示形如wrap,my-wrap,wrapper這樣的類(lèi)名的單位氨肌,都不會(huì)被轉(zhuǎn)換

關(guān)于兼容第三方UI庫(kù)

當(dāng)然,當(dāng)我們引入一些第三方庫(kù)的時(shí)候酌畜,比如vant怎囚,上面配置的exclude去掉,表示全部?jī)?nèi)容進(jìn)行vw轉(zhuǎn)換桥胞,會(huì)遇到這樣的問(wèn)題:

[圖片上傳失敗...(image-435057-1677556560749)]

像這個(gè)TabBar桩了,變得非常的小,被壓扁了埠戳。

其實(shí)vant官網(wǎng)也是給出了關(guān)于viewport的適配方案井誉,在github找一個(gè)名為vant-demo的項(xiàng)目,可以看到其配置如下整胃,github鏈接

[圖片上傳失敗...(image-617ceb-1677556560749)]

很尷尬颗圣,vant團(tuán)隊(duì)的是根據(jù)375px的設(shè)計(jì)稿去做的,理想視口寬度為375px屁使。

那么在岂,我們是否也要叫UI重新出一版375px的設(shè)計(jì)稿?

或者蛮寂,我們?cè)跁?shū)寫(xiě)的過(guò)程心算一下蔽午,所有標(biāo)注的尺寸都除以2?

讓我們回到webpack本身酬蹋,重新看一下這份.postcssrc.js文件及老,它除了暴露一個(gè)對(duì)象抽莱,也可以暴露一個(gè)函數(shù),無(wú)論暴露什么骄恶,在webpack運(yùn)行時(shí)食铐,都會(huì)被我們配置的海量文件讀取并執(zhí)行。

暴露函數(shù)有一個(gè)好處僧鲁,可以拿到webpack運(yùn)行的當(dāng)前執(zhí)行文件的信息虐呻。

那么我們可以有這樣一個(gè)思路:如果讀取的是vant相關(guān)的文件,viewportWidth就設(shè)為375寞秃,如果是其他的文件斟叼,我們就按照我們UI的寬度來(lái)設(shè)置viewportWidth,即750春寿。

改寫(xiě).postcssrc.js文件配置如下:

const path = require('path');

module.exports = ({ webpack }) => {
  const designWidth = webpack.resourcePath.includes(path.join('node_modules', 'vant')) ? 375 : 750;

  return {
    plugins: {
      autoprefixer: {},
      "postcss-px-to-viewport": {
        unitToConvert: "px",
        viewportWidth: designWidth,
        unitPrecision: 6,
        propList: ["*"],
        viewportUnit: "vw",
        fontViewportUnit: "vw",
        selectorBlackList: [],
        minPixelValue: 1,
        mediaQuery: true,
        exclude: [],
        landscape: false
      }
    }
  }

}

注意:這里使用path.join('node_modules', 'vant')是因?yàn)檫m應(yīng)不同的操作系統(tǒng)朗涩,
在mac下結(jié)果為node_modules/vant,而在windows下結(jié)果為node_modules\vant

另外堂淡,收到有同學(xué)反饋關(guān)于Cannot read property 'dirname' of undefined的問(wèn)題,我本地由于是macOS系統(tǒng)扒腕,多次嘗試無(wú)法復(fù)現(xiàn)該問(wèn)題绢淀,猜測(cè)有可能是平臺(tái)問(wèn)題或打包工具問(wèn)題,換成了取用編譯的webpack對(duì)象中的resourcePath瘾腰。

重新運(yùn)行后發(fā)現(xiàn)皆的,不僅vant相關(guān)組件的單位被轉(zhuǎn)換成了vw,而且其比例也是完全正確的蹋盆。

[圖片上傳失敗...(image-883e12-1677556560749)]

github地址如下费薄,可以下載到本地運(yùn)行:

轉(zhuǎn)載:https://www.cnblogs.com/zhangnan35/p/12682925.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市栖雾,隨后出現(xiàn)的幾起案子楞抡,更是在濱河造成了極大的恐慌,老刑警劉巖析藕,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件召廷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡账胧,警方通過(guò)查閱死者的電腦和手機(jī)竞慢,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)治泥,“玉大人筹煮,你說(shuō)我怎么就攤上這事【蛹校” “怎么了败潦?”我有些...
    開(kāi)封第一講書(shū)人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵本冲,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我变屁,道長(zhǎng)眼俊,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任粟关,我火速辦了婚禮疮胖,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘闷板。我一直安慰自己澎灸,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布遮晚。 她就那樣靜靜地躺著性昭,像睡著了一般。 火紅的嫁衣襯著肌膚如雪县遣。 梳的紋絲不亂的頭發(fā)上糜颠,一...
    開(kāi)封第一講書(shū)人閱讀 52,255評(píng)論 1 308
  • 那天,我揣著相機(jī)與錄音萧求,去河邊找鬼其兴。 笑死,一個(gè)胖子當(dāng)著我的面吹牛夸政,可吹牛的內(nèi)容都是我干的元旬。 我是一名探鬼主播,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼守问,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼匀归!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起耗帕,我...
    開(kāi)封第一講書(shū)人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤穆端,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后仿便,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體徙赢,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年探越,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了狡赐。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡钦幔,死狀恐怖枕屉,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情鲤氢,我是刑警寧澤搀擂,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布西潘,位于F島的核電站,受9級(jí)特大地震影響哨颂,放射性物質(zhì)發(fā)生泄漏喷市。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一威恼、第九天 我趴在偏房一處隱蔽的房頂上張望品姓。 院中可真熱鬧,春花似錦箫措、人聲如沸腹备。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)植酥。三九已至,卻和暖如春弦牡,著一層夾襖步出監(jiān)牢的瞬間友驮,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工驾锰, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留卸留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓稻据,卻偏偏與公主長(zhǎng)得像艾猜,于是被迫代替她去往敵國(guó)和親买喧。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捻悯,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容