博客 / 詳情

返回

拒絕 rem 計算!Vue3 大屏適配,我是這樣做的

🧑‍💻 寫在開頭

點贊 + 收藏 === 學會🤣🤣🤣

最近公司又接了個數據可視化大屏的需求,設計稿是標準的 1920 x 1080。 拿到設計稿的那一刻,我的內心是拒絕的... 🤯

大家都知道,做大屏適配最煩的就是還原設計稿座標。 以前我嘗試過各種方案:

  • rem / vw: 每一個 px 都要轉換,寫 css 的時候旁邊還得開個計算器,太累。
  • 百分比: 更是噩夢,稍微動一下佈局就亂了。
  • 手動 scale: 雖然好用,但要自己寫 resize 監聽,處理防抖,還要算居中偏移,很容易出 bug(比如留白不對、點擊錯位)。

這次我想偷個懶,在 GitHub 上翻了一圈,發現了一個基於 Vue 3 的超輕量適配庫 —— vfit。 用完之後我只想説:真香!原來適配大屏可以像寫普通頁面一樣簡單。

這裏分享一下我的使用過程,希望能幫到同樣在“搬磚”的兄弟們。


🛠 3分鐘上手實錄

1. 安裝

首先安裝庫,包很小,沒什麼亂七八糟的依賴。

npm install vfit

2. “傻瓜式”配置

在 main.ts 裏註冊一下。 這裏最爽的是,可以直接填設計稿的寬高。我的設計稿是 1920x1080,我就直接填進去,根本不用換算。

// main.ts
import { createApp } from 'vue'
import App from './App.vue'
import { createFitScale } from 'vfit'
import 'vfit/style.css' // ⚠️ 劃重點:一定要引入這個樣式,不然佈局組件會失效

const app = createApp(App)

app.use(createFitScale({
  target: '#app',        // 告訴它要在哪個容器搞事情
  designWidth: 1920,     // 設計稿寬
  designHeight: 1080,    // 設計稿高
  scaleMode: 'auto'      // 默認 auto 就能應付絕大多數情況
}))

app.mount('#app')

這就完事了?對,這就完事了。 這時候你的頁面已經具備了自動縮放的能力,無論怎麼拖拽瀏覽器窗口,內容都會保持比例並自動居中。


✨ 我最愛的功能:FitContainer

配置好 scale 只是第一步,真正的痛點是組件定位。 以前用 scale 方案,子元素定位還是得小心翼翼。

vfit 提供了一個叫 <FitContainer> 的組件,這個簡直是“偷懶神器”。 它可以直接接收設計稿上的 px 座標!

舉個栗子 🌰

假設設計稿上:

  • 標題:距離頂部 50px,水平居中。
  • 左側圖表:距離左邊 30px,頂部 100px。
  • 右側列表:死死貼住右邊框,距離右邊 30px。

vfit 寫代碼是這樣的:

<template>
  <div class="screen-wrapper">
    
    <!-- 標題:居中咱們還是用 flex 方便,或者也可以算 left -->
    <FitContainer :top="50" :left="0" :right="0">
      <h1 style="text-align: center">我的酷炫大屏</h1>
    </FitContainer>

    <!-- 左側圖表:直接寫設計稿座標 -->
    <FitContainer :top="100" :left="30" :z="10">
      <ChartComponent />
    </FitContainer>

    <!-- 右側列表:注意這裏!支持 right 定位 -->
    <FitContainer :top="100" :right="30">
      <ListComponent />
    </FitContainer>

  </div>
</template>

發現沒?我完全不需要思考縮放比例!

  • 設計稿標 30px,我就寫 30
  • 插件內部會自動根據當前的縮放倍率,幫我計算好實際的位置。
  • 不管是 4K 屏還是筆記本小屏幕,位置看起來都和設計稿一模一樣。

🤔 踩坑小貼士

在使用過程中也發現了一些需要注意的小細節,分享給大家避坑:

  1. 樣式引入不能忘: 第一次用的時候忘了 import 'vfit/style.css',結果 <FitContainer> 變成普通 div 了,排版全亂。大家千萬別忘了。

  2. z-index 層級<FitContainer> 默認有個 z-index: 300(大概是為了防止被背景蓋住)。如果你的彈窗被遮住了,記得給組件傳個更大的 :z="999"

  3. Right/Bottom 的特殊邏輯: 我看了一下源碼發現,如果你用 :left,它會根據縮放比例位移(保持相對設計稿位置)。 但如果你用 :right,它是不乘縮放比例的。 這其實很科學:因為大屏通常是居中顯示的,如果右側元素也按比例縮放距離,在寬屏下可能會離屏幕邊緣太遠。現在的邏輯能保證它始終吸附在屏幕邊緣,視覺效果更好。


總結

如果你也在做 Vue 3 的大屏項目,真心推薦試一下 vfit。 它不是功能最強大的,但絕對是最省心的。 把精力花在畫 ECharts 上,而不是在那算 rem 或者調 css 佈局,這才是程序員該乾的事嘛!😂

項目地址: 🔗 Github: https://github.com/v-plugin/vfit 🔗 文檔: https://web-vfit.netlify.app

祝大家的大屏項目都能一次過稿!🍻

如果對您有所幫助,歡迎您點個關注,我會定時更新技術文檔,大家一起討論學習,一起進步。

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.