#css #less
#css #Меньше
Вопрос:
У меня есть список строк как таковых в LESS: @flag-codes: "Albania" "al", "United States" "us", ...
; Я создал цикл в LESS, которого я достиг, используя:
.flag-classes(@flags; @index: 1) when (@index <= length(@flag-codes)) {
@flag: extract(@flags, @index);
@name: extract(@flag, 1);
@code: e(extract(@flag, 2));
// X Y
.flag-@{code} {
background-position: (24 * mod(@index, 8)) mod(@index, 16);
}
.flag-classes(@flags; (@index 1));
}
.flag-classes(@flag-codes);
Как вы можете видеть, я также пытаюсь сгенерировать background-position
свойство, которое будет иметь значения, основанные на индексе цикла, но только на x
оси.
Используемое изображение представляет собой PNG
спрайт, содержащий коллекцию спрайтов, организованных в матрицу (8 столбцов и 16 строк).
Мне удалось выяснить, как установить x
свойство, которое всегда будет иметь @index % 8
значение, но на y
оси оно должно начинаться с 1 до 16 и сохранять 1 в течение 8 раз (столько столбцов, сколько у нас есть) и после каждых 8 увеличиваться на единицу.
Возможно ли что-то, как описано выше, и если да, то как мне это сделать?
Ответ №1:
Это довольно просто:
.flag-@{code} {
@columns: 8;
@x: (24 * mod(@index, @columns));
@y: floor((@index / @columns 1));
background-position: @x @y;
}
Комментарии:
1. есть ли способ заставить индекс начинаться с 0 в вычислениях, но не в цикле?
2. На самом деле
@index - 1
сойдет 🙂3. Исправление:
@index - 1
подойдет дляx
оси, но наy
оси работает только доfirst row - 1
…4. Я намеренно добавил
1
y
, поскольку вы упомянули «ось y, она должна начинаться с 1 до 16». Если вам действительно нужно «от 0 до 15», тогда это просто будет@y: floor((@index / @columns));
5. это то, что я пробовал, но 8-й, 16-й и т.д. (8-е) уже получает следующее значение индекса, поэтому, например, 8-е число вместо того, чтобы по-прежнему быть 0, равно 1.