iT邦幫忙

2025 iThome 鐵人賽

DAY 29
0
Vue.js

打造銷售系統30天修練 - 全集中・Vue之呼吸系列 第 29

Day 29:[Systemの呼吸・陸之型] 響應式設計 - 多裝置適配

  • 分享至 

  • xImage
  •  

在過去的幾篇文章中,我們從前端 CRUD 介面、訂單狀態機設計,到儀表板的數據視覺化,逐步構建了 POS 系統的各項核心功能。這些功能在桌面環境下運作良好,但現代應用程式的用戶不再局限於單一設備。

銷售系統可能需要在傳統的收銀機螢幕、平板電腦,甚至在某些情況下,店員的手機上進行操作。這就引出了一個關鍵的設計挑戰:如何讓我們的系統在不同尺寸、不同類型的裝置上都能提供一致且優質的使用者體驗?

答案就是「響應式設計 (Responsive Design)」。今天,我們將深入探討響應式設計的核心概念、在 POS 系統中的應用考量,實作多裝置適配的介面。響應式設計不僅僅是讓頁面「看起來」不錯,更是提升使用者體驗和系統可用性的關鍵。

響應式設計的核心概念

響應式設計是一套讓網頁能夠根據使用者設備的螢幕尺寸、解析度、方向(橫向或縱向)等特性,自動調整佈局和內容的設計方法。它的目標是提供「一次設計,隨處可用」的體驗,避免為不同設備開發多個獨立版本。

為什麼需要響應式設計?

  • 設備多樣性:從大型顯示器到小型手機,螢幕尺寸千差萬別。
  • 提升使用者體驗 (UX):確保使用者在任何設備上都能輕鬆瀏覽和操作,無需縮放或橫向滾動。
  • SEO 友好:搜尋引擎(如 Google)偏好響應式網站,有助於提升搜尋排名。
  • 降低維護成本:維護一個響應式網站比維護多個獨立版本更高效。

響應式設計的三大基石

  1. 彈性網格佈局 (Fluid Grids)
    • 放棄使用固定像素 (px) 作為佈局單位,轉而使用相對單位,如百分比 (%)、emremvw (viewport width)、vh (viewport height)。
    • 這使得容器和元素能夠根據螢幕尺寸自動伸縮,保持相對比例。
  2. 彈性圖片/媒體 (Flexible Images/Media)
    • 圖片和影片等媒體內容也應具備彈性,根據其容器的大小自動縮放,避免溢出或顯示不全。
    • 通常透過 max-width: 100%; height: auto; 實現。
  3. 媒體查詢 (Media Queries)
    • 這是響應式設計的關鍵技術。它允許我們根據設備的特定屬性(如螢幕寬度、高度、解析度、方向等),應用不同的 CSS 樣式。
    • 例如,當螢幕寬度小於某個閾值時,改變元素的排列方式、字體大小或隱藏某些內容。

POS 系統中的響應式設計考量

對於 POS 系統,響應式設計的考量更為實際,因為它直接影響到店員的操作效率和顧客的結帳體驗:

  • 不同裝置的應用場景
    • 桌面/收銀機螢幕:通常有足夠的空間顯示複雜的商品列表、多欄位的訂單詳情、儀表板的豐富圖表。可以採用多欄佈局、側邊欄導航。
    • 平板電腦:介於桌面和手機之間。需要優化觸控操作,按鈕和可點擊區域應足夠大。佈局可能從多欄變為兩欄或單欄。
    • 手機:螢幕空間極其有限。介面必須高度簡化,突出核心功能(如掃碼、快速結帳),導航通常會收縮為漢堡菜單。
  • 關鍵功能在不同裝置上的呈現
    • 商品列表:在大螢幕上可以顯示商品圖片、名稱、價格、庫存等多個欄位;在小螢幕上可能需要簡化為卡片式佈局,只顯示關鍵資訊,或隱藏次要欄位。
    • 結帳流程:確保在任何裝置上都能流暢完成,表單元素易於輸入,按鈕易於點擊。
    • 導航菜單:在桌面端可能是側邊欄或頂部導航,在移動端則應轉換為可切換的漢堡菜單或底部導航欄。
    • 儀表板:複雜圖表在小螢幕上可能需要簡化,或提供滾動功能,確保數據可讀性。
  • 觸控優化
    • 按鈕和可點擊區域應有足夠的尺寸,以避免誤觸。
    • 考慮手勢操作,例如滑動切換頁面。

實作響應式設計的技術手段

在我們的 Vue.js 專案中,我們可以利用通用的 CSS 技術來高效地實現響應式設計。

  1. Meta Viewport 標籤

    • 這是響應式設計的基礎。確保在 index.html<head> 中包含以下標籤,指示瀏覽器正確渲染頁面:
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    
  2. CSS 媒體查詢 (Media Queries)

    • 媒體查詢是實現響應式設計的核心。它允許我們根據設備的特性應用不同的 CSS 規則。
    • 基本語法
      /* 當螢幕寬度小於 768px 時應用 */
      @media (max-width: 767px) {
        .container {
          flex-direction: column; /* 垂直排列 */
        }
        .sidebar {
          display: none; /* 隱藏側邊欄 */
        }
      }
      
      /* 當螢幕寬度大於等於 768px 且小於 1024px 時應用 */
      @media (min-width: 768px) and (max-width: 1023px) {
        .container {
          grid-template-columns: 1fr 1fr; /* 兩欄佈局 */
        }
      }
      
      /* 當螢幕寬度大於等於 1024px 時應用 */
      @media (min-width: 1024px) {
        .container {
          grid-template-columns: 1fr 3fr; /* 側邊欄 + 主內容佈局 */
        }
      }
      
    • 斷點選擇:通常會選擇幾個常見的設備寬度作為斷點,例如 768px (平板), 1024px (小型桌面)。
  3. Flexbox 和 Grid 佈局

    • Flexbox:非常適合一維佈局(行或列),用於對齊、分佈空間和排序項目。
      .header {
        display: flex;
        justify-content: space-between;
        align-items: center;
      }
      @media (max-width: 767px) {
        .header {
          flex-direction: column; /* 手機上垂直排列 */
        }
      }
      
    • Grid:非常適合二維佈局(行和列),用於創建複雜的頁面結構。
      .dashboard-layout {
        display: grid;
        grid-template-columns: 1fr 1fr 1fr; /* 桌面三欄 */
        gap: 20px;
      }
      @media (max-width: 767px) {
        .dashboard-layout {
          grid-template-columns: 1fr; /* 手機上單欄 */
        }
      }
      
  4. 相對單位

    • 在 CSS 中廣泛使用 %, em, rem, vw, vh 等相對單位來定義寬度、高度、字體大小和間距,確保元素能夠根據視口或父元素的大小自動調整。
  5. 圖片與媒體

    • 使用 img { max-width: 100%; height: auto; display: block; } 確保圖片在容器內自動縮放,避免溢出。
    • 對於需要不同解析度或裁剪的圖片,可以考慮使用 HTML 的 <picture> 元素配合 <source> 標籤。
  6. JavaScript 輔助

    • 在某些高度複雜的場景下,純 CSS 響應式可能不足。例如,需要根據螢幕尺寸動態載入不同組件,或調整組件的內部邏輯。
    • 可以利用 window.matchMedia() API 或 Vue.js 的 Composable 來判斷當前螢幕尺寸。

Vue.js 組件化與響應式設計

Vue.js 的組件化特性與響應式設計相得益彰:

  • 組件的響應式行為:每個組件都應該考慮其在不同螢幕尺寸下的表現。例如,一個 ProductCard.vue 組件在桌面端可能顯示多行資訊,在手機端則可能只顯示圖片和名稱。
  • 條件渲染:可以根據螢幕尺寸條件性地渲染不同組件或內容。
    <template>
      <div class="product-display">
        <ProductCardMobile v-if="isMobile" :product="product" />
        <ProductCardDesktop v-else :product="product" />
      </div>
    </template>
    
    <script setup>
    import { ref, onMounted, onUnmounted } from 'vue';
    import ProductCardMobile from './ProductCardMobile.vue';
    import ProductCardDesktop from './ProductCardDesktop.vue';
    
    const isMobile = ref(false);
    
    const checkMobile = () => {
      isMobile.value = window.innerWidth < 768; // 假設 768px 是手機斷點
    };
    
    onMounted(() => {
      checkMobile();
      window.addEventListener('resize', checkMobile);
    });
    
    onUnmounted(() => {
      window.removeEventListener('resize', checkMobile);
    });
    </script>
    
  • Composable for Screen Size:可以創建一個 useScreenSize 的 Composable 來封裝判斷螢幕尺寸的邏輯,供多個組件重用。

測試與調試

  • 瀏覽器開發者工具:現代瀏覽器(如 Chrome, Firefox)都提供了強大的開發者工具,可以模擬不同設備的螢幕尺寸和解析度,這是開發響應式設計時最常用的工具。
  • 真實設備測試:儘管模擬器很有用,但最終還是需要在真實的設備上進行測試,以確保觸控操作、性能和視覺效果符合預期。

總結

今天,我們深入探討了 POS 系統中響應式設計的重要性與實作方法。

透過理解彈性網格、彈性媒體和媒體查詢這三大基石,並結合 Vue.js 的組件化特性和通用的 CSS 佈局技術,我們能夠構建出一個在任何裝置上都能提供優質使用者體驗的銷售系統。

無論是在繁忙的收銀台、移動的平板,還是店長在手機上查看報表,都能提供流暢、直觀的操作體驗。在接下來的最後一天,我們將會對整個系列進行總結,並展望未來的發展方向。心を燃やせ 🔥!


上一篇
Day 28:[Systemの呼吸・伍之型] 儀表板 - 數據視覺化與圖表
系列文
打造銷售系統30天修練 - 全集中・Vue之呼吸29
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言