【封装UI组件库系列】全局样式的定义与重置

封装UI组件库系列第二篇·样式​​​​​​​

​​​​​​🌟前言

🌟定义全局样式

生成主题色和不同亮度的颜色

​编辑

中性色及其他变量 

🌟样式重置

🌟总结


​​​​​​​​​​​​​​🌟前言

在前端开发中,大家可能已经用过各种各样的UI组件库了,现在市面上热门的有Element-uiAnt Design等等,这些即插即用的组件库确实大大提升了开发效率,避免了很多的重复劳动,但这些组件库再怎么完善,又怎么能满足得了我们可爱的产品经理呢?所以工作中难免会需要开发公司内部的UI组件库,或者基于已有组件库进行二开。

【封装UI组件库系列】文章,将从0开始--》搭建项目--》封装八大经典功能组件--》打包组件库--》将组件库发布至npm--》使用自己封装的组件库。技术方面使用的是Vue3 + Vite + Sass 来完成一个模仿Element Plus的组件库。最终完成效果如下:

前一篇文章完整讲解了项目框架的搭建,在读本篇文章前建议先阅读前一篇从零封装UI组件库

 

🌟定义全局样式

生成主题色和不同亮度的颜色

新建src/styles/index.scss vars.scss文件。

idnex.scss是样式的入口文件,vars.scss是负责定义全局的样式变量,例如颜色、字体大小等等。

接下来我们就模仿Element Plus定义主题色:

先定义几大主题色: 

然后就是使用scss语法去生成生成主题色和不同亮度的颜色:

并在main.js中引入:

import './styles/index.scss'

这时就可以看到样式起效了:

那么我们继续生成其他亮度颜色: 

 上面其他亮度的命名也都是参考的Element Plus:

这样就将各亮度的颜色也都生成出来了:

中性色及其他变量 

接下来还有一些中性色以及 border、font、disabled等相关样式的定义,vars.scss代码如下:

// 该文件主要是负责定义全局的样式变量,例如颜色、字体大小等等

// 主题色
$colors: (
  primary: #409eff,
  success: #67c23a,
  warning: #e6a23c,
  danger: #f56c6c,
  info: #909399
);

:root {
  // 接下来我们需要生成主题色和不同亮度的颜色
  @each $val, $color in $colors {
    // 生成主题颜色
    --visual-color-#{$val}: #{$color};
    // 还需要生成不同亮度的颜色
    @for $i from 1 through 4 {
      --visual-color-#{$val}-light-#{2 * $i + 1}: #{mix(#fff, $color, ((2 * $i + 1) * 10 * 1%))};
    }
    // dark2 和 light8 因为不符合上面的规律,我们在下面单独来生成
    --visual-color-#{$val}-light-8: #{mix(#fff, $color, 80 * 1%)}; // 80% 亮度
    --visual-color-#{$val}-dark-2: #{mix(
        #000,
        $color,
        20 * 1%
      )}; // 注意,dark是和黑色进行混合,20% 亮度
  }

  // 接下来,还有一些其他的颜色变量
  // 对应的是 ElementUI 里面的中性色
  --visual-color-white: #fff;
  --visual-color-black: #000;
  --visual-bg-color: #ffffff;
  --visual-bg-color-page: #f2f3f5;
  --visual-bg-color-overlay: #ffffff;
  --visual-text-color-primary: #303133;
  --visual-text-color-regular: #606266;
  --visual-text-color-secondary: #909399;
  --visual-text-color-placeholder: #a8abb2;
  --visual-text-color-disabled: #c0c4cc;
  --visual-border-color: #dcdfe6;
  --visual-border-color-light: #e4e7ed;
  --visual-border-color-lighter: #ebeef5;
  --visual-border-color-extra-light: #f2f6fc;
  --visual-border-color-dark: #d4d7de;
  --visual-border-color-darker: #cdd0d6;
  --visual-fill-color: #f0f2f5;
  --visual-fill-color-light: #f5f7fa;
  --visual-fill-color-lighter: #fafafa;
  --visual-fill-color-extra-light: #fafcff;
  --visual-fill-color-dark: #ebedf0;
  --visual-fill-color-darker: #e6e8eb;
  --visual-fill-color-blank: #ffffff;

  // 和 border 相关的变量
  --visual-border-width: 1px;
  --visual-border-style: solid;
  --visual-border-color-hover: var(--visual-text-color-disabled);
  --visual-border: var(--visual-border-width) var(--visual-border-style) var(--visual-border-color);
  --visual-border-radius-base: 4px;
  --visual-border-radius-small: 2px;
  --visual-border-radius-round: 20px;
  --visual-border-radius-circle: 100%;

  // 和 font 相关的变量
  --visual-font-size-extra-large: 20px;
  --visual-font-size-large: 18px;
  --visual-font-size-medium: 16px;
  --visual-font-size-base: 14px;
  --visual-font-size-small: 13px;
  --visual-font-size-extra-small: 12px;
  --visual-font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB',
    'Microsoft YaHei', '\5fae\8f6f\96c5\9ed1', Arial, sans-serif;
  --visual-font-weight-primary: 500;

  // 和 disabled 相关的变量
  --visual-disabled-bg-color: var(--visual-fill-color-light);
  --visual-disabled-text-color: var(--visual-text-color-placeholder);
  --visual-disabled-border-color: var(--visual-border-color-light);

  // 和 transition 过渡相关的变量
  --visual-transition-duration: 0.3s;
  --visual-transition-duration-fast: 0.2s;
}

🌟样式重置

因为浏览器都有一套默认样式,这就导致在不同浏览器,我们的样式可能会出现偏差,所以需要重置浏览器样式,来避免因浏览器造成的样式污染

新建src/styles/reset.scss 主要是body及a等几大标签的重置,代码如下:

// 这个文件负责重置样式

body {
  font-family: var(--duyi-font-family);
  font-weight: 400;
  font-size: var(--duyi-font-size-base);
  color: var(--duyi-text-color-primary);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  -webkit-tap-highlight-color: transparent;
}

a {
  color: var(--duyi-color-primary);
  text-decoration: none;

  &:hover,
  &:focus {
    color: var(--duyi-color-primary-light-3);
  }

  &:active {
    color: var(--duyi-color-primary-dark-2);
  }
}

h1,
h2,
h3,
h4,
h5,
h6 {
  color: var(--duyi-text-color-regular);
  font-weight: inherit;

  &:first-child {
    margin-top: 0;
  }

  &:last-child {
    margin-bottom: 0;
  }
}

h1 {
  font-size: calc(var(--duyi-font-size-base) + 6px);
}

h2 {
  font-size: calc(var(--duyi-font-size-base) + 4px);
}

h3 {
  font-size: calc(var(--duyi-font-size-base) + 2px);
}

h4,
h5,
h6,
p {
  font-size: inherit;
}

p {
  line-height: 1.8;

  &:first-child {
    margin-top: 0;
  }

  &:last-child {
    margin-bottom: 0;
  }
}

sup,
sub {
  font-size: calc(var(--duyi-font-size-base) - 1px);
}

small {
  font-size: calc(var(--duyi-font-size-base) - 2px);
}

hr {
  margin-top: 20px;
  margin-bottom: 20px;
  border: 0;
  border-top: 1px solid var(--duyi-border-color-lighter);
}

 到这里项目框架及全局样式都以完成,下一篇将正式开始封装组件!

 🌟总结

 【封装UI组件库系列】文章会持续更新,将带着大家从0开始--》搭建项目--》封装八大经典功能组件--》打包组件库--》将组件库发布至npm--》最后使用自己封装的组件库。如果文中出现有瑕疵的地方各位通过评论或者私信联系我,我们一起进步!该系列文章建议从第一篇开始看,系列专栏地址:从零开始封装UI组件库完整篇

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/173127.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

pygame播放视频并实现音视频同步

一、前言 在我接触pygame时最新的pygame已经不支持movie模块,这就导致在pygame播放视频变成一个问题,网上搜了下解决方案有两个: 一是使用opencv播放视频,再结合pygame.mixer来播放音频 二是使用moviepy播放视频,再…

【C++进阶之路】第四篇:set和map

文章目录 一、关联式容器健值对二、set & multiset三、map & multimap在这里插入图片描述 四、set和map底层原理 一、关联式容器健值对 关联式容器 & 键值对 二、set & multiset set & multiset 三、map & multimap map & multimap 四、set和…

自己动手打包构建编译cri-dockerd

1.背景 本机是 armv7l架构cpu,发现官方文档中竟然没有,因此需要自己编译下; [rootcontainer0 ~]# uname -a Linux container0 5.4.206-v7l.1.el7 #1 SMP Mon Jul 25 14:13:29 UTC 2022 armv7l armv7l armv7l GNU/Linux2.打包/构建/编译 gi…

基于龙格-库塔算法优化概率神经网络PNN的分类预测 - 附代码

基于龙格-库塔算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于龙格-库塔算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于龙格-库塔优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对P…

7.1 Windows驱动开发:内核监控进程与线程回调

在前面的文章中LyShark一直在重复的实现对系统底层模块的枚举,今天我们将展开一个新的话题,内核监控,我们以监控进程线程创建为例,在Win10系统中监控进程与线程可以使用微软提供给我们的两个新函数来实现,此类函数的原…

什么是数字化工厂?企业数字化转型有什么好处?

科技在发展,时代在进步,全球信息化、数字化的步伐越来越快,数字化转型是否成功也成为企业在未来发展中能否做大做强的关键因素。而数字化工厂就是制造业数字化发展的一个重要发展方向,那么究竟什么是数字化工厂呢?它和…

相对定位、绝对定位、固定定位、绝对定位堆叠顺序

相对定位:相对自己本身进行偏移 CSS语法: position: relative;/*相对自己进行定位*/ top: 10px;/*距离上边*/ left: 10px;/*距离左边*/ 演示图: 绝对定位:默认以浏览器进行定位。如果想依照父盒子定位,需要在父盒子…

UE5和UE4版本更新重大改变汇总。

转载:UE5和UE4版本更新重大改变汇总。 - 知乎 (zhihu.com) 用户界面变化: 1,原先拖动给放置Actor的place actors,世界大纲,Level等都可以通过右击隐藏到侧边栏; 2,Command命令窗口和ContentBr…

A____Z____RECOVER____DATA勒索恢复---惜分飞

有客户MySQL数据库被黑,业务库中表被删除,并创建A____Z____RECOVER____DATA库,里面有一张readme表,内容为: mysql> select * from readme \G; *************************** 1. row *************************** zh_content: 请尽快与我们取得联系,否则我们将会公…

Cypress环境变量

Cypress环境变量 baseUrl 当你配置了 baseUrl ,测试套件中的 cy.visit() 、 cy.request() 都会自动以 baseUrl 的值作为前缀并且,当你需要访问某些网址或者发起接口请求时,在代码中就可以不用再指定请求的 host 或者 url 了 如何配置 base…

使用Kafka、Flink、Druid构建实时数据系统架构

1. 背景 对于很多数据团队来说,要满足实时需求并不容易。为什么?因为作流程(数据采集、预处理、分析、结果保存)涉及大量等待。等待数据发送到 ETL 工具,等待数据批量处理,等待数据加载到数据仓库中&#…

JSP:Tag文件的使用

需求:多个JSP页面可能需要使用一些相同的信息 例如:导航栏、标题等。 目标:提高这些相同信息的代码的复用性。 方法:将这些相同的元素形成一种特殊的文件,以便所有页面都可以使用,即:Tag文件 1、Tag对…

抽象工厂设计模式是什么?什么是 Abstract Factory 抽象工厂设计模式?Python 抽象工厂设计模式示例代码

什么是 Abstract Factory 抽象工厂设计模式? 抽象工厂设计模式是一种创建型设计模式,旨在提供一个创建一系列相关或相互依赖对象的接口,而无需指定其具体类。它允许客户端使用抽象的接口创建一组相关对象,而无需关注实际的对象实…

广州华锐互动:3D模拟体验火箭发射过程有什么教育意义?

3D虚拟还原火箭发射过程在教育领域有着深远的意义。它能够为学生提供直观、生动的体验,帮助他们更好地理解和掌握相关知识,激发他们对科技的兴趣和探索欲望。 首先,3D虚拟还原火箭发射过程可以帮助学生更好地理解和掌握航天科技知识。在火箭发…

【数据结构】栈和队列的模拟实现

前言:前面我们学习了单链表并且模拟了它的实现,今天我们来进一步学习,来学习栈和队列吧!一起加油各位,后面的路只会越来越难走需要我们一步一个脚印! 💖 博主CSDN主页:卫卫卫的个人主页 &#x…

Leetcode 第 372 场周赛题解

Leetcode 第 372 场周赛题解 Leetcode 第 372 场周赛题解题目1:2937. 使三个字符串相等思路代码复杂度分析 题目2:2938. 区分黑球与白球思路代码复杂度分析 题目3:2939. 最大异或乘积思路代码复杂度分析 题目4:2940. 找到 Alice 和…

演示命令执行漏洞无回现如何渗透

演示命令执行漏洞无回现如何渗透 在DNSlog 获取一个域名 使用dvwa中的命令执行来ping此域名 执行后在DNSlog收到解析,证明命令执行成功

VSCode任务tasks.json中的问题匹配器problemMatcher的问题匹配模式ProblemPattern详解

☞ ░ 前往老猿Python博客 ░ https://blog.csdn.net/LaoYuanPython 一、简介 在 VS Code 中,tasks.json 文件中的 problemMatcher 字段用于定义如何解析任务输出中的问题(错误、警告等)。 problemMatcher有三种配置方式,具体可…

欧科云链研究院:从香港SFC最新文件看链上交易合规必备之选

出品|欧科云链研究院 作者|Hedy Bi 近日,香港证监会在其官网发布“致持牌法团、获证监会发牌的虚拟资产服务提供者及有联系实体的通函 - 打击洗钱/恐怖分子资金筹集经更新的《打击洗钱/恐怖分子资金筹集的自我评估查…

图形学 -- Ray Tracing 光线追踪

参考视频:Lecture 13 Ray Tracing 1_哔哩哔哩_bilibili Ray tracing 原因 Rasterization 格栅话不能处理好global effects,如↓ 简介反射:光线在到达人眼前不止弹射一次 基本假设 1)光是沿着直线传播 2)光线交叉…