【问题标题】:SASS & list iteration / delimiterSASS & 列表迭代/定界符
【发布时间】:2014-01-18 03:12:40
【问题描述】:

作为一个基本示例,我有一个模式,可以创建一个列表进行迭代:

$carouselContent : "carousel-content-1" "buying_carousel_image_1.jpg", 
                   "carousel-content-2" "buying_carousel_image_2.jpg";

我的迭代(在 mixin 内部)看起来像:

@each $carousel in $carouselContent {
  $baseClass: nth($carousel, 1);
  $image: nth($carousel, 2);
  .#{$baseClass} {
     ....
  }
}

我刚刚看到一个页面,该页面目前在轮播中只有 1 个项目。我想保持这种模式,但我不知道该怎么做。如果我迭代:

$carouselContent : "carousel-content-1" "growing_carousel_image_1.jpg";

SASS 将其视为 2 项列表。我可以通过在我的列表中添加一个空项目,然后添加一个空字符串检查来解决这个问题,例如

$carouselContent : "carousel-content-1" "growing_carousel_image_1.jpg","" "";

但这似乎很老套...所以我认为必须有一种我不知道的方法来做到这一点。

【问题讨论】:

  • 你的班级名字真的是这样编号的吗?还是只是一个简化的例子?
  • 很遗憾,是的。我继承了这个项目,在第二阶段有 4 周的交付时间,尽管已经重构了大部分,但还没有重构轮播。这甚至与我遇到的最糟糕的一组类名还差得很远(例如#box-green { color: #699f11; } .finances #box-green { color #9370b1; } ... #9370b1 是紫色的... SMH

标签: sass


【解决方案1】:

在 Sass 3.3.0 中,您需要做的就是在结尾添加一个逗号,以表示您所拥有的是一个包含一个项目的列表:

$carouselContent : "carousel-content-1" "buying_carousel_image_1.jpg", ;

@each $carousel in $carouselContent {
  $baseClass: nth($carousel, 1);
  $image: nth($carousel, 2);
  .#{$baseClass} {
     color: red;
  }
}

生成:

.carousel-content-1 {
  color: red;
}

Sass 3.3.0 仍在开发中,但您现在可以通过gem install sass --pre 升级到最新的边缘版本来使用它。但是,如果您愿意升级到 3.3,则可能需要查看映射(请参阅:the change log

【讨论】:

  • 是的,我还不能使用 3.3.0,很遗憾。
【解决方案2】:

您可以使用@if 指令来检查列表的第一个元素是否也是带有type-of() 的列表(然后才使用循环)。沿着这些思路(我将块与循环内部分开作为mixin):

@mixin do_car($carousel) {
  $baseClass: nth($carousel, 1);
  $image: nth($carousel, 2);
  .#{$baseClass} {
    /* ... */
  }
}

@if (type-of(nth($carouselContent,1)) == list) {
  @each $carousel in $carouselContent {
    @include do_car($carousel);
  }
} @else {
  @include do_car($carouselContent);
}

DEMO

【讨论】:

  • 这很好用。实际上,我将 if 条件移动到一个 mixin 中,然后称为“私有/内部”mixin,因为我在十几个不同的 SCSS 文件中执行此操作。谢谢马丁。
【解决方案3】:

如果您的项目按顺序编号,则可以使用 for 循环:

$carouselImages: 2;
@for $i from 1 through $carouselImages {
  .#{carousel-content-#{$i}} {
     background: url(buying_carousel_image_#{$i}.jpg);
  }
}

输出:

.carousel-content-1 {
  background: url(buying_carousel_image_1.jpg);
}

.carousel-content-2 {
  background: url(buying_carousel_image_2.jpg);
}

交替:

//$carouselContent : "buying_carousel_image_1.jpg", "buying_carousel_image_2.jpg";
$carouselContent : "buying_carousel_image_1.jpg";

@for $i from 1 through length($carouselContent) {
  .#{carousel-content-#{$i}} {
     background: url(nth($carouselContent, $i));
  }
}

【讨论】:

  • 类名是连续的,但是背景图片的名字非常不一致(我们有 3 个不同的人切出图片,都使用不同的命名约定)。第一阶段的人没有被要求进行第二阶段是有原因的……不过想法很好。
  • 其实还是可以的。我添加了一个替代解决方案,它允许您将顺序类名与您想要的任何随机文件名配对。
  • 我不确定如何区分 @each@for 至于正确答案是什么(因为我可以在带有索引的 @each 循环中做同样的事情),但这确实有效。
  • 两者都会给出相同的结果。我希望 for/nth 比 each/index 执行得更快,仅仅是因为跳转到特定索引比使用其他语言搜索要快。
猜你喜欢
  • 2019-04-20
  • 2016-10-19
  • 1970-01-01
  • 2015-12-29
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 2019-07-05
相关资源
最近更新 更多