一種開箱即賊好用的移動端適配方案

主角是誰

  • 在今天這篇文章中,我並不會在這裏講一些移動端視口的概念,包括物理像素和邏輯像素,理想視口,dpr等等等等,我只介紹這樣一種很是不錯的移動端適配方案:post-css-to-viewport,若是我說這種方案能解決98%以上的移動端佈局痛點,我想整個博客園,應該沒有人會反駁。

痛點在哪裏

在以前有一種流行已久的移動端適配方案,那就是rem,我想下面這兩句代碼,有很多老移動端都不會陌生:css

    const deviceWidth = document.documentElement.clientWidth || document.body.clientWidth;
    document.querySelector('html').style.fontSize = deviceWidth / 7.5 + 'px';
  • 沒錯,在那個移動端UI稿尺寸爲750*1334滿天飛的時代,這兩句代碼確實給開發者帶來了很大的方便,這樣設置根font-size後,px和rem的轉換比例成了100, 爲好比UI稿一個長寬分別爲120px*40px,那麼開發者對應的寫成1.2rem*0.4rem就能夠了
  • 這種換算已是頗爲方便,可是並不是全部的項目都能這樣去設置一個方便換算的比例係數,當比例係數爲100時,小數點往前面挪兩位就好了,然而有的項目設置的換算係數千奇百怪,有50的,有16的,不少已經嚴重超出口算力所能及的範疇了。因此後來誕生的px-to-rem或者px2rem就是爲了解決這個問題
  • 固然,這仍沒有給css帶來多少簡潔的清流,由於人們有時候不須要去轉換一些單位,好比字體大小font-size,有很多人但願給字體設置一個固定的px,它不會隨着設備的不一樣而轉換成rem,由於這樣在一些平板設備上顯得太大了

人們但願有這樣一種方案...

  • 首先,不管換算方不方便,我都不想換算(就是這麼懶🤭),我也不想去操心什麼轉換系數
  • 其次,有些屬性或者類選擇器我不想進行轉換
  • css代碼要足夠簡潔,我只但願看到一種單位,那就是px

如今,它來了

  • postcss-px-to-viewport就是這樣一款優秀的插件,它解決了以上提到的痛點,也知足以上提到的理想要求。它將px轉換成視口單位vw,衆所周知,vw本質上仍是一種百分比單位,100vw即等於100%,即window.innerWidth

在vue項目中引入試試

  1. 咱們先把它安裝到項目的開發環境中:
 npm i postcss-px-to-viewport -D
  1. 在項目根目錄下添加.postcssrc.js文件
  2. 添加以下配置:
module.exports = {
  plugins: {
    autoprefixer: {}, // 用來給不一樣的瀏覽器自動添加相應前綴,如-webkit-,-moz-等等
    "postcss-px-to-viewport": {
      unitToConvert"px"// 要轉化的單位
      viewportWidth: 750// UI設計稿的寬度
      unitPrecision: 6// 轉換後的精度,即小數點位數
      propList: ["*"], // 指定轉換的css屬性的單位,*表明所有css屬性的單位都進行轉換
      viewportUnit: "vw"// 指定須要轉換成的視窗單位,默認vw
      fontViewportUnit: "vw"// 指定字體須要轉換成的視窗單位,默認vw
      selectorBlackList: ["van"], // 指定不轉換爲視窗單位的類名
      minPixelValue: 1// 默認值1,小於或等於1px則不進行轉換
      mediaQuery: true// 是否在媒體查詢的css代碼中也進行轉換,默認false
      replace: true// 是否轉換後直接更換屬性值
      exclude: [/node_modules/], // 設置忽略文件,用正則作目錄名匹配
      landscape: false // 是否處理橫屏狀況
    }
  }
};
  1. 從新運行項目,使配置文件生效
  2. 咱們寫一段測試代碼來驗證一下:
<template>
  <div class="test-viewport">測試轉換</div>
</template>

<style lang="less" scoped>
.test-viewport {
  width750px;
  height100px;
  font-size40px;
  text-align: center;
  line-height100px;
  background#13b5b1;
}
</style>

  1. 打開控制檯,能夠看到已經進行了轉換

須要注意的配置

  • propList: 當有些屬性的單位咱們不但願轉換的時候,能夠添加在數組後面,並在前面加上!號,如propList: ["*","!letter-spacing"],這表示:全部css屬性的屬性的單位都進行轉化,除了letter-spacing
  • selectorBlackList:轉換的黑名單,在黑名單裏面的咱們能夠寫入字符串,只要類名包含有這個字符串,就不會被匹配。好比selectorBlackList: ['van'],它表示形如van,van-tab,tab-van,vant這樣的類名的單位,都不會被轉換

本文使用 mdnice 排版html

相關文章
相關標籤/搜索