前言
什么是 helper ?任何框架都不是万能的,而业务需求却是多种多样,很多时候我们只需要更改组件的部分属性,而 helper 就是调整细节的工具。我在之前的文章《如何编写轻量级 CSS 框架》中也举过例子,我们完全没必要因为几个属性的不同而重新编写新组件。大部分的 helper 都是一个类对应一个 CSS 属性,属于最细小的类。通过工作的实践总结,我觉得编写一套简单易用、通俗易懂的 helper 非常重要。本文的目的就是探讨 helper 的组成部分、编写方式以及如何精简 helper 的命名。
组件与零件
详细介绍如何编写 helper 之前,先说一下我对于组件以及零件的看法。在之前编写轻量级 CSS 框架的时候,我们是以组件的方式开发。而编写 helper 更像是开发一个零件,因为 helper 的属性单一,而且多个 helper 可以形成一个组件。比如下面的例子:
假设有 .boxes
组件
.boxes {
border: 1px solid #eee;
border-radius: 5px;
margin-bottom: 15px;
overflow: hidden;
}
假设有如下 helper
.b-1 {
border: 1px solid #eee !important;
}
.r-5{
border-radius: 5px !important;
}
.m-b-15{
margin-bottom: 15px !important;
}
.overflow-hidden {
overflow: hidden !important;
}
则 .boxes
= .b-1
+ .r-5
+ .m-b-15
+ .overflow-hidden
我是一个模型爱好者,这样的组合方式让我想到了寿屋的 HEXA GEAR 系列模型,这个系列的特点是“零件+零件=组件、组件+组件=骨架、骨架+骨架=素体、素体+武装=机体”。
在编写 helper 的时候,基于以上想法,我在思考是否可以把 helper 拆分的足够精细,这样它就可以自成一体形成一个框架,也就是“零件+零件=组件、组件+组件=框架”。令人遗憾的是,我的想法已经被人实践,前几天浏览 GitHub 时发现了相关的项目 tailwindcss,这个框架就是以 helper 为基础,通过属性叠加的方式添加样式。
组件式框架和零件式框架是两种完全不同的思想,难分伯仲,各有优缺点。
Helper 的组成部分
一套完整的 helper 应该包含哪些内容呢?一般常用的有 padding
、margin
、font-size
、font-weight
等。为了编写更为通用的 helper,我们需要更细致的划分。虽然我们并没有打算把它写成一个框架,但是我们希望 helper 的功能足够强大。通过对比和思考,我将 helper 暂时划分成以下几个模块:
- Colors(颜色,包括 bg-color 及 text-color)
- Paddings(内边距序列)
- Margins(外边距序列)
- Typography(排版,包括 font-size 及 font-weight)
- Border(边框线)
- Radius(圆角)
- Shadow(阴影)
- Size(尺寸,包括 height 及 width)
- Gutters(栅格间距序列)
- Alignment(主要是 vertical-align)
- …
和之前编写轻量级框架一样,我们同样使用 Sass 预编译器。helper 类几乎都是 Sass 循环生成的,所以源代码看上去很精简。
颜色变量
因为颜色稍微特殊一点,我将颜色与其它内容分开单独介绍。在编写轻量级框架的时候,我也定义了常用的一些颜色,但是面对特殊需求时略显单一,所以我们需要使用 helper 扩充颜色集群。但是颜色是一个无法量化的概念,所以再强大的 helper 也无法面面俱到,只能是一定程度上的补充。参考常用的颜色值,最终我设置了红、橙、黄、绿、青、蓝、靛、紫、粉、冷灰、暖灰等几种色系。
其中每个颜色都有六个亮度值,分别用 -lightest
、-lighter
、-light
、-dark
、-darker
、-darkest
表示,此处有参考 tailwindcss 的颜色命名。这些颜色都是通过 Sass 的颜色函数生成的。以灰色为例,Sass 代码如下:
$g