搭建vue3組件庫(四): 樣式庫搭建

文章目錄

    • 1. 樣式目錄文件架構
    • 2. SCSS 樣式變量
      • 2.1 設置顏色 SCSS 變量
      • 2.2 設置多種類型主題
      • 2.3 生成全局類型主題 SCSS 變量
      • 2.4 分組生成 SCSS 變量

1. 樣式目錄文件架構

packages/theme-chalk 目錄結構:

├── packages
│   ├── theme-chalk
│   │   ├── src
│   │   │   ├── common
│   │   │   │   └── var.scss // SCSS變量配置文件
│   │   │   ├── mixins
│   │   │   │   ├── _var.scss // CSS變量相關的SCSS自定義函數
│   │   │   │   ├── config.scss // 配置文件
│   │   │   │   ├── function.scss // 全局的SCSS自定義函數
│   │   │   │   └── mixins.scss  // BEM相關函數
│   │   │   ├── base.scss // 基礎必須要引用的文件
│   │   │   ├── button.scss // 按需導入組件的 CSS 文件
│   │   │   ├── index.scss // 全量導入組件庫的 CSS 入口文件
│   │   │   ├── var.scss   // CSS 變量配置文件
│   │   │   ├── reset.scss // 默認樣式重置配置文件

通過 theme-chalk/src/common/var.scss 中的 SCSS 變量配置在 theme-chalk/src/var.scss 中進行封裝生成全局的 CSS 變量,在這個過程中使用到的有關生成 CSS 變量的 SCSS 自定義函數則在 theme-chalk/src/mixins/_var.scss 文件中進行設置。

因為要實現按需導入組件,所以各個組件單獨一個 CSS 文件。例如 Button 組件的 CSS 文件對應就是 button.scss 文件。在編寫組件 CSS 樣式中需要使用到的 BEM 的 SCSS 自定義函數則在 theme-chalk/src/mixins/mixins.scss 中,其他的 SCSS 自定義函數則在 theme-chalk/src/mixins/function.scss 中。

base.scss 文件則是引用那些必須的文件,比如 var.scss 文件是必須,這類文件則放在 base.scss 文件中。在全量導入組件庫的 CSS 入口文件 index.scss 中最先引入的便是 base.scss 文件。將來組件的自己的按需導入的 CSS 文件,例如 packages/components/button/style/index.ts 也就是 Button 組件的按需導入的 CSS 文件,其中也是需要最先導入 base.scss 文件,再進行導入 button.scss 文件。

2. SCSS 樣式變量

2.1 設置顏色 SCSS 變量

// packages/theme-chalk/src/common/var.scss@use 'sass:map';
// 默認顏色映射,使用 deep-merge 來允許用戶自定義顏色映射覆蓋默認值
$colors: () !default;
$colors: map.deep-merge((// 白色和黑色作為基本顏色選項'white': #ffffff,'black': #000000,// 為每種主題類型定義一個基礎顏色'primary': ('base': #409eff,),'success': ('base': #67c23a,),'warning': ('base': #e6a23c,),'error': ('base': #f56c6c,),'info': ('base': #909399,),),$colors
);// 主色調
$color-white: map.get($colors, 'white') !default; // 白色
$color-black: map.get($colors, 'black') !default; // 黑色// 應用場景顏色
$color-primary: map.get($colors, 'primary', 'base') !default; // 主要顏色,默認使用'base'色調
$color-success: map.get($colors, 'success', 'base') !default; // 成功狀態顏色,默認使用'base'色調
$color-warning: map.get($colors, 'warning', 'base') !default; // 警告狀態顏色,默認使用'base'色調
$color-error: map.get($colors, 'error', 'base') !default; // 錯誤狀態顏色,默認使用'base'色調
$color-info: map.get($colors, 'info', 'base') !default; // 信息狀態顏色,默認使用'base'色調

先設置一個總的 $colors 變量,然后再單獨設置每一個具體類型的變量,變量值是繼承 $colors 變量,這樣將來只要修改 $colors 中的變量值,后續每個繼承 $colors 變量的 SCSS 變量都將發生改變。

2.2 設置多種類型主題

  • 定義主題類型
// packages/theme-chalk/src/common/var.scss// 定義可用的主題類型
$types: primary, success, warning, error, info;
  • 擴展顏色變量
// packages/theme-chalk/src/common/var.scss
@use 'sass:math';/*** 該@mixin用于根據指定的顏色類型、級別和混合模式,創建一個新顏色等級并將其添加到全局顏色地圖中。* @param $type {string} - 顏色的類型(例如:primary, success等)。* @param $number {int} - 顏色的級別,用于計算顏色的混合程度。* @param $mode {string} - 混合模式,默認為'light'。可用于指定顏色是明度混合還是飽和度混合等。* @param $mix-color {color} - 用于混合的顏色,默認為白色($color-white)。*/
@mixin set-color-mix-level($type,$number,$mode: 'light',$mix-color: $color-white
) {// 深度合并顏色地圖,添加新的顏色等級$colors: map.deep-merge(($type: ('#{$mode}-#{$number}':mix($mix-color,map.get($colors, $type, 'base'),math.percentage(math.div($number, 10))),),),$colors) !global; // 將局部變量轉換為全局變量,確保新的顏色等級可以在整個項目中使用
}@each $type in $types {@for $i from 1 through 9 {@include set-color-mix-level($type, $i, 'light', $color-white);}
}

執行上述代碼就等于往各類型中添加新的變量顏色,效果如下:

$colors:('primary': ('base': #409eff,'light-1': 通過mix生成的新顏色,'light-2': 通過mix生成的新顏色,'light-3': 通過mix生成的新顏色,// ...),'success': ('base': #67c23a,'light-1': 通過mix生成的新顏色,'light-2': 通過mix生成的新顏色,'light-3': 通過mix生成的新顏色,// ...),'warning': ('base': #e6a23c,'light-1': 通過mix生成的新顏色,'light-2': 通過mix生成的新顏色,'light-3': 通過mix生成的新顏色,// ...),// ...)

2.3 生成全局類型主題 SCSS 變量

// src/var.scss@use 'common/var' as *;
@use 'mixins/var' as *;// 公共變量
:root {@include set-css-var-value('color-white', $color-white);@include set-css-var-value('color-black', $color-black);
}// 亮色模式
:root {color-scheme: light;// --v-color-#{$type}// --v-color-#{$type}-light-{$i}@each $type in $types {@include set-css-color-type($colors, $type);}
}
// src/mixins/_var.scss@use 'sass:map';
@use 'function' as *;// @include set-css-var-value(('color', 'primary'), red);
// --v-color-primary: red;
@mixin set-css-var-value($name, $value) {#{joinVarName($name)}: #{$value};
}@mixin set-css-var-value($name, $value) {#{joinVarName($name)}: #{$value};
}// @include set-css-var-type('color', 'primary', $map);
// --v-color-primary: #{map.get($map, 'primary')};
@mixin set-css-var-type($name, $type, $variables) {#{getCssVarName($name, $type)}: #{map.get($variables, $type)};
}@mixin set-css-color-type($colors, $type) {@include set-css-var-value(('color', $type), map.get($colors, $type, 'base'));@each $i in (3, 5, 7, 8, 9) {@include set-css-var-value(('color', $type, 'light', $i),map.get($colors, $type, 'light-#{$i}'));}@include set-css-var-value(('color', $type, 'dark-2'),map.get($colors, $type, 'dark-2'));
}
// src/mixins/function.scss/*** 函數用于將給定列表中的項目連接成一個變量名。* @param $list - 一個包含要連接的字符串的列表。* @return $name - 連接后的變量名,以"--"和配置中的命名空間開頭,每個列表項之間用"-"連接。*/
@function joinVarName($list) {// 初始化變量名,以"--"和配置中的命名空間開頭$name: '--' + config.$namespace;// 遍歷列表中的每個項目@each $item in $list {// 如果項目不為空,則將其添加到變量名中@if $item != '' {$name: $name + '-' + $item;}}// 返回連接后的變量名@return $name;
}// getCssVarName('button', 'text-color') => '--v-button-text-color'
@function getCssVarName($args...) {@return joinVarName($args);
}
// src/base.scss@use 'var.scss';
// src/index.scss@use './base.scss';@use './button.scss';

運行play項目,可以在控制臺看到
在這里插入圖片描述

2.4 分組生成 SCSS 變量

以分組的模式生成不同分組的 CSS 變量

// src/common/var.scss// 文本顏色
$text-color: () !default;
$text-color: map.merge(('primary': #303133,'regular': #606266,'secondary': #909399,'placeholder': #a8abb2,'disabled': #c0c4cc,),$text-color
);// 邊框顏色
$border-color: () !default;
$border-color: map.merge(('': #dcdfe6,'light': #e4e7ed,'lighter': #ebeef5,'extra-light': #f2f6fc,'dark': #d4d7de,'darker': #cdd0d6,),$border-color
);// 填充顏色
$fill-color: () !default;
$fill-color: map.merge(('': #f0f2f5,'light': #f5f7fa,'lighter': #fafafa,'extra-light': #fafcff,'dark': #ebedf0,'darker': #e6e8eb,'blank': #ffffff,),$fill-color
);// 背景顏色
$bg-color: () !default;
$bg-color: map.merge(('': #ffffff,'page': #f2f3f5,'overlay': #ffffff,),$bg-color
);
// src/var.scss
:root {color-scheme: light;// --v-text-color-#{$type}@include set-component-css-var('text-color', $text-color);// --v-border-color-#{$type}@include set-component-css-var('border-color', $border-color);// Fill --v-fill-color-#{$type}@include set-component-css-var('fill-color', $fill-color);// Background --v-bg-color-#{$type}@include set-component-css-var('bg-color', $bg-color);
}
// src/mixins/_var.scss/*** 設置分組的CSS變量* @param $name - 分組名稱,用于生成CSS變量名。* @param $variables - 一個映射表,包含要設置的變量名和其值。* 該mixin遍歷$variables映射表,為每個鍵值對生成相應的CSS變量。如果鍵是"default",* 則設置基礎的CSS變量;否則,設置帶有特定后綴的CSS變量。*/
@mixin set-component-css-var($name, $variables) {@each $attribute, $value in $variables {// 根據$attribute的值決定是設置基本變量還是特定屬性的變量@if $attribute == 'default' {#{getCssVarName($name)}: #{$value}; // 設置默認的CSS變量} @else {#{getCssVarName($name, $attribute)}: #{$value}; // 設置具有特定后綴的CSS變量}}
}

運行play項目,可以在控制臺看到
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/10381.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/10381.shtml
英文地址,請注明出處:http://en.pswp.cn/web/10381.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

excel表格里,可以把百分號放在數字前面嗎?

在有些版本里是可以的,這樣做: 選中數據,鼠標右鍵,點擊設置單元格格式,切換到自定義,在右側欄輸入%0,點擊確定就可以了。 這樣設置的好處是,它仍舊是數值,并且數值大小沒…

說一下 hibernate 的緩存機制?

Hibernate 的緩存機制是為了提高應用程序的性能,通過減少對數據庫物理數據源的訪問頻次而設計的。Hibernate 的緩存主要可以分為兩個級別:一級緩存(也稱為 Session 級別的緩存)和二級緩存(也稱為 SessionFactory 級別的…

Veeam - 數據保護和管理解決方案_Windows平臺部署備份還原VMware手冊

Veeam - - 數據保護和管理解決方案 Veeam Backup & Replication Console Veeam Data Platform Veeam Backup & Replication是一款強大的虛擬機備份、恢復和復制解決方案 安全備份、干凈恢復和數據彈性 — 即時交付 在混合云中隨時隨地管理、控制、備份和恢復您的所有數…

ARM時鐘樹結構(GD32)

時鐘樹的簡易框圖 初始化配置系統時鐘 配置系統初始化時鐘&#xff08;參考手冊&#xff09; 對應hal庫函數 使用72MHz的系統時鐘 do -----------while&#xff08;0&#xff09;的使用方法 系統時鐘 #include <stdint.h> #include "gd32f30x.h"int main(void)…

配置Docker對象與管理守護進程

前言&#xff1a;本博客僅作記錄學習使用&#xff0c;部分圖片出自網絡&#xff0c;如有侵犯您的權益&#xff0c;請聯系刪除 本章節的快速目錄導航&#xff1a; 一、配置Docker對象 1.1、Docker對象的標記 1.2、格式化命令和日志的輸出 二、示例&#xff1a; 2.1、管理…

(delphi11最新學習資料) Object Pascal 學習筆記---第11章第2節 (接口的多態性)

11.2.4 接口的多態性 ? 在上一節中&#xff0c;我們看到了如何定義多個接口&#xff0c;并讓一個類實現其中的兩個接口。當然&#xff0c;這可以擴展到任何數量。您還可以創建接口的層次結構&#xff0c;因為一個接口可以繼承另一個接口&#xff1a; ITripleJumper interfa…

開源RAG框架匯總

前言 本文搜集了一些開源的基于LLM的RAG&#xff08;Retrieval-Augmented Generation&#xff09;框架&#xff0c;旨在吸納業界最新的RAG應用方法與思路。如有錯誤或者意見可以提出&#xff0c;同時也歡迎大家把自己常用而這里未列出的框架貢獻出來&#xff0c;感謝~ RAG應用…

【代碼隨想錄37期】Day04 兩兩交換鏈表中的節點、刪除鏈表的倒數第N個節點、鏈表相交、環形鏈表II

兩兩交換鏈表中的節點 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), ne…

光通信行業專業術語解析大全

近期公司內部開展了一期學習交流會&#xff0c;各位同事收獲頗多&#xff0c;特別是關于一些專業術語的簡稱&#xff0c;大家都覺得非常有意思&#xff01;小編馬不停蹄的整理出來分享給大家&#xff0c;希望可以給學習光通信知識的萌新們小小助力&#xff01; 以下是光通信行…

QRegExp

描述 QRegExp 類使用正則表達式提供模式匹配。 正則表達式或“正則表達式”是一種用于匹配文本中子字符串的模式。這在許多情況下都很有用&#xff0c;例如&#xff0c; 驗證 正則表達式可以測試子字符串是否滿足某些條件&#xff0c;例如是整數或不包含空格。搜索 正則表達式…

網關路由的方式有哪些

在微服務架構中&#xff0c;網關路由通常用于集中處理請求分發、認證、限流、熔斷等任務。以下是幾種常見的網關路由配置方式&#xff1a; Spring Cloud Gateway 1. **基于配置文件的路由**&#xff1a; - 在Spring Cloud Gateway中&#xff0c;可以通過YAML或JSON配置文件定…

【Linux】shell編程,()圓括號, []方括號, {}花括號與(())雙括號的使用區別

1. ( )圓括號 初始化數組使用圓括號&#xff1b; 命令組&#xff0c;將一系列命令用空格隔開&#xff1b; 命令替換&#xff0c;使用$ 美元符&#xff0c;將命令進行嵌套使用&#xff1b;&#xff08;有點兒類似于管道符作用的感覺&#xff09; arr(1 2 3 4 5)2. [ ]方括號 …

【Linux】搭建私有yum倉庫(類阿里云)

在搭建本地yum倉庫并配置國內鏡像阿里云源中了解yum源 yum &#xff1a; Yellow dog Updater&#xff0c;Modified&#xff0c;是一種基于rpm包的自動升級和軟件包管理工具。yum能從指定的服務器自動下載rpm包并安裝&#xff0c;自動計算出程序之間的依賴關系和軟件安裝的步驟&…

《Python編程從入門到實踐》day25

# 昨日知識點回顧 如何創建多行外星人 碰撞結束游戲 創建game_stats.py跟蹤統計信息 # 今日知識點學習 第14章 記分 14.1 添加Play按鈕 14.1.1 創建Button類 import pygame.font# button.py class Button:def __init__(self, ai_game, msg):"""初始化按鈕…

【Python系列】Python中列表屬性提取

&#x1f49d;&#x1f49d;&#x1f49d;歡迎來到我的博客&#xff0c;很高興能夠在這里和您見面&#xff01;希望您在這里可以感受到一份輕松愉快的氛圍&#xff0c;不僅可以獲得有趣的內容和知識&#xff0c;也可以暢所欲言、分享您的想法和見解。 推薦:kwan 的首頁,持續學…

地下工程中測斜儀的關鍵應用

地下工程&#xff0c;如隧道、地鐵和基坑等項目的建設&#xff0c;對于現代城市的發展至關重要。然而&#xff0c;這些工程的實施往往伴隨著諸多風險&#xff0c;特別是與周圍土體的穩定性有關的風險。為了確保工程的安全進行&#xff0c;實時監測技術變得尤為關鍵。其中&#…

vue3專欄項目 -- 三、使用vue-router 和 vuex(下)

一、添加columnDetail 頁面 首頁有專欄列表&#xff08;ColumnList組件&#xff09;&#xff0c;專欄列表中有很多專欄&#xff0c;然后點擊某個專欄就進入專欄詳情頁&#xff08;ColumnDetail組件&#xff09;&#xff0c;專欄詳情頁中有很多文章&#xff0c;點擊某個文章就進…

經開區創維汽車車輛交接儀式順利舉行,守護綠色出行助力低碳發展

5月10日&#xff0c;“創維新能源汽車進機關”交車儀式于徐州順利舉行&#xff0c;20輛創維EV6 II正式交付經開區政府投入使用。經開區陳琳副書記、黨政辦公室副主任張馳主任、經開區公車管理平臺苑忠民科長、創維汽車總裁、聯合創始人吳龍八先生、創維汽車營銷公司總經理饒總先…

配置管理與IT資產管理:差異與協同共生

在信息技術日新月異的今天&#xff0c;高效、可靠的IT服務管理成為企業競爭力的關鍵一環。ITIL4 作為業界公認的IT服務管理框架&#xff0c;為我們提供了一套全面而系統的實踐指南。在這一框架下&#xff0c;配置管理和IT資產管理作為兩大核心實踐&#xff0c;雖各有側重&#…

線路和繞組中的波過程(三)

本篇為本科課程《高電壓工程基礎》的筆記。 本篇為這一單元的第三篇筆記。上一篇傳送門。 沖擊電暈對線路上波過程的影響 實際中的導線存在電阻&#xff0c;而且還有對地電導&#xff0c;會消耗一部分能量。但是因為雷擊所涉及的傳輸距離很短&#xff0c;所以幾乎可以忽略這…