可視化大屏項(xiàng)目適配 vue(方案一)

選擇的適配方案
設(shè)計(jì)稿是1920px
flexible.js 把屏幕分為 10 等份 ( flexible.js 中可修改 ,默認(rèn)為 10 )


image.png
  1. 新建 vue 項(xiàng)目断傲,項(xiàng)目目錄如下


    image.png
  2. src / assets 文件下創(chuàng)建一個(gè)新的文件夾 css肄满, css 文件夾下新建一個(gè)base.css文件用于定義全局樣式
html,
body,
#app {
    padding: 0;
    margin: 0;
    height: 100%;
    min-width: 1024px;
}

body,
div,
span,
header,
footer,
nav,
section,
aside,
article,
ul,
ol,
dl,
dt,
dd,
li,
a,
p,
h1,
h2,
h3,
h4,
h5,
h6,
i,
b,
textarea,
button,
input,
select,
figure,
figcaption {
    padding: 0;
    margin: 0;
    list-style: none;
    font-style: normal;
    text-decoration: none;
    border: none;
    /*color: #333;*/
    font-weight: normal;
    box-sizing: border-box;
    -webkit-tap-highlight-color: transparent;
    -webkit-font-smoothing: antialiased;
}

  1. src 目錄下新建一個(gè) utils 文件夾碌秸,新建 flexible.js 文件绍移,添加以下代碼
(function(win, lib) {
  var doc = win.document
  var docEl = doc.documentElement
  var metaEl = doc.querySelector('meta[name="viewport"]')
  var flexibleEl = doc.querySelector('meta[name="flexible"]')
  var dpr = 0
  var scale = 0
  var tid
  var flexible = lib.flexible || (lib.flexible = {})

  if (metaEl) {
    // eslint-disable-next-line no-useless-escape
    var match = metaEl.getAttribute('content').match(/initial\-scale=([\d\.]+)/)
    if (match) {
      scale = parseFloat(match[1])
      dpr = parseInt(1 / scale)
    }
  } else if (flexibleEl) {
    var content = flexibleEl.getAttribute('content')
    if (content) {
      // eslint-disable-next-line no-useless-escape
      var initialDpr = content.match(/initial\-dpr=([\d\.]+)/)
      // eslint-disable-next-line no-useless-escape
      var maximumDpr = content.match(/maximum\-dpr=([\d\.]+)/)
      if (initialDpr) {
        dpr = parseFloat(initialDpr[1])
        scale = parseFloat((1 / dpr).toFixed(2))
      }
      if (maximumDpr) {
        dpr = parseFloat(maximumDpr[1])
        scale = parseFloat((1 / dpr).toFixed(2))
      }
    }
  }

  if (!dpr && !scale) {
    // eslint-disable-next-line no-unused-vars
    var isAndroid = win.navigator.appVersion.match(/android/gi)
    var isIPhone = win.navigator.appVersion.match(/iphone/gi)
    var devicePixelRatio = win.devicePixelRatio
    if (isIPhone) {
      // iOS下,對(duì)于2和3的屏讥电,用2倍的方案蹂窖,其余的用1倍方案
      if (devicePixelRatio >= 3 && (!dpr || dpr >= 3)) {
        dpr = 3
      } else if (devicePixelRatio >= 2 && (!dpr || dpr >= 2)) {
        dpr = 2
      } else {
        dpr = 1
      }
    } else {
      // 其他設(shè)備下,仍舊使用1倍的方案
      dpr = 1
    }
    scale = 1 / dpr
  }

  docEl.setAttribute('data-dpr', dpr)
  if (!metaEl) {
    metaEl = doc.createElement('meta')
    metaEl.setAttribute('name', 'viewport')
    metaEl.setAttribute('content', 'initial-scale=' + scale + ', maximum-scale=' + scale + ', minimum-scale=' + scale + ', user-scalable=no')
    if (docEl.firstElementChild) {
      docEl.firstElementChild.appendChild(metaEl)
    } else {
      var wrap = doc.createElement('div')
      wrap.appendChild(metaEl)
      doc.write(wrap.innerHTML)
    }
  }

  function refreshRem() {
    var width = docEl.getBoundingClientRect().width
    var rem = width / 10 // 適配寬度為 1920px恩敌, 分為10份 瞬测,則 vue.config.js 中 postcss 值為 1920/10
    docEl.style.fontSize = rem + 'px'
    flexible.rem = win.rem = rem
  }

  win.addEventListener('resize', function() {
    clearTimeout(tid)
    tid = setTimeout(refreshRem, 300)
  }, false)
  win.addEventListener('pageshow', function(e) {
    if (e.persisted) {
      clearTimeout(tid)
      tid = setTimeout(refreshRem, 300)
    }
  }, false)

  if (doc.readyState === 'complete') {
    doc.body.style.fontSize = 12 * dpr + 'px'
  } else {
    doc.addEventListener('DOMContentLoaded', function() {
      doc.body.style.fontSize = 12 * dpr + 'px'
    }, false)
  }

  refreshRem()

  flexible.dpr = win.dpr = dpr
  flexible.refreshRem = refreshRem
  flexible.rem2px = function(d) {
    var val = parseFloat(d) * this.rem
    if (typeof d === 'string' && d.match(/rem$/)) {
      val += 'px'
    }
    return val
  }
  flexible.px2rem = function(d) {
    var val = parseFloat(d) / this.rem
    if (typeof d === 'string' && d.match(/px$/)) {
      val += 'rem'
    }
    return val
  }
})(window, window.lib || (window.lib = {}))

  1. 在 main.js 中引入該 flexible.js 文件 和 全局樣式文件 base.css
import Vue from 'vue'
import App from './App.vue'
import router from './router'

// 引入適配方案
import './utils/flexible'
// 引入全局樣式
import './assets/css/base.css'

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')


  1. 安裝等比適配插件,二選一即可
    4-1(推薦). 安裝 等比適配插件 postcss-px2rem 及 px2rem-loader
npm install postcss-px2rem px2rem-loader --save

在根目錄下纠炮,新建一個(gè) vue.config.js 文件月趟,設(shè)置

// 引入等比適配插件
const px2rem = require('postcss-px2rem')

// 配置基本大小
const postcss = px2rem({
  // 基準(zhǔn)大小 baseSize,需要和 flexible.js中相同
  remUnit: 192 // 適配寬度為 1920px恢口, 分為10份 孝宗,值為 1920/10
})

// 使用等比適配插件
module.exports = {
  lintOnSave: true,
  css: {
    loaderOptions: {
      postcss: {
        plugins: [
          postcss
        ]
      }
    }
  }
}

4-2.(不推薦) vscode 安裝 cssrem 插件 (自動(dòng)將px 換算為rem)


image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市耕肩,隨后出現(xiàn)的幾起案子因妇,更是在濱河造成了極大的恐慌,老刑警劉巖猿诸,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件婚被,死亡現(xiàn)場離奇詭異,居然都是意外死亡梳虽,警方通過查閱死者的電腦和手機(jī)址芯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來窜觉,“玉大人谷炸,你說我怎么就攤上這事≠鞔欤” “怎么了旬陡?”我有些...
    開封第一講書人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長特咆。 經(jīng)常有香客問我,道長录粱,這世上最難降的妖魔是什么腻格? 我笑而不...
    開封第一講書人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮啥繁,結(jié)果婚禮上菜职,老公的妹妹穿的比我還像新娘。我一直安慰自己旗闽,他們只是感情好酬核,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開白布蜜另。 她就那樣靜靜地躺著,像睡著了一般嫡意。 火紅的嫁衣襯著肌膚如雪举瑰。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評(píng)論 1 305
  • 那天蔬螟,我揣著相機(jī)與錄音此迅,去河邊找鬼。 笑死旧巾,一個(gè)胖子當(dāng)著我的面吹牛耸序,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鲁猩,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼坎怪,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼纳猫!你這毒婦竟也來了玻驻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤蒋荚,失蹤者是張志新(化名)和其女友劉穎疾棵,沒想到半個(gè)月后戈钢,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡是尔,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年殉了,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片拟枚。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡薪铜,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恩溅,到底是詐尸還是另有隱情隔箍,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布脚乡,位于F島的核電站蜒滩,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏奶稠。R本人自食惡果不足惜俯艰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望锌订。 院中可真熱鬧竹握,春花似錦、人聲如沸辆飘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至芹关,卻和暖如春续挟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背充边。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來泰國打工庸推, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浇冰。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓贬媒,卻偏偏與公主長得像,于是被迫代替她去往敵國和親肘习。 傳聞我的和親對(duì)象是個(gè)殘疾皇子际乘,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

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