搭建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.mzph.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;所以几乎可以忽略这…