原文:https://www.sitepoint.com/sass-component-10-minutes/javascript
如今一些开发者认为,把具备特定功能的代码片断独立出来,互相组合,去开发网站或应用,这是一种很好的方式。也就是组件化,可是实现起来却没有那么容易。java
一个好的示例让人豁然开朗, 我选取的示例是几乎每一个网站或应用都具备的交互组件:信息提示。数组
经过写一个具备不一样信息类型的提示组件,会有助于提高你的Sass。那就让咱们开始动手吧。浏览器
咱们须要什么,信息。什么样式的信息?让咱们参照一下具备这个组件的框架:Bootstrap。Bootstrap定义了四种类型
的提示信息:sass
看起来挺适合咱们用来做为参考。在生活中咱们会用不一样的语调去表达不一样的情感,同理,咱们能够在网站上用不一样的颜色去显示不一样类型的信息。四种类型的提示,每一个都有本身的颜色。让咱们再一次借用一下Bootstrap
的作法,定义咱们提示的颜色:框架
全部的信息都有一些公共的样式,如 padding, margins, 也可能会有排版样式。最后,惟一不一样的样式是表示不一样提示的颜色。函数
让咱们先写一个placeholder:组件化
%message { padding: .5em; margin-bottom: .5em; border-radius: .15em; border: 1px solid; }
第一个要注意的事情是:咱们没有设置任何字体样式,如大小,字体,或者行高。由于使用这个模块的项目,通常都已经设置了这些通用的样式
。如今这样,会让咱们的组件更加独立化
。字体
咱们也没有设置边框的颜色。border-color
这个属性的默认值是currentcolor
。在大多浏览器中,是黑色。网站
如今开始写一个mixin:
@mixin message($color) { @extend %message; color: $color; border-color: lighten($color, 20%); background: lighten($color, 40%); }
就像你所看到的,mixin作了两件事情:
它设置了一个关于color
的属性,经过参数把一个颜色值传递进来。而后设置了color
,border-color
这两个属性,很感谢Sass的lighten
颜色函数。使用Sass的颜色操做函数有助于减小mixin须要输入的参数数量。
继承%message
这个placeholder,因此你不用在每一个信息类型中去重复书写这些样式了。这样一来,代码很是符合DRY
原则。
到如今为止,已经完成的差很少了。还剩下的事情是调用mixin,为不一样类型的提示信息传入其对应的颜色参数值:
.message-error { @include message(#b94a48); } .message-valid { @include message(#468847); } .message-warning { @include message(#c09853); } .message-info { @include message(#3a87ad); }
咱们如今作的已经至关整洁了。若是想增长一个新的提示类型,那须要作的只是@include message(你选择的颜色值)
,在那个新的提示类型对应的class里边。可是咱们能使组件代码更轻便适用吗?
把每一个类型的提示和一个颜色映射对应起来,有一些好的方式吗?有:嵌套列表(Nested Lists)。经过建立一个二维列表,而后循环这些值,咱们能够很容易作到。
$message-types: ( (error #b94a48) (valid #468847) (warning #c09853) (info #3a87ad) ) !default; @each $message-type in $message-types { $type: nth($message-type, 1); $color: nth($message-type, 2); .message-#{$type} { @include message($color); } }
如今Sass生成的代码和咱们上边写的效果同样。你能够把变量列表放到样式表的顶部或者一个配置文件中去,这样的话,增删改一个信息类型将会很方便容易。
提醒:若是你打算将这个组件添加到某个库或者框架中去,那么
!default
标记($message-types这个变量中使用的)将会让你很容易去覆盖这个变量,若是你有这个需求的话。
咱们可使用Sass 3.3中新增的数据类型:Maps
。Maps就像PHP中的关联数组,或者javascript中的对象。他们都是键值对映射。
$message-types: ( error : #b94a48, valid : #468847, warning : #c09853, info : #3a87ad ) !default; @each $type, $color in $message-types { .message-#{$type} { @include message($color); } }
很爽吧。
常常被Sass开发者们忽略的一件事情是:优雅地处理错误的能力。你应该保证自定义的函数和mixins中传入的参数值是正确的,若是不正确,那么要提供警告信息。比起让Sass本身去处理这些错误好多了。
在这个示例里边,咱们须要保证$color
这个参数的值必须是一个颜色值。
@mixin message($color) { @if type-of($color) == color { @extend %message; color: $color; border-color: lighten($color, 20%); background: lighten($color, 40%); } @else { @warn "#{$color} is not a color for `message`."; } }
如今这样的话,就可以保证当mixin接受到一个非颜色的参数值时,Sass不会崩溃掉。另外,它也能帮助开发者知道这是由无效参数引起的错误。
在30行的SCSS里边,咱们写出了这样的组件:
这些是适用于全部组件的规则。