如果说有一种 CSS 简写方式非常缺乏,那就是同时定义 `position` 属性以及四个偏移属性(`top`、`right`、`bottom`、`left`)的简写方式。
幸运的是,这通常可以通过 CSS 预处理器(如 Sass)来解决。我们只需要构建一个简单的 mixin 就可以避免手动声明这 5 个属性。
/// Shorthand mixin for offset positioning
/// @param {String} $position - Either `relative`, `absolute` or `fixed`
/// @param {Length} $top [null] - Top offset
/// @param {Length} $right [null] - Right offset
/// @param {Length} $bottom [null] - Bottom offset
/// @param {Length} $left [null] - Left offset
@mixin position($position, $top: null, $right: null, $bottom: null, $left: null) {
position: $position;
top: $top;
right: $right;
bottom: $bottom;
left: $left;
}
现在的问题是,我们在使用此 mixin 时依赖于命名参数,以避免在只需要一两个参数时必须设置所有参数。请考虑以下代码
.foo {
@include position(absolute, $top: 1em, $left: 50%);
}
…它编译成
.foo {
position: absolute;
top: 1em;
left: 50%;
}
实际上,Sass 永远不会输出值为 `null` 的属性。
简化 API
我们可以将位置类型移动到 mixin 名称中,而不是将其定义为第一个参数。为此,我们需要另外三个 mixin 作为我们刚刚定义的 `position` mixin 的别名。
/// Shorthand mixin for absolute positioning
/// Serves as an alias for `position(absolute, ...)`
/// @param {Arglist} $args - Offsets
/// @require {mixin} position
@mixin absolute($args...) {
@include position(absolute, $args...);
}
/// Shorthand mixin for relative positioning
/// Serves as an alias for `position(relative, ...)`
/// @param {Arglist} $args - Offsets
/// @require {mixin} position
@mixin relative($args...) {
@include position(relative, $args...);
}
/// Shorthand mixin for fixed positioning
/// Serves as an alias for `position(fixed, ...)`
/// @param {Arglist} $args - Offsets
/// @require {mixin} position
@mixin fixed($args...) {
@include position(fixed, $args...);
}
重写我们之前的示例
.foo {
@include absolute($top: 1em, $left: 50%);
}
我们试图解决什么问题?按键次数?使用 Hayaku 或 Emmet.io。
可以通过输入
输出是纯 CSS,你只需 12 次纯按键即可完成,无需维护 mixin。
在我看来,mixin 的维护不是问题——因为它使你能够在未来更加灵活。
案例
可能会有一个新的 CSS 属性或类似的东西,与这种情况相关。
使用 mixin 时,你只需要将该行添加到 mixin 中,在某些情况下添加该 mixin 的实例
在我看来,上面肯定更容易找到所有使用某个 mixin 的位置,而不是追溯代码中所有未使用 mixin 而使用该技术的位置。
所以,实际上是一个维护优势——我想你总是可以使用 Emmet 或类似的东西,但这有点违背了 mixin 的目的。我同意我们不需要为所有事情都使用 mixin,并且我可以看到这个 mixin 对某些人来说可能过于简单,以至于不值得使用。但我也可以看到易用性对大多数人来说已经足够成为一个用例了 :)
哇,感谢你让我远离 Hayaku 或 Emmet.io!我是说真的,那个语法简直快接近正则表达式的疯狂了。
Larry……你不在文本编辑器中使用自动完成功能吗?真的吗?
那不是语法……而是一系列按键。你输入这些,然后得到纯 CSS
随意地,不要通过不使用 Chris 本人推荐的 Emmet 来节省时间