前端適配之vw兼容方案(Vue版)

前端適配可以說是前端工程師一個永恒的話題漆际,而解決方案也是層出不窮,其目的都是為了在各個分辨率中最大程度還原設(shè)計稿拇颅。今天給大家介紹的是vw兼容方案荧恍,其原理就是根據(jù)視口寬度自動計算頁面上的尺寸,無論高度拢军、寬度楞陷,還是字體。

第一步:用vue-cli快速構(gòu)建出一個項目

通過腳手架生成的項目應(yīng)該是如下結(jié)構(gòu):

14186251-d70158c751d0e801.png
第二步:安裝插件

為了實現(xiàn)vw兼容方案茉唉,我們需要安裝如下插件:

  • postcss-import 相關(guān)配置
    主要功有是解決@import引入路徑問題固蛾。使用這個插件,可以很輕易的使用本地文件度陆、node_modules或者web_modules的文件艾凯。這個插件配合postcss-url使引入文件變得更輕松。

  • postcss-url 相關(guān)配置
    主要用來處理文件懂傀,比如圖片文件趾诗、字體文件等引用路徑的處理。

  • postcss-px-to-viewport 相關(guān)配置
    主要用來把px單位轉(zhuǎn)換為vw鸿竖、vh沧竟、vmin或者vmax這樣的視窗單位,也是vw適配方案的核心插件之一缚忧。

  • postcss-viewport-units 相關(guān)配置
    主要是給CSS的屬性添加content的屬性悟泵,給vwvh闪水、vminvmax做適配的操作糕非,這是實現(xiàn)vw布局必不可少的一個插件。

  • postcss-cssnext 相關(guān)配置
    該插件可以讓我們使用CSS未來的特性球榆,其會對這些特性做相關(guān)的兼容性處理朽肥。

  • cssnano 相關(guān)配置
    主要用來壓縮和清理CSS代碼。在Webpack中持钉,cssnanocss-loader捆綁在一起衡招,所以不需要自己加載它。

  • postcss-write-svg 相關(guān)配置
    主要用來處理移動端1px的解決方案

  • postcss-aspect-ratio-mini 相關(guān)配置
    主要用來處理元素容器寬高比

在自動構(gòu)建的項目根目錄里面我們能看到一個叫.postcssrc.js的文件每强,文件默認內(nèi)容:

module.exports = {
  "plugins": {
    "postcss-import": {},
    "postcss-url": {},
    "autoprefixer": {},
  }
}

不難發(fā)現(xiàn)腳手架已經(jīng)幫我們默認安裝了postcss-importpostcss-url始腾,所以我們只需要手動安裝剩余插件:

npm i postcss-aspect-ratio-mini postcss-px-to-viewport postcss-write-svg postcss-cssnext postcss-viewport-units cssnano cssnano-preset-advanced --S  

安裝成功之后在項目根目錄下的package.json中可以看到新安裝的依賴包:

"dependencies": {

"cssnano": "^4.1.10",

  "cssnano-preset-advanced": "^4.0.7",

  "postcss-aspect-ratio-mini": "^1.0.1",

  "postcss-cssnext": "^3.1.0",

  "postcss-px-to-viewport": "^1.1.1",

  "postcss-viewport-units": "^0.1.6",

  "postcss-write-svg": "^3.0.1",

  "vue": "^2.5.2",

  "vue-router": "^3.0.1"

}
第三步:插件配置

.postcssrc.js文件中做如下修改

module.exports = {
  "plugins": {
    "postcss-import": {},
    "postcss-url": {},
    "postcss-aspect-ratio-mini": {},
    "postcss-write-svg": {
      utf8: false
    },
    "postcss-cssnext": {},
    "postcss-px-to-viewport": {
      viewportWidth: 750,     //  視窗的寬度,對應(yīng)的是我們設(shè)計稿的寬度空执,移動端一般是750浪箭,如果是pc端那就是類似1920這樣的尺寸
      viewportHeight: 1344,    // 視窗的高度,移動端一般指定1334辨绊,也可以不配置
      unitPrecision: 3,       // 指定`px`轉(zhuǎn)換為視窗單位值的小數(shù)位數(shù)(很多時候無法整除)
      viewportUnit: 'vw',    // 指定需要轉(zhuǎn)換成的視窗單位奶栖,建議使用vw
      selectorBlackList: ['.ignore', '.hairlines'],  // 指定不轉(zhuǎn)換為視窗單位的類,可以自定義,可以無限添加,建議定義一至兩個通用的類名
      minPixelValue: 1,      // 小于或等于`1px`不轉(zhuǎn)換為視窗單位宣鄙,你也可以設(shè)置為你想要的值
      mediaQuery: false      // 允許在媒體查詢中轉(zhuǎn)換`px`
    },
    "postcss-viewport-units":{},
    "cssnano": {
      preset: "default", // 設(shè)置成default將不會啟用autoprefixer
      "postcss-zindex": false
    }
  }
}

特別聲明:
由于cssnext也具有autoprefixer,只需要一個就夠了袍镀,所以把默認的autoprefixer刪除掉
postcss-zindex設(shè)置成false,如果不這樣做冻晤,z-index的值就會重置為1流椒,所以千萬記得將postcss-zindex設(shè)置為false

postcss-px-to-viewport 的配置在注釋里面寫的很清楚明也,如果還有疑問可以到github查看 相關(guān)配置,由于修改了配置文件惯裕,不要忘記重啟一下項目:npm run dev温数。

好了,如果上面三個步驟都正確執(zhí)行蜻势,我們的項目就成功的集成了vw解決方案撑刺,現(xiàn)在我們來驗證一下:
如果我們的設(shè)計稿寬度為750px,在.postcssrc.js中配置viewportWidth750握玛,在編碼過程中够傍,設(shè)計稿上面的長寬是多少我們就寫多少,單位為px不需要進行任何換算挠铲,比如實現(xiàn)一個長寬始終為視口寬度一半的正方形:

<div class="test">111</div>
<style>
.test{
    width: 375px;  // 750/2
    height:375px;
    background: skyblue;
    text-align: center;
    line-height: 375px;
    font-size: 40px;
  }
<style>

預(yù)覽頁面改變視口寬度冕屯,不管哪種分辨率正方形寬度形始終占一半,且文字大小也跟隨寬度成正比縮放


未標題-1.png

查看頁面元素拂苹,可以看到編譯后的代碼安聘,postcss幫我們完成了換算,把px轉(zhuǎn)換為vw單位瓢棒,并且每個類多了content的屬性浴韭,這是為了解決vw的兼容問題。

.test {
    width: 50vw; //  350/750*100
    height: 50vw;
    background: #87ceeb;
    line-height: 50vw;
    font-size: 5.333vw;  //  40/750*100
    content: "viewport-units-buggyfill; width: 50vw; height: 50vw; line-height: 50vw; font-size: 5.333vw";
}

參考文獻:
http://www.reibang.com/p/1f1b23f8348f
http://www.reibang.com/p/5b54be9dc063

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末脯宿,一起剝皮案震驚了整個濱河市念颈,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌连霉,老刑警劉巖榴芳,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窘面,居然都是意外死亡翠语,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進店門财边,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肌括,“玉大人,你說我怎么就攤上這事〉玻” “怎么了黑滴?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長紧索。 經(jīng)常有香客問我袁辈,道長,這世上最難降的妖魔是什么珠漂? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任晚缩,我火速辦了婚禮,結(jié)果婚禮上媳危,老公的妹妹穿的比我還像新娘荞彼。我一直安慰自己,他們只是感情好待笑,可當我...
    茶點故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布鸣皂。 她就那樣靜靜地躺著,像睡著了一般暮蹂。 火紅的嫁衣襯著肌膚如雪寞缝。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天仰泻,我揣著相機與錄音荆陆,去河邊找鬼。 笑死集侯,一個胖子當著我的面吹牛慎宾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播浅悉,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼趟据,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了术健?” 一聲冷哼從身側(cè)響起汹碱,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎荞估,沒想到半個月后咳促,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡勘伺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年跪腹,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片飞醉。...
    茶點故事閱讀 40,615評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡冲茸,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情轴术,我是刑警寧澤难衰,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站逗栽,受9級特大地震影響盖袭,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜彼宠,卻給世界環(huán)境...
    茶點故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一鳄虱、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧凭峡,春花似錦醇蝴、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽霉涨。三九已至按价,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間笙瑟,已是汗流浹背楼镐。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留往枷,地道東北人框产。 一個月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓,卻偏偏與公主長得像错洁,于是被迫代替她去往敵國和親秉宿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,630評論 2 359