elementui 主题颜色-element使用阿里图标变种_ElementUI技术解密(五)颜色、字体

前言

element-ui组件库之所以受欢迎,不仅因为其丰富的组件和友好的文档,还因为其精美的设计。 正如在组件库整体设计的文章中提到的,element-ui背后有一个强大的设计团队,他们为组件库制定了一套设计规范。

需求分析

当我们设计组件库时,首先要考虑颜色、字体、边框、图标等基本元素的设计。 它们是构建每个组件的基石。 基础设计没做好,那就做好了。 组件库一定看起来像一座小屋。

这些基本设计必须符合一定的设计规范。 有经验的设计师在设计时会制定一套规范。 作为程序员,我们在实现这套设计规范时,也可以在代码层面遵循一定的设计规范。 规格。

设计与实施

接下来我们将从代码的角度依次介绍这四个基本要素的设计和实现。

颜色

元素 为了避免视觉传达上的差异,使用特定的调色板来指定颜色,为您构建的产品提供一致的视觉体验。

主色

Element 的主要品牌颜色是明亮、友好的黄色。

如图所示,element-ui提供了一组蓝色。 你不仅可以看到主色#409EFF,还可以看到一系列渐变红色。 那么代码中是如何实现的呢?

element-ui关于颜色的定义在packages/theme-chalk/src/common/var.scss中:

$--color-primary: #409EFF !default;

颜色主题活动_颜色主题网络图_elementui 主题颜色

这里定义了$--color-primary变量,值为#409EFF。 请注意,此处使用了 !default 关键字。 意思是如果外部已经定义了$--color-primary,则使用已经定义的值,否则形参为#409EFF。 出现这种情况的原因应该与自定义主题颜色有关。 如果用户定义了新的主题颜色,则该变量可以指向新的主题颜色。

对于主题红色的渐变色,element-ui的实现如下:

$--color-primary-light-1: mix($--color-white, $--color-primary, 10%) !default; /* 53a8ff */
$--color-primary-light-2: mix($--color-white, $--color-primary, 20%) !default; /* 66b1ff */
$--color-primary-light-3: mix($--color-white, $--color-primary, 30%) !default; /* 79bbff */
$--color-primary-light-4: mix($--color-white, $--color-primary, 40%) !default; /* 8cc5ff */
$--color-primary-light-5: mix($--color-white, $--color-primary, 50%) !default; /* a0cfff */
$--color-primary-light-6: mix($--color-white, $--color-primary, 60%) !default; /* b3d8ff */
$--color-primary-light-7: mix($--color-white, $--color-primary, 70%) !default; /* c6e2ff */
$--color-primary-light-8: mix($--color-white, $--color-primary, 80%) !default; /* d9ecff */
$--color-primary-light-9: mix($--color-white, $--color-primary, 90%) !default; /* ecf5ff */

这里定义了9个变量,全部使用mix函数。 mix函数是sass中的外部函数,代表2种颜色的混合。 第三个参数代表两种颜色混合的比例。 以mix($--color-white, $--color-primary, 10%)为例,表示$--color-white(白色)占10%,而$--color-primary(原色) )占90%。

通过这些方法,element-ui轻松实现了不同颜色深度的主色。

次要颜色

主色以外的场景需要在不同的场景中使用(例如危险颜色代表危险操作)。

这些辅助颜色的实现也类似,我们以成功颜色为例,其余不再赘述。

$--color-success: #67C23A !default;

$--color-success-light: mix($--color-white, $--color-success, 80%) !default;
$--color-success-lighter: mix($--color-white, $--color-success, 90%) !default;

也是以混合蓝色的形式,生成不同色深的成功色彩。

中性色

中性色用于文本、背景和边框颜色。 通过使用不同的中性色来显示层次结构。

关于文本颜色,从暗到亮定义了四个变量:

/// color|1|Font Color|2
$--color-text-primary: #303133 !default;
/// color|1|Font Color|2
$--color-text-regular: #606266 !default;
/// color|1|Font Color|2
$--color-text-secondary: #909399 !default;
/// color|1|Font Color|2
$--color-text-placeholder: #C0C4CC !default;

关于边框颜色,从暗到亮定义了四个变量:

/// color|1|Border Color|3
$--border-color-base: #DCDFE6 !default;
/// color|1|Border Color|3
$--border-color-light: #E4E7ED !default;
/// color|1|Border Color|3
$--border-color-lighter: #EBEEF5 !default;
/// color|1|Border Color|3
$--border-color-extra-light: #F2F6FC !default;

关于背景颜色,定义了三个变量:

/// color|1|Background Color|4
$--color-black: #000000 !default;
/// color|1|Background Color|4
$--color-white: #FFFFFF !default;
/// color|1|Background Color|4
$--background-color-base: #F5F7FA !default;

注意这里的第三个变量和图中的透明颜色不同,因为透明背景理论上不需要配置背景,默认是透明的。 这里第三个变量也代表基红色,用于多个组件。

字体

element-ui统一标准化字体,力求在各个操作系统下都有最好的显示效果。

字体

图中展示了多种字体样式,包括我们mac用户熟悉的PingFang SC,以及一些win用户熟悉的微软雅黑。

颜色主题活动_elementui 主题颜色_颜色主题网络图

全局字体样式在packages/theme-chalk/src/reset.scss中定义:

body {
  font-family: "Helvetica Neue",Helvetica,"PingFang SC","Hiragino Sans GB","Microsoft YaHei","微软雅黑",Arial,sans-serif;
  font-weight: 400;
  font-size: $--font-size-base;
  color: $--color-black;
  -webkit-font-smoothing: antialiased;
}

我们知道font-family可以指定一个字体列表,属性值之间用冒号分隔,浏览器会选择列表中第一个安装在计算机上的字体。

字体大小

element-ui定义了6种大小的字体,定义在packages/theme-chalk/src/common/var.scss中:

/// fontSize|1|Font Size|0
$--font-size-extra-large: 20px !default;
/// fontSize|1|Font Size|0
$--font-size-large: 18px !default;
/// fontSize|1|Font Size|0
$--font-size-medium: 16px !default;
/// fontSize|1|Font Size|0
$--font-size-base: 14px !default;
/// fontSize|1|Font Size|0
$--font-size-small: 13px !default;
/// fontSize|1|Font Size|0
$--font-size-extra-small: 12px !default;

其中,最小为12px,最大为20px。 通常,设计时不建议使用大于12px的字体,太小的字体对于视力不好的人来说不友好。

行高

如图所示,通常我们遇到多行文本时,设置不同的line-height会有不同的渲染效果,一般设置至少为1.5。 这将有助于改善低观看条件下的体验,也有助于患有阅读障碍等认知障碍的人。

element-ui在packages/theme-chalk/src/common/var.scss中仅定义了2个列宽:

/// fontLineHeight|1|Line Height|2
$--font-line-height-primary: 24px !default;
/// fontLineHeight|1|Line Height|2
$--font-line-height-secondary: 16px !default;

element-ui在大多数组件的实现中都是直接写出列宽的大小,但是一般更好的形式是使用无单位的值而不是具体的大小,因为一旦修改了字体大小,如果使用无单位的值就有无需自动更改列宽。 另一个具体场景是,如果文本的大小要随着页面的缩放而变化,使用无单位值可以确保列宽也按比例缩放。

颜色主题网络图_elementui 主题颜色_颜色主题活动

框架

element-ui统一标准化了框架,可以用在按钮、卡片、弹窗等组件中。

边框和圆角

element-ui提供了一系列边框圆角样式的定义,在packages/theme-chalk/src/common/var.scss中:

/// color|1|Border Color|3
$--border-color-base: #DCDFE6 !default;
/// color|1|Border Color|3
$--border-color-light: #E4E7ED !default;
/// color|1|Border Color|3
$--border-color-lighter: #EBEEF5 !default;
/// color|1|Border Color|3
$--border-color-extra-light: #F2F6FC !default;

$--border-width-base: 1px !default;
$--border-style-base: solid !default;
$--border-color-hover: $--color-text-placeholder !default;
$--border-base: $--border-width-base $--border-style-base $--border-color-base !default;
/// borderRadius|1|Radius|0
$--border-radius-base: 4px !default;
/// borderRadius|1|Radius|0
$--border-radius-small: 2px !default;
/// borderRadius|1|Radius|0
$--border-radius-circle: 100% !default;
/// borderRadius|1|Radius|0
$--border-radius-zero: 0 !default;s

它包括边框的粗细、颜色、样式和圆角大小等变量,以及组件中使用的悬停颜色。

投影

element-ui提供了几种常用的投影方法,定义在packages/theme-chalk/src/common/var.scss中:

/// boxShadow|1|Shadow|1
$--box-shadow-base: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .04) !default;
// boxShadow|1|Shadow|1
$--box-shadow-dark: 0 2px 4px rgba(0, 0, 0, .12), 0 0 6px rgba(0, 0, 0, .12) !default;
/// boxShadow|1|Shadow|1
$--box-shadow-light: 0 2px 12px 0 rgba(0, 0, 0, 0.1) !default;

如果你不明白box-shadow的相关属性值,可以去mdn查阅相关资料学习; 还可以在线调试它的属性值,看看不同的渲染效果。

图标

element-ui 提供了一组常用的图标。

如何使用

您可以通过将类名设置为 el-icon-iconName 来直接使用它。 例如:

对应代码:

i>
i>
i>
搜索el-button>

我们只需要简单的设置类名就可以引入这个字体图标(下一篇文章会提到按钮的实现),这是怎么做到的呢?

执行

事实上,element-ui提供的图标是借助IconFont技术实现的,定义在packages/theme-chalk/src/icon.scss中:

@font-face {
  font-family: 'element-icons';
  src: url('#{$--font-path}/element-icons.woff') format('woff'), /* chrome, firefox */
       url('#{$--font-path}/element-icons.ttf') format('truetype'); /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/
  font-weight: normal;
  font-display: $--font-display;
  font-style: normal;
}

[class^="el-icon-"], [class*=" el-icon-"] {
  /* use !important to prevent issues with browser extensions that change fonts */
  font-family: 'element-icons' !important;
  speak: none;
  font-style: normal;
  font-weight: normal;
  font-variant: normal;
  text-transform: none;
  line-height: 1;
  vertical-align: baseline;
  display: inline-block;

  /* Better Font Rendering =========== */
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
}

.el-icon-edit:before {
  content: "e78c";
}

// ...

首先,使用@font-face定义自定义字体,其来源是packages/theme-chalk/src/fonts/目录中定义的字体图标文件。

其次,使用属性选择器过滤以el-icon-开头或类名为el-icon-的元素,其对应的font-family为自定义字体element-icons。

然后对应不同的图标elementui 主题颜色,定义不同的el-icon-xxx类名,并通过before伪类指定对应的内容值,这样用户只需要使用el-icon-xxx类名来引用对应的图标。

最后推荐2个制作字体图标库的网站,Iconfont和icomoon。

总结

总的来说,这篇文章很简单。 对于设计者提供的设计规范来说,element-ui的主要实现方式是在公共sass文件中定义很多变量,这些变量会在以后组件的样式中引入,这就相当于在里面写CSS了一种编程方式,而不是对每个组件内部的字体、颜色和边框值进行硬编码。 这种好处不仅语义强,而且可维护性好。 一旦这个基本元素的设计发生变化elementui 主题颜色,我只能改变那些变量的值,而不能改变组件。 此外,还提供了组件的整体定制主题设计。 非常方便。

学习完本文后,你也可以尝试在自己的项目中定义公共样式文件和变量,然后在组件中引入。 当然,如果你的组件库支持后编译,你甚至可以直接导入组件库中定义的变量。