带索引的@each循环

ign*_*cci 60 each sass

我想知道你是否可以获得@each循环的元素索引.

我有以下代码,但我想知道$i变量是否是最好的方法.

当前代码:

$i: 0;
$refcolors: #55A46A, #9BD385, #D9EA79, #E4EE77, #F2E975, #F2D368, #F0AB55, #ED7943, #EA4E38, #E80D19;

@each $c in $refcolors {
    $i: $i + 1;
    #cr-#{$i} strong {
        background:$c;
    }   
}
Run Code Online (Sandbox Code Playgroud)

Wou*_*r J 97

首先,该@each功能不是来自Compass,而是来自Sass.


要回答你的问题,每个循环都无法做到这一点,但很容易将其转换为@for循环,这可以做到这一点:

@for $i from 1 through length($refcolors) {
    $c: nth($refcolors, $i);

    // ... do something fancy with $c
}
Run Code Online (Sandbox Code Playgroud)

  • imho,当使用`each`时,sass作者应该自动创建一个`$ idx`变量,该变量将用作索引.这非常有用. (14认同)

Jim*_*z28 55

要更新此答案:是的,您可以通过@each循环实现此目的:

$colors-list: #111 #222 #333 #444 #555;

@each $current-color in $colors-list {
    $i: index($colors-list, $current-color);
    .stuff-#{$i} { 
        color: $current-color;
    }
}
Run Code Online (Sandbox Code Playgroud)

资料来源:http://12devs.co.uk/articles/handy-advanced-sass/

  • 不幸的是,如果$ colors-list包含2个相同的值(例如#111,#222,#111,#333),这种方法就会中断.在这种情况下,索引($ colors-list,#111)将始终返回1,因此您的$ i值将显示为1,2,1,4.羞耻,否则它是一个非常简洁的方法:) (15认同)
  • 这也是1索引,而不是通用的0索引 (2认同)

nik*_*ong 14

有时您可能需要使用数组或地图.我有一个数组数组,即:

$list = (('sub1item1', 'sub1item2'), ('sub2item1', 'sub2item2'));
Run Code Online (Sandbox Code Playgroud)

我发现将它转换为对象是最简单的:

$list: (
    'name': 'thao',
    'age': 25,
    'gender': 'f'
);
Run Code Online (Sandbox Code Playgroud)

并使用以下内容获取$i:

@each $property, $value in $list {
    $i: index(($list), ($property $value));
Run Code Online (Sandbox Code Playgroud)

sass团队也推荐了以下内容,尽管我不是很喜欢:

[...]以上代码是我想解决这个问题的方法.通过添加范围($ n)等Sass函数可以提高效率.所以范围(10)=>(1,2,3,4,5,6,7,8,9,10).然后枚举可以成为:

@function enumerate($list-or-map) {
    @return zip($list-or-map, range(length($list-or-map));
}
Run Code Online (Sandbox Code Playgroud)

链接.