меньше матрицы циклов css

#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.