【问题标题】:Make two Sass mixins aware of each other: the output of one mixin should be different depending on how the other mixin was applied让两个 Sass mixin 相互了解:一个 mixin 的输出应该不同,具体取决于另一个 mixin 的应用方式
【发布时间】:2020-04-07 19:06:42
【问题描述】:

我正在构建一个可重用、可定制的组件。该组件有多个配置选项,每个选项都有多个值可供选择。

例如考虑这两个选项:

  • content-positionleftrighttopbottomcenter
  • content-paddingsmallmediumlarge

棘手的部分是填充必须根据位置而不同。例如。当内容位置为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 知道哪个填充边应该更大(如果有的话)?

我看到了两个明显的解决方案:

  1. 将两个 mixin 合并为一个,并使其接受两个参数,例如:

    @include my-component--content-position-and-padding("small", "left");
    

    我不喜欢这种方法。当有多个选项相互依赖时,它会变得非常混乱。 您最终会得到一个“上帝”mixin 来控制一切,而不是多个单一用途的 mixin。

  2. 保持 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


【解决方案1】:

常量:

$none: none;
$left: left;
$right: right;
$mediumPadding: 100px;
$mediumPaddingLeft: 100px 50px 100px 150px;
$mediumPaddingRight: 100px 150px 100px 50px;
$smallPadding: 50px;
$smallPaddingLeft: 50px 25px 50px 75px;
$smallPaddingRight: 50px 75px 50px 25px;

混合:

@mixin align-padding($align, $padding)
{
    float: $align;
    padding: $padding;
}

SCSS:

.what-you-want-to-hang-it-on
{
    @include align-padding($none, $mediumpadding);
}

【讨论】:

  • 您的答案中只有一个 mixin。 ?
  • 是的 @AndreyMikhaylov-lolmaus 这就是它的美妙之处,一个强大的 mixin,它取决于你如何应用它。 scss 示例只是您可以使用的组合之一。
  • 它与原问题中的“明显的解决方案编号 1”有何不同?
猜你喜欢
  • 1970-01-01
  • 2012-04-23
  • 1970-01-01
  • 2015-05-09
  • 1970-01-01
  • 2015-05-07
  • 1970-01-01
  • 2014-01-30
  • 2013-08-12
相关资源
最近更新 更多