0 added
0 removed
Original
2026-01-01
Modified
2026-02-26
1
<p>Краеугольной темой препроцессора<em>SASS</em>являются циклы. Они позволяют многократно исполнять какие-либо последовательности действий. В<em>SASS</em>циклы зачастую позволяют генерировать множество классов, которые, впоследствии, можно использовать в проекте.</p>
1
<p>Краеугольной темой препроцессора<em>SASS</em>являются циклы. Они позволяют многократно исполнять какие-либо последовательности действий. В<em>SASS</em>циклы зачастую позволяют генерировать множество классов, которые, впоследствии, можно использовать в проекте.</p>
2
<p>Перед тем, как перейти непосредственно к написанию и пониманию циклов, введём основной пример, на котором мы и будем изучать все возможные типы циклов в препроцессоре<em>SASS</em>. Представим, что у нас есть список, внутри которого находится 5 элементов:<em>cat</em>,<em>dog</em>,<em>whale</em>,<em>bird</em>,<em>fish</em>. Для каждого из элементов списка нужно составить класс следующего вида:</p>
2
<p>Перед тем, как перейти непосредственно к написанию и пониманию циклов, введём основной пример, на котором мы и будем изучать все возможные типы циклов в препроцессоре<em>SASS</em>. Представим, что у нас есть список, внутри которого находится 5 элементов:<em>cat</em>,<em>dog</em>,<em>whale</em>,<em>bird</em>,<em>fish</em>. Для каждого из элементов списка нужно составить класс следующего вида:</p>
3
<p>Какими путями мы сейчас можем пойти? Первым, что приходит в голову, является использование миксинов. Это действительно хороший вариант, который полностью удовлетворяет нашим запросам:</p>
3
<p>Какими путями мы сейчас можем пойти? Первым, что приходит в голову, является использование миксинов. Это действительно хороший вариант, который полностью удовлетворяет нашим запросам:</p>
4
<p>Теперь, для генерации иконок нам надо выполнить данный миксин для каждого элемента списка. То есть пять раз:</p>
4
<p>Теперь, для генерации иконок нам надо выполнить данный миксин для каждого элемента списка. То есть пять раз:</p>
5
<p>Иконки готовы - вы великолепны! Можно откинуться на спинку стула и отдохнуть. Это приемлемый вариант, если иконок у нас пять. А что, если в проекте у нас 20 иконок? Или даже 100? Может вы создаете свою библиотеку с иконками. В таком случае использование метода, который представлен выше - не лучший путь. Он даст нужный результат, но количество строк, которые нужно будет скопировать, достаточно велико. Каким же образом можно облегчить себе жизнь? Для этого в<em>SASS</em>существуют циклы. И с одним из них мы познакомимся прямо сейчас!</p>
5
<p>Иконки готовы - вы великолепны! Можно откинуться на спинку стула и отдохнуть. Это приемлемый вариант, если иконок у нас пять. А что, если в проекте у нас 20 иконок? Или даже 100? Может вы создаете свою библиотеку с иконками. В таком случае использование метода, который представлен выше - не лучший путь. Он даст нужный результат, но количество строк, которые нужно будет скопировать, достаточно велико. Каким же образом можно облегчить себе жизнь? Для этого в<em>SASS</em>существуют циклы. И с одним из них мы познакомимся прямо сейчас!</p>
6
<h2>Цикл for</h2>
6
<h2>Цикл for</h2>
7
<p>Цикл for позволяет задать нам необходимое количество повторений. Это очень удобно, если мы изначально знаем, или можем вычислить необходимое количество повторений блока кода.</p>
7
<p>Цикл for позволяет задать нам необходимое количество повторений. Это очень удобно, если мы изначально знаем, или можем вычислить необходимое количество повторений блока кода.</p>
8
<p>Для записи такого цикла используется конструкция @for, у которой необходимо указать<strong>счётчик</strong>. Счётчик - простой механизм, в котором задаётся начальное и конечное значение. Каждый раз, исполнив блок кода, цикл вначале увеличивает счётчик на единицу, а потом проверяет, не вышло ли значение за границу. Если нет, то выполняем блок кода ещё раз. Каждый такой проход по блоку кода называется<strong>итерацией</strong></p>
8
<p>Для записи такого цикла используется конструкция @for, у которой необходимо указать<strong>счётчик</strong>. Счётчик - простой механизм, в котором задаётся начальное и конечное значение. Каждый раз, исполнив блок кода, цикл вначале увеличивает счётчик на единицу, а потом проверяет, не вышло ли значение за границу. Если нет, то выполняем блок кода ещё раз. Каждый такой проход по блоку кода называется<strong>итерацией</strong></p>
9
<p>Счётчик в цикле @for может быть записан одним из двух видов. Примеры ниже сделаны для счётчика от 1 до 5:</p>
9
<p>Счётчик в цикле @for может быть записан одним из двух видов. Примеры ниже сделаны для счётчика от 1 до 5:</p>
10
<ul><li>from 1 to 5. Счётчик с ключевым словом to считается до конечного числа,<strong>не включая конечное число</strong>. В данном варианте блок кода исполнится<strong>4 раза</strong>.</li>
10
<ul><li>from 1 to 5. Счётчик с ключевым словом to считается до конечного числа,<strong>не включая конечное число</strong>. В данном варианте блок кода исполнится<strong>4 раза</strong>.</li>
11
<li>from 1 through 5. Счётчик с ключевым словом through считается до конечного числа,<strong>включая конечное число</strong>. Цикл с таким счётчиком исполнит блок кода<strong>5 раз</strong>.</li>
11
<li>from 1 through 5. Счётчик с ключевым словом through считается до конечного числа,<strong>включая конечное число</strong>. Цикл с таким счётчиком исполнит блок кода<strong>5 раз</strong>.</li>
12
</ul><p>Все значения счётчика записываются в переменную, имя которой вы указываете сразу после ключевого слова @for. Полная запись цикла выглядит следующим образом:</p>
12
</ul><p>Все значения счётчика записываются в переменную, имя которой вы указываете сразу после ключевого слова @for. Полная запись цикла выглядит следующим образом:</p>
13
<p>Переменной, объявленной в качестве счётчика, можно пользоваться внутри цикла. В этом легко убедиться на следующем примере:</p>
13
<p>Переменной, объявленной в качестве счётчика, можно пользоваться внутри цикла. В этом легко убедиться на следующем примере:</p>
14
<p>Счётчик $i был использован для того, чтобы высчитать необходимую сторону квадрата. В результате компиляции получится следующий<em>CSS</em>код:</p>
14
<p>Счётчик $i был использован для того, чтобы высчитать необходимую сторону квадрата. В результате компиляции получится следующий<em>CSS</em>код:</p>
15
<p>Обратите внимание, что мы использовали to в условии счётчика, поэтому сгенерировалось 4 класса.</p>
15
<p>Обратите внимание, что мы использовали to в условии счётчика, поэтому сгенерировалось 4 класса.</p>
16
<p>Теперь решение первоначальной задачи становится немного проще. Можно воспользоваться циклом @for и сгенерировать классы столько раз, сколько нам это необходимо.</p>
16
<p>Теперь решение первоначальной задачи становится немного проще. Можно воспользоваться циклом @for и сгенерировать классы столько раз, сколько нам это необходимо.</p>
17
<p>Возможно, вы заметили проблему этого кода - необходимо чётко знать количество элементов в списке. И пока это число небольшое, то снова всё отлично. Но как только этих элементов станет к примеру<em>78</em>, то каждый раз пересчитывать их количество вручную, чтобы внести изменение в счётчик, не доставит вам большого удовольствия.</p>
17
<p>Возможно, вы заметили проблему этого кода - необходимо чётко знать количество элементов в списке. И пока это число небольшое, то снова всё отлично. Но как только этих элементов станет к примеру<em>78</em>, то каждый раз пересчитывать их количество вручную, чтобы внести изменение в счётчик, не доставит вам большого удовольствия.</p>
18
<p>Но есть способ отдать подсчёт самому<em>SASS</em>- можно воспользоваться функцией length() и получить количество элементов в списке. В таком случае наш код может выглядеть следующим образом:</p>
18
<p>Но есть способ отдать подсчёт самому<em>SASS</em>- можно воспользоваться функцией length() и получить количество элементов в списке. В таком случае наш код может выглядеть следующим образом:</p>
19
<h2>Цикл each</h2>
19
<h2>Цикл each</h2>
20
<p>Вторым способом решения задачи по генерации классов с иконками является цикл @each. Этот цикл<em>перебирает</em>значения списка или ассоциативного массива и для каждого значения выполняет блок кода. При использовании данного цикла нам не нужно знать размер списка и создавать счётчики. Мы работаем непосредственно с каждым значением.</p>
20
<p>Вторым способом решения задачи по генерации классов с иконками является цикл @each. Этот цикл<em>перебирает</em>значения списка или ассоциативного массива и для каждого значения выполняет блок кода. При использовании данного цикла нам не нужно знать размер списка и создавать счётчики. Мы работаем непосредственно с каждым значением.</p>
21
<p>Цикл @each идеально подходит именно для задачи генерации классов на основе какого-либо списка или ассоциативного массива. Для того, чтобы им воспользоваться, нужно использовать ключевое слово @each, после которого указывается переменная, в которой будет храниться текущее значение из списка. После этого указывается список, из которого эти значения берутся.</p>
21
<p>Цикл @each идеально подходит именно для задачи генерации классов на основе какого-либо списка или ассоциативного массива. Для того, чтобы им воспользоваться, нужно использовать ключевое слово @each, после которого указывается переменная, в которой будет храниться текущее значение из списка. После этого указывается список, из которого эти значения берутся.</p>
22
<p>Данный цикл можно прочитать следующим образом:<em>Для каждого числа в списке выполнить</em>и далее блок кода. Прекрасный способ обхода списка, при котором нам не нужно заводить отдельные переменные или обращаться к списку с помощью nth(), как было сделано в варианте с циклом @for.</p>
22
<p>Данный цикл можно прочитать следующим образом:<em>Для каждого числа в списке выполнить</em>и далее блок кода. Прекрасный способ обхода списка, при котором нам не нужно заводить отдельные переменные или обращаться к списку с помощью nth(), как было сделано в варианте с циклом @for.</p>
23
<p>Перенесём нашу задачу по генерации иконок, заменив цикл @for на цикл @each.</p>
23
<p>Перенесём нашу задачу по генерации иконок, заменив цикл @for на цикл @each.</p>
24
<p>Вот теперь по-настоящему хорошо. Мы использовали именно тот цикл, который нам был нужен и тем самым сократили количество строк и повысили читаемость.</p>
24
<p>Вот теперь по-настоящему хорошо. Мы использовали именно тот цикл, который нам был нужен и тем самым сократили количество строк и повысили читаемость.</p>
25
<p><strong>Совет:</strong>всегда обращайте внимание на то, какую операцию вы делаете. Если вам нужно просто выполнить блок кода определённое количество раз, то используйте цикл @for. При работе со списками/массивами и при использовании их значений используйте цикл @each. В большинстве случаев такое разделение поможет сделать ваш код чище</p>
25
<p><strong>Совет:</strong>всегда обращайте внимание на то, какую операцию вы делаете. Если вам нужно просто выполнить блок кода определённое количество раз, то используйте цикл @for. При работе со списками/массивами и при использовании их значений используйте цикл @each. В большинстве случаев такое разделение поможет сделать ваш код чище</p>
26
<p>В примере выше мы рассмотрели, как с помощью @each обойти списки, но с ассоциативными массивами всё немного иначе. Как вы помните, в отличие от списков, где просто происходит перечисление значений, ассоциативные массивы имеют пары<em>ключ-значение</em>. Цикл @each позволяет получать внутри блока кода и ключ, и значение. Для этого необходимо указать через запятую переменную для ключа и переменную для значения. В остальном принцип работы остаётся тем же.</p>
26
<p>В примере выше мы рассмотрели, как с помощью @each обойти списки, но с ассоциативными массивами всё немного иначе. Как вы помните, в отличие от списков, где просто происходит перечисление значений, ассоциативные массивы имеют пары<em>ключ-значение</em>. Цикл @each позволяет получать внутри блока кода и ключ, и значение. Для этого необходимо указать через запятую переменную для ключа и переменную для значения. В остальном принцип работы остаётся тем же.</p>
27
<p>В качестве примера возьмём более сложную структуру списка наших иконок и помимо названия в качестве ключа, они будут содержать так же и размер иконок в виде списка, которые есть в нашем проекте. В данном варианте мы объединим ассоциативный массив и список.</p>
27
<p>В качестве примера возьмём более сложную структуру списка наших иконок и помимо названия в качестве ключа, они будут содержать так же и размер иконок в виде списка, которые есть в нашем проекте. В данном варианте мы объединим ассоциативный массив и список.</p>
28
<p>После компиляции мы получим следующий<em>CSS</em>код для иконок с изображением кошки:</p>
28
<p>После компиляции мы получим следующий<em>CSS</em>код для иконок с изображением кошки:</p>
29
<p>Остальные классы будут сгенерированы по аналогии.</p>
29
<p>Остальные классы будут сгенерированы по аналогии.</p>
30
<p>В этом примере вы можете увидеть, что мы можем вкладывать циклы друг в друга. Причем эти циклы необязательно должны быть одного типа. Мы можем вложить @each внутри @for и наоборот. В каждом из этих случаев всё будет работать корректно. Главное, что переменные из внешнего цикла так же попадают и во внутренний. Именно поэтому внутри второго цикла @each можно было использовать переменную $icon, которая создается в цикле до этого.</p>
30
<p>В этом примере вы можете увидеть, что мы можем вкладывать циклы друг в друга. Причем эти циклы необязательно должны быть одного типа. Мы можем вложить @each внутри @for и наоборот. В каждом из этих случаев всё будет работать корректно. Главное, что переменные из внешнего цикла так же попадают и во внутренний. Именно поэтому внутри второго цикла @each можно было использовать переменную $icon, которая создается в цикле до этого.</p>
31
<p>Циклы часто совмещаются со списками и массивами. Например, на каждом шаге итерации обрабатывать список и изменять его. Представим, что нам нужно добавить единицу измерения к каждому элементу списка (10 15 20 25). Единица измерения задаётся в качестве аргумента функции add-unit.</p>
31
<p>Циклы часто совмещаются со списками и массивами. Например, на каждом шаге итерации обрабатывать список и изменять его. Представим, что нам нужно добавить единицу измерения к каждому элементу списка (10 15 20 25). Единица измерения задаётся в качестве аргумента функции add-unit.</p>
32
<p>Решение задачи требует знания работы со списками. Посмотрим на решение. Все функции вам уже известны, но не забудьте разобрать этот пример и попробовать изменить его, чтобы понять принцип работы:</p>
32
<p>Решение задачи требует знания работы со списками. Посмотрим на решение. Все функции вам уже известны, но не забудьте разобрать этот пример и попробовать изменить его, чтобы понять принцип работы:</p>
33
<h2>Цикл while</h2>
33
<h2>Цикл while</h2>
34
<p>Последним видом циклов, который существует в SASS, является цикл @while. Из его названия можно сделать вывод, что он работает по принципу<em>пока выполняется условие</em>.</p>
34
<p>Последним видом циклов, который существует в SASS, является цикл @while. Из его названия можно сделать вывод, что он работает по принципу<em>пока выполняется условие</em>.</p>
35
<p>Для цикла @while необходимо указать условие. Пока условие выполняется - цикл отрабатывается. В качестве условия выступают такие же конструкции, как и с условными конструкциями @if/@else.</p>
35
<p>Для цикла @while необходимо указать условие. Пока условие выполняется - цикл отрабатывается. В качестве условия выступают такие же конструкции, как и с условными конструкциями @if/@else.</p>
36
<p>После компиляции получится следующий<em>CSS</em>код:</p>
36
<p>После компиляции получится следующий<em>CSS</em>код:</p>
37
<p>Цикл @while сложен тем, что в нём очень просто забыть поработать с условием и уйти в бесконечный цикл. Если вы забудете указать $count: $count + 1;, то цикл не закончится никогда. Всегда следите за тем, чтобы условие менялось после каждого выполнения блока кода.</p>
37
<p>Цикл @while сложен тем, что в нём очень просто забыть поработать с условием и уйти в бесконечный цикл. Если вы забудете указать $count: $count + 1;, то цикл не закончится никогда. Всегда следите за тем, чтобы условие менялось после каждого выполнения блока кода.</p>