Vue3 企業級優雅實戰 - 組件庫框架 - 4 組件庫的 CSS 架構

来源:https://www.cnblogs.com/youyacoder/archive/2022/11/14/16889014.html
-Advertisement-
Play Games

該系列已更新文章: 分享一個實用的 vite + vue3 組件庫腳手架工具,提升開發效率 開箱即用 yyg-cli 腳手架:快速創建 vue3 組件庫和vue3 全家桶項目 Vue3 企業級優雅實戰 - 組件庫框架 - 1 搭建 pnpm monorepo Vue3 企業級優雅實戰 - 組件庫框架 ...


該系列已更新文章:
分享一個實用的 vite + vue3 組件庫腳手架工具,提升開發效率
開箱即用 yyg-cli 腳手架:快速創建 vue3 組件庫和vue3 全家桶項目
Vue3 企業級優雅實戰 - 組件庫框架 - 1 搭建 pnpm monorepo
Vue3 企業級優雅實戰 - 組件庫框架 - 2 初始化 workspace-root
Vue3 企業級優雅實戰 - 組件庫框架 - 3 搭建組件庫開發環境

在前一篇文章中分享了搭建組件庫的基本開發環境、創建了 foo 組件模塊和組件庫入口模塊,本文分享組件庫的樣式架構設計。

1 常見的 CSS 架構模式

常見的 CSS 架構模式有很多:OOCSSACSSBEMSMACSSITCSS 等,其中 SMACSSITCSS 很相似。我在企業級項目中最常使用的是簡化版的 ITCSS + BEM + ACSS,所以本文首先介紹這三種模式,其他模式大家自己上網查看。

1.1 ACSS

ACSS 模式幾乎是一個樣式屬性就對應了一個樣式類。這種方式非常靈活,復用性很強、維護成本低,但破壞了 CSS 命名語義化。常見的名稱如:d-flex、m-10、w-20 等。

1.2 BEM

BEM 模式是一種命名方法論,其命名層級為:Block元素 Element修飾符 Modifier,這也是 “BEM” 這個名字的由來。元素 Element 使用兩個短下劃線(__),修飾符 Modifier 使用兩個短中劃線(--),如下麵的 HTML 片段和對應的類名:

<div class="demo-block">
  <a class="demo-block__element1">Link</a>
  <a class="demo-block__element1 demo-block__element1--modifier">Link</a>
</div>

<style>
  .demo-block {} // 塊
	.demo-block__element1 {} // 元素
	.demo-block__element1--modifier1 {} // 修飾符
</style>

使用 BEM 可以規範命令,頁面結構也比較清晰。

1.3 ITCSS

ITCSS 是一種樣式的分層結構,一共有七層,七個層次從上到下依次為:

  • Settings 層:通常是一些樣式變數,如定義通用的顏色值、字體大小的數值等;
  • Tools 層:通用工具函數,包括 mixins、function 等;
  • Generic 層:通用基礎樣式,一般是對瀏覽器預設樣式進行重置,如 normalize.css、resets 等庫;
  • Base 層:對某些全局使用的元素進行通用的定製化樣式,如頁面的設置、ul 標簽的設置等;
  • Objects 層:所有使用 OOCSS 的地方,即某些結構和樣式相分離的專用類;
  • Components 層:具體的組件,其實可以對應到組件庫中的每個組件;
  • Trumps 層:重寫某些樣式,如 width 重新設置為 100px,只會影響某一小塊的 DOM 元素,權重最高,類似 ACSS,但通常會加上 !important

2 組件庫的 CSS 架構

ITCSS 分層非常細緻,咱們組件庫的樣式在其基礎上進行了簡化,省略了 Base 層 或 Objects 層。而對於 Trumps 層,咱使用 ACSS 來替代,對於 Components 層,裡面的每個組件內部又使用 BEM。所以咱們組件庫的樣式架構為:簡化版的 ITCSS + BEM + ACSS。

2.1 CSS 結構概覽

組件庫的樣式使用預處理器 SCSS,從結構整體來看,分為如下層級:

  • base 層:整個 CSS 結構的最基礎的層級,對應了 ITCSS 的 Settings、Generic 和 Base。即包括變數定義、通用基礎樣式和定製基礎樣式。
  • tools 層:與 ITCSS 的 Tools 一樣,提供通用工具函數。
  • acss 層:類似 ITCSS 的 Trumps,定義一些原子樣式類,如 flex、margin、padding 相關的樣式基礎類。
  • components 層:與 ITCSS 的 Components 一樣,實現各個組件的樣式,其中每個組件的樣式又使用 BEM 方式來組織命名。

2.2 base 層的實現

前面說過,base 層包括樣式變數定義、通用基礎樣式、定製基礎樣式。

首先在 packages/scss 目錄下創建 base 目錄,存放 base 層的 scss 文件。

  1. settings

settings 是一些變數的定義,在 packages/scss/base/ 目錄中創建 _var.module.scss 文件,該文件定義樣式變數。

$primary-color: #488019;
$common-padding: 20px;

:export {
  primaryColor: $primary-color;
}
  1. Generic

Generic 通常是對瀏覽器樣式的重置,統一 HTML 標簽在不同瀏覽器中的展示,屏蔽瀏覽器間的差異。在這個部分可以使用開源庫normalize.cssreset.css 等。這一層可以在組件庫中省略,在各個具體的應用中引入對應css。不過程式員優雅哥還是將瀏覽器樣式重置引入到組件庫中,這樣應用開發過程中省點事。咱使用開源的 normalize.css 作為 Genericnormalize.css 的代碼可以在 GitHub 上搜索獲取。

image-20221113203109334

繼續在 packages/scss/base/ 目錄中創建 _normalize.scss 文件,將 normalize.css 的內容直接複製進去就可以了。

  1. Base

Base 主要是存放部分重置樣式的自定義,如 html、body、section 等,這部分咱們暫時沒有自定義的內容,就無需編寫了。

  1. 入口文件

最後需要將 base 層所有 scss 以統一的入口引入。在 packages/scss/base/ 目錄下創建 index.scss,該文件導入上面創建的兩個 scss 文件:

@use "var.module";
@use "normalize";

2.3 tools 層的實現

tools 層用於存放工具函數和 mixins,github 上有個優秀的開源項目 sassMagic,咱們就使用它作為 tools 層。

image-20221113210129530

將該項目 src 中的代碼拷貝到 packages/scss/tools/ 目錄下即可(如果 _sassMagic.scss 文件中有報錯,將裡面對不存在文件的引入刪除即可)。我在這裡將 _sassMagic.scss 文件重命名為 index.scss,這樣後面在使用時只需要使用 @use "../tools" 即可。

2.4 acss 層的實現

acss 層用於定義一些原子樣式,這裡咱們定義 flex 佈局和 margin/padding 的原子類。

packages/scss/ 中創建目錄 acss,併在該目錄下創建兩個文件:_flex.scss_mp.scss

packages/scss/acss/_flex.scss

.f {
  display: flex;
}
.f-c {
  display: flex;
  flex-direction: column;
}
.f-r {
  display: flex;
  flex-direction: row;
}
.f-1 {
  flex: 1 1 0;
}
.oy-h {
  overflow-y: hidden;
}
.oy-a {
  overflow-y: auto !important;
}
.ox-h {
  overflow-x: hidden;
}
.o-h {
  overflow: hidden;
}

packages/scss/acss/_mp.scss

$direction: (l left, r right, t top, b bottom);

@for $i from 1 through 30 {
  @each $type in m, p, v, h, a {
    // margin
    @if ($type == m) {
      @each $d in $direction {
        .m#{nth($d, 1)}-#{$i} {
          margin-#{nth($d, 2)}: #{$i}px;
        }
      }
    }
    // padding
    @else if ($type == p) {
      @each $d in $direction {
        .p#{nth($d, 1)}-#{$i} {
          padding-#{nth($d, 2)}: #{$i}px;
        }
      }
    }
    // margin/padding left/right
    @else if ($type == h) {
      .ph-#{$i} {
        padding-left: #{$i}px;
        padding-right: #{$i}px;
      }
      .mh-#{$i} {
        margin-left: #{$i}px;
        margin-right: #{$i}px;
      }
    }
    // margin/padding top/bottom
    @else if ($type == v) {
      .mv-#{$i} {
        margin-top: #{$i}px;
        margin-bottom: #{$i}px;
      }
      .pv-#{$i} {
        padding-top: #{$i}px;
        padding-bottom: #{$i}px;
      }
    }

    // all
    @else {
      .pa-#{$i} {
        padding: #{$i}px;
      }
    }
  }
}

2.5 components 層的實現

components 層對應組件庫中每個具體組件的樣式。在 packages/scss 中創建目錄 components。首先為上一篇文章中創建的 foo 組件創建樣式:在 packages/scss/components/ 目錄下創建 _foo.module.scss 文件:

@import "../tools";
@import "../acss/mp";
@import "../base/var.module";

@include b('yyg-foo') {
  color: $primary-color;

  @include e('description') {
    color: #333333;
    @extend .mv-20;
  }
}

繼續在 packages/scss/components/ 目錄下創建 index.scss 文件,該文件中引入 components 目錄下所有組件的 scss 文件:

@use "foo.module";

如果新增了其他組件,需要在 components 目錄下創建該組件的樣式文件,併在 components/index.scss 中引入該 scss 文件。

2.6 樣式入口

packages/scss 下創建 index.scss,在裡面導入所有的 scss,使用組件庫時只需要引入該文件即可。

@import "./acss/flex";
@import "./base";
@import "./components";

3 在組件庫中引入樣式

最後只需要在組件庫中引入 scss/index.scss 即可。在組件庫的入口模塊 packages/yyg-demo-ui/index.ts 中引入 index.scss

import '../scss/index.scss'

(在上文中的代碼已經包括這一句引入了)

到此便完成了組件庫樣式架構的搭建,整個樣式的目錄結構如下:

image

感謝你閱讀本文,如果本文給了你一點點幫助或者啟發,還請三連支持一下,點贊、關註、收藏,程式員優雅哥會持續與大家分享更多乾貨


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 從錄音帶、MP3到專業的耳機、音箱,隨著音樂消費方式的不斷升級,音樂創作的專業“門檻”也在AI技術的加持下逐漸大眾化,創作者的創新設計、創作頻率也在持續增強,能降低創作門檻且智能化的創作工具就顯得尤為重要。 懷揣著“人人都能玩點音樂”的初衷,唱鴨搭建了自己的音樂社區,希望為普通用戶提供智能有趣的音樂 ...
  • AR是一項現實增強技術,即在視覺層面上實現虛擬物體和現實世界的深度融合,打造沉浸式AR交互體驗。而想要增強虛擬物體與現實世界的融合效果,光照估計則是關鍵能力之一。 人們所看到的世界外觀,都是由光和物質相互作用而決定的,當光源照射到物體上時,光線通過被吸收、反射和透射等方式,傳遞給人們物體的顏色、亮度 ...
  • 常見的線上客服系統中,或者是統計代碼中,粘貼一段js代碼,就能引入某個插件的效果。這個是怎麼實現的呢? 原理非常的簡單: 對於不同的載入文件類型創建不同的節點,然後添加各自的屬性,最後扔到head 標簽裡面。 經測試,本方法相容各瀏覽器,安全、無毒、環保,是 web 開發人員工作常備代碼。 //動態 ...
  • Vue2(選項式)一,父組件向子組件傳遞數據: 介紹:在引用的子組件中定義 自定義屬性 msg與user.可以通過v-bind 綁定要發送的數據。 在子組件中使用 props 接收自定義屬性msg與user. 可以直接在模板中使用。但是如果想要修改的話建議傳到data中,再進行修改。 代碼如下: 二 ...
  • vue腳手架的使用 搭建vue腳手架環境 1.傻瓜式安裝node: 官網下載:https://nodejs.org/zh-cn/ 2.安裝cnpm: >: npm install -g cnpm --registry=https://registry.npm.taobao.org 3.安裝vue最新 ...
  • 在瀏覽器訪問網站,想在瀏覽器最新化的情況下,也能收到右下角的消息通知 這個時候就會用到H5 Notifications 具體效果可以參照演示頁面 演示頁面-唯一線上客服系統 實現代碼js function notify(title, options, callback) { // 先檢查瀏覽器是否支 ...
  • TypeScript 是對 JavaScript 的補充,將 JavaScript 由動態類型、弱類型語言轉為靜態類型、強類型的語言 簡介 TypeScript 由三個部分組成: 類型:為 JavaScript 代碼添加類型與類型檢查來確保健壯性,進入學習 語法:提前使用新語法或新特性來簡化代碼,進 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 vm.$forceUpdate (1)作用 迫使Vue.js實例重新渲染。註意它僅僅影響實例本身以及插入插槽內容的子組件,而不是所有子組件。 (2)實現 只需要執行watcher的update方法,就可以讓實例重新渲染。 Vue.js的每 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...