2013-02-28 2 views
47

Мне было интересно, если вы можете получить индекс элемента для цикла @each.@each loop с индексом

У меня есть следующий код, но мне было интересно, является ли переменная $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; 
    } 
} 

ответ

70

Прежде всего, функция @each не от компаса, но от Sass.


Чтобы ответить на ваш вопрос, это не может быть сделано с помощью каждого цикла, но легко преобразовать это в @for цикл, который может это сделать:

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

    // ... do something fancy with $c 
} 
+0

Сладкое. Спасибо: D – ignacioricci

+9

imho, при использовании 'each' авторы sass должны автоматически создать переменную' $ idx', которая будет использоваться как индекс. это так полезно. – vsync

40

Чтобы обновить этот ответ: да вы можете добиться этого с петлей @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; 
    } 
} 

Источник: http://12devs.co.uk/articles/handy-advanced-sass/

+11

К сожалению, этот подход ломается, если $ colors-list содержит 2 одинаковых значения (например, # 111, # 222, # 111, # 333). В этом случае индекс ($ colors-list, # 111) всегда будет возвращать 1, поэтому ваши значения $ i появятся как 1, 2, 1, 4. Позор, поскольку в противном случае это очень аккуратный подход :) – Joel

+1

Это также 1 -индекс вместо общего 0-индекса –

4

Иногда вам может понадобиться использовать массив или карту. У меня был массив массивов, то есть:

$list = (('sub1item1', 'sub1item2'), ('sub2item1', 'sub2item2')); 

Я обнаружил, что это было легче просто преобразовать его в объект:

$list: (
    'name': 'thao', 
    'age': 25, 
    'gender': 'f' 
); 

И использовать следующую команду, чтобы получить $i:

@each $property, $value in $list { 
    $i: index(($list), ($property $value)); 

Команда sass также рекомендовала следующее, хотя я не очень люблю вентилятор:

[...] Вышеприведенный код - это то, как я хотел бы обратиться к этому вопросу. Это можно сделать более эффективным, добавив функцию Sass как диапазон ($ n). Таким образом, диапазон (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)); 
} 

link.

Смежные вопросы