【发布时间】:2020-04-07 19:06:42
【问题描述】:
我正在构建一个可重用、可定制的组件。该组件有多个配置选项,每个选项都有多个值可供选择。
例如考虑这两个选项:
-
content-position:left,right,top,bottom,center, -
content-padding:small,medium,large。
棘手的部分是填充必须根据位置而不同。例如。当内容位置为left时,左边的内边距必须放大,右边的内边距必须缩小。
用 HTML 类来实现非常简单:
<MyComponent class="--content-position-left --content-padding-small"/>
.MyComponent__Content {
.MyComponent.--content-padding-small & {
padding: 50px;
}
.MyComponent.--content-padding-small.--content-position-left & {
padding-left: 75px;
padding-right: 25px
}
.MyComponent.--content-padding-medium & {
padding: 100px;
}
.MyComponent.--content-padding-medium.--content-position-left & {
padding-left: 150px;
padding-right: 50px;
}
}
当您可以通过 HTML 应用配置时,这非常有效。
但我想提供一种使用纯 Sass 配置此组件的方法,而无需应用 HTML 类。
应该可以这样做:
.Page__Products {
.MyComponent {
@include my-component--content-position("left");
@include my-component--content-padding("small");
}
}
如何让my-component--content-padding 知道哪个填充边应该更大(如果有的话)?
我看到了两个明显的解决方案:
-
将两个 mixin 合并为一个,并使其接受两个参数,例如:
@include my-component--content-position-and-padding("small", "left");我不喜欢这种方法。当有多个选项相互依赖时,它会变得非常混乱。 您最终会得到一个“上帝”mixin 来控制一切,而不是多个单一用途的 mixin。
-
保持 mixin 分开,但让每个 mixin 接受它需要的所有信息:
@include my-component--content-position("left"); @include my-component--content-padding("small", "left");这样更好,但我不喜欢冗余:你必须指定
"left"两次。
所以我想知道我是否可以执行以下操作,并且 padding mixin 会知道如何根据另一个 mixin 应用的位置来准确扭曲填充:
.Page__Products {
.MyComponent {
@include my-component--content-position("left");
@include my-component--content-padding("small");
}
}
这对于真正的编程语言来说是微不足道的,但 Sass 似乎还不够?
PS 我不希望 mixins 依赖于它们在全局变量中的应用顺序。
【问题讨论】:
-
我看到的唯一其他解决方案是创建第三个 mixin,它接受一个参数 (
$position),然后使用@if@else条件调用这两个带有正确参数的 mixin。不过,它有点类似于您的第一个解决方案。 -
选择器中存储位置的局部变量是否可以接受?所以你不必指定它两次。
-
@Arkellys 选择器中的局部变量?它与应用 HTML 类有何不同?
-
不,我的意思是使用您的解决方案 2,但不是两次写入
"left",而是将其存储在选择器内的变量中,然后将该变量用作您的 mixins 的参数。 -
好的,我明白了。是的,我会这样做,但这个问题的目标是减少 mixins 的足迹,减少它们的职责。
标签: css sass mixins scss-mixins