• 【封装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代码如下:

    1. // 该文件主要是负责定义全局的样式变量,例如颜色、字体大小等等
    2. // 主题色
    3. $colors: (
    4. primary: #409eff,
    5. success: #67c23a,
    6. warning: #e6a23c,
    7. danger: #f56c6c,
    8. info: #909399
    9. );
    10. :root {
    11. // 接下来我们需要生成主题色和不同亮度的颜色
    12. @each $val, $color in $colors {
    13. // 生成主题颜色
    14. --visual-color-#{$val}: #{$color};
    15. // 还需要生成不同亮度的颜色
    16. @for $i from 1 through 4 {
    17. --visual-color-#{$val}-light-#{2 * $i + 1}: #{mix(#fff, $color, ((2 * $i + 1) * 10 * 1%))};
    18. }
    19. // dark2 和 light8 因为不符合上面的规律,我们在下面单独来生成
    20. --visual-color-#{$val}-light-8: #{mix(#fff, $color, 80 * 1%)}; // 80% 亮度
    21. --visual-color-#{$val}-dark-2: #{mix(
    22. #000,
    23. $color,
    24. 20 * 1%
    25. )}; // 注意,dark是和黑色进行混合,20% 亮度
    26. }
    27. // 接下来,还有一些其他的颜色变量
    28. // 对应的是 ElementUI 里面的中性色
    29. --visual-color-white: #fff;
    30. --visual-color-black: #000;
    31. --visual-bg-color: #ffffff;
    32. --visual-bg-color-page: #f2f3f5;
    33. --visual-bg-color-overlay: #ffffff;
    34. --visual-text-color-primary: #303133;
    35. --visual-text-color-regular: #606266;
    36. --visual-text-color-secondary: #909399;
    37. --visual-text-color-placeholder: #a8abb2;
    38. --visual-text-color-disabled: #c0c4cc;
    39. --visual-border-color: #dcdfe6;
    40. --visual-border-color-light: #e4e7ed;
    41. --visual-border-color-lighter: #ebeef5;
    42. --visual-border-color-extra-light: #f2f6fc;
    43. --visual-border-color-dark: #d4d7de;
    44. --visual-border-color-darker: #cdd0d6;
    45. --visual-fill-color: #f0f2f5;
    46. --visual-fill-color-light: #f5f7fa;
    47. --visual-fill-color-lighter: #fafafa;
    48. --visual-fill-color-extra-light: #fafcff;
    49. --visual-fill-color-dark: #ebedf0;
    50. --visual-fill-color-darker: #e6e8eb;
    51. --visual-fill-color-blank: #ffffff;
    52. // 和 border 相关的变量
    53. --visual-border-width: 1px;
    54. --visual-border-style: solid;
    55. --visual-border-color-hover: var(--visual-text-color-disabled);
    56. --visual-border: var(--visual-border-width) var(--visual-border-style) var(--visual-border-color);
    57. --visual-border-radius-base: 4px;
    58. --visual-border-radius-small: 2px;
    59. --visual-border-radius-round: 20px;
    60. --visual-border-radius-circle: 100%;
    61. // 和 font 相关的变量
    62. --visual-font-size-extra-large: 20px;
    63. --visual-font-size-large: 18px;
    64. --visual-font-size-medium: 16px;
    65. --visual-font-size-base: 14px;
    66. --visual-font-size-small: 13px;
    67. --visual-font-size-extra-small: 12px;
    68. --visual-font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB',
    69. 'Microsoft YaHei', '\5fae\8f6f\96c5\9ed1', Arial, sans-serif;
    70. --visual-font-weight-primary: 500;
    71. // 和 disabled 相关的变量
    72. --visual-disabled-bg-color: var(--visual-fill-color-light);
    73. --visual-disabled-text-color: var(--visual-text-color-placeholder);
    74. --visual-disabled-border-color: var(--visual-border-color-light);
    75. // 和 transition 过渡相关的变量
    76. --visual-transition-duration: 0.3s;
    77. --visual-transition-duration-fast: 0.2s;
    78. }

    🌟样式重置

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

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

    1. // 这个文件负责重置样式
    2. body {
    3. font-family: var(--duyi-font-family);
    4. font-weight: 400;
    5. font-size: var(--duyi-font-size-base);
    6. color: var(--duyi-text-color-primary);
    7. -webkit-font-smoothing: antialiased;
    8. -moz-osx-font-smoothing: grayscale;
    9. -webkit-tap-highlight-color: transparent;
    10. }
    11. a {
    12. color: var(--duyi-color-primary);
    13. text-decoration: none;
    14. &:hover,
    15. &:focus {
    16. color: var(--duyi-color-primary-light-3);
    17. }
    18. &:active {
    19. color: var(--duyi-color-primary-dark-2);
    20. }
    21. }
    22. h1,
    23. h2,
    24. h3,
    25. h4,
    26. h5,
    27. h6 {
    28. color: var(--duyi-text-color-regular);
    29. font-weight: inherit;
    30. &:first-child {
    31. margin-top: 0;
    32. }
    33. &:last-child {
    34. margin-bottom: 0;
    35. }
    36. }
    37. h1 {
    38. font-size: calc(var(--duyi-font-size-base) + 6px);
    39. }
    40. h2 {
    41. font-size: calc(var(--duyi-font-size-base) + 4px);
    42. }
    43. h3 {
    44. font-size: calc(var(--duyi-font-size-base) + 2px);
    45. }
    46. h4,
    47. h5,
    48. h6,
    49. p {
    50. font-size: inherit;
    51. }
    52. p {
    53. line-height: 1.8;
    54. &:first-child {
    55. margin-top: 0;
    56. }
    57. &:last-child {
    58. margin-bottom: 0;
    59. }
    60. }
    61. sup,
    62. sub {
    63. font-size: calc(var(--duyi-font-size-base) - 1px);
    64. }
    65. small {
    66. font-size: calc(var(--duyi-font-size-base) - 2px);
    67. }
    68. hr {
    69. margin-top: 20px;
    70. margin-bottom: 20px;
    71. border: 0;
    72. border-top: 1px solid var(--duyi-border-color-lighter);
    73. }

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

     🌟总结

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

  • 相关阅读:
    ES6语法-Promise
    IDL学习:语法基础-程序控制
    l8-d6 socket套接字及TCP的实现框架
    Flutter项目开发模版,开箱即用
    图解哈希表及其原理
    web前端大作业--美团外卖1
    Clion~Clion常用配置和插件
    生成全世界唯一的uuid(golang实现)
    使用helm快速安装Nightingale夜莺监控系统
    TensorFlow 02(张量)
  • 原文地址:https://blog.csdn.net/G_ing/article/details/134520221