跳到主要内容

混合器

混合器和函数的定义方式相同,但它们的应用方式不同。

例如,我们定义了一个 border-radius(n) 函数,它被调用为一个 混合器(即作为语句调用,而不是表达式的一部分)。

当在选择器中调用 border-radius() 时,属性会被展开并复制到选择器中。

border-radius(n)
-webkit-border-radius n
-moz-border-radius n
border-radius n

form input[type=button]
border-radius(5px)

编译为:

form input[type="button"] {
-webkit-border-radius: 5px;
-moz-border-radius: 5px;
border-radius: 5px;
}

使用混合器时,您可以完全省略括号,提供出色的透明供应商属性支持!

border-radius(n)
-webkit-border-radius n
-moz-border-radius n
border-radius n

form input[type=button]
border-radius 5px

请注意,我们混合器中的 border-radius 被视为属性,而不是递归函数调用。

为了进一步发挥这一点,我们可以利用自动的 arguments 局部变量,其中包含传递的表达式,允许传递多个值:

border-radius()
-webkit-border-radius arguments
-moz-border-radius arguments
border-radius arguments

现在我们可以传递像 border-radius 1px 2px / 3px 4px 这样的值了!

还可以利用 插值 {param}

border(side, args...)
if side
border-{side} args
else
border args

.border-thick
border('left' , 10px, 'darkred')

.border
border('' , 1px, 'darkred')

渲染为:

.border-thick {
border-left: 10px 'darkred';
}
.border {
border: 1px 'darkred';
}

这的另一个很好的用途是为供应商特定的透明度支持添加透明度支持,例如 IE:

support-for-ie ?= true

opacity(n)
opacity n
if support-for-ie
filter unquote('progid:DXImageTransform.Microsoft.Alpha(Opacity=' + round(n * 100) + ')')

#logo
&:hover
opacity 0.5

渲染为:

#logo:hover {
opacity: 0.5;
filter: progid:DXImageTransform.Microsoft.Alpha(Opacity=50);
}

父级引用

混合器可以利用父级引用字符 &,作用于父级而不是进一步嵌套。

例如,假设我们想为表格行创建一个 stripe(even, odd) 混合器。

我们提供了默认颜色值的 evenodd,并在行上分配了 background-color 属性。在 tr 中嵌套使用 & 引用 tr,提供 even 颜色。

stripe(even = #fff, odd = #eee)
tr
background-color odd
&.even
&:nth-child(even)
background-color even

然后我们可以像下面这样使用 mixin:

table
stripe()
td
padding 4px 10px

table#users
stripe(#303030, #494848)
td
color white

或者,stripe() 可以定义为没有父级引用:

stripe(even = #fff, odd = #eee)
tr
background-color odd
tr.even
tr:nth-child(even)
background-color even

如果我们希望,我们可以像属性一样调用 stripe()

stripe #fff #000

块 mixin

您可以通过使用 + 前缀调用 mixin 来将块传递给 mixin:

+foo()
width: 10px

传递的块将在 mixin 中作为 block 变量可用,然后可以使用插值:

foo()
.bar
{block}

+foo()
width: 10px

=> .bar {
width: 10px;
}

此功能目前处于粗糙状态,但将来会得到增强。

在 mixin 中混合 mixin

当然,mixin 可以利用其他 mixin,建立自己的选择器和属性。

例如,下面我们创建 comma-list() 来通过 inline-list() 内联并逗号分隔无序列表。

inline-list()
li
display inline

comma-list()
inline-list()
li
&:after
content ', '
&:last-child:after
content ''

ul
comma-list()

渲染:

ul li:after {
content: ", ";
}
ul li:last-child:after {
content: "";
}
ul li {
display: inline;
}