Содержание статьи

Интерполяция в SassScript используется для динамической подстановки значений в селекторы, имена свойств и строки. Она основана на конструкции #{ }, которая преобразует выражение Sass в корректный фрагмент CSS на этапе компиляции. Ошибки в синтаксисе интерполяции часто приводят не к явным сбоям, а к генерации некорректного CSS, что усложняет отладку.
В отличие от обычных переменных, интерполяция работает в контекстах, где Sass ожидает строку или идентификатор. Это касается имён классов, псевдоклассов, частей селекторов, а также значений свойств, сформированных из нескольких компонентов. Например, запись .icon-#{$name} корректна, тогда как попытка подставить переменную без интерполяции приведёт к ошибке компиляции.
Важно учитывать различия между интерполяцией в строках и вне строк. В двойных кавычках Sass допускает подстановку через #{ }, но при этом итоговое значение всегда будет строкой. В селекторах и именах свойств интерполяция влияет на структуру CSS-идентификатора, поэтому пробелы, спецсимволы и тип данных выражения имеют прямое значение.
Отдельного внимания требуют числа, единицы измерения и функции. Интерполяция не объединяет числа и единицы автоматически: выражения вроде #{$value}px допустимы, но требуют понимания, как Sass обрабатывает типы. Аналогично, при использовании интерполяции в миксинах и функциях важно различать вычисление выражений и простую подстановку текста.
Как работает интерполяция через #{ } в SassScript

Интерполяция через #{ } выполняется на этапе компиляции Sass и представляет собой подстановку результата выражения в текстовое представление CSS. Внутри фигурных скобок допускаются переменные, арифметические операции, вызовы функций и выражения SassScript. Итоговое значение всегда приводится к строке, после чего вставляется в исходный контекст без дополнительных преобразований.
Механизм интерполяции активируется только при наличии конструкции #{ }. Простая переменная без интерполяции не может использоваться в местах, где Sass ожидает идентификатор, например в имени класса или свойства. Запись .col-#{$size} компилируется корректно, тогда как .col-$size вызывает ошибку, так как переменная не была преобразована в текст.
Внутри #{ } выражение вычисляется полностью, включая операции с числами и цветами. Например, #{$width * 2} подставит уже рассчитанное значение. При этом тип данных после вычисления теряет семантику Sass и становится строкой, поэтому дальнейшие операции над результатом невозможны без повторного вычисления.
Контекст, в котором используется интерполяция, определяет допустимый результат. В селекторах и именах свойств недопустимы пробелы и служебные символы, поэтому выражения должны возвращать корректные идентификаторы. В значениях свойств интерполяция допускает более свободный формат, но объединение чисел и единиц измерения требует явного указания, например #{$gap}px.
Интерполяция не выполняет экранирование и не проверяет валидность итогового CSS. Если выражение возвращает некорректную строку, компилятор Sass не всегда сигнализирует об ошибке. По этой причине рекомендуется ограничивать интерполяцию простыми и предсказуемыми выражениями и избегать подстановки необработанных строковых значений.
Использование интерполяции в именах CSS-селекторов
Интерполяция в именах CSS-селекторов применяется для формирования динамических идентификаторов, которые невозможно описать с помощью обычных переменных Sass. Конструкция #{ } позволяет вставлять вычисленное значение непосредственно в селектор, формируя корректное имя класса, идентификатора или их часть.
Наиболее распространённый сценарий – генерация серий селекторов на основе переменных или циклов. При этом интерполяция используется только для тех фрагментов, которые должны быть преобразованы в текст:
- формирование имён классов с числовыми или строковыми суффиксами;
- создание селекторов с префиксами и модификаторами;
- динамическая подстановка значений в псевдоклассы и атрибуты.
Внутри селекторов интерполяция подставляет результат без проверки структуры. Это означает, что выражение должно возвращать допустимую часть CSS-идентификатора. Недопустимо использовать пробелы, кавычки и спецсимволы, если они не предусмотрены синтаксисом селектора.
Типичные корректные шаблоны использования интерполяции в селекторах:
- .btn-#{$type} – подстановка модификатора класса;
- #{$block}__item – формирование имени по методологии БЭМ;
- input[type=»#{$input-type}»] – подстановка значения атрибута.
Следует учитывать, что результат интерполяции всегда строковый. Если в выражении используется число, оно будет вставлено без единиц измерения. Для управления форматом имени селектора рекомендуется явно задавать строковые значения или приводить их к нужному виду заранее.
При работе с циклами и списками интерполяция должна применяться строго внутри селектора, а не вокруг него. Неправильное размещение #{ } может привести к объединению селекторов или появлению невалидных комбинаций, которые Sass скомпилирует без предупреждений.
Интерполяция переменных в значениях CSS-свойств

Интерполяция через #{ } позволяет подставлять переменные в значения CSS-свойств, когда требуется динамическое формирование строки или комбинирование нескольких выражений. Она особенно полезна для свойств, где ожидаются идентификаторы, URL, цветовые значения или составные размеры.
Примеры корректного использования интерполяции в свойствах:
- background-image: url(«#{$image-path}/icon.png»); – подстановка пути к файлу;
- border: #{$border-width}px solid #{$border-color}; – комбинирование числовых и цветовых переменных;
- font-family: «#{$font-primary}», sans-serif; – динамическая вставка имени шрифта.
При интерполяции чисел с единицами измерения важно указывать единицу явно: #{$width}px. Без указания единицы результат будет строкой без корректного CSS-формата и может быть проигнорирован браузером.
Интерполяция поддерживает вложенные выражения и функции Sass. Например, width: #{round($value / 2)}px; вычислит значение и подставит его в свойство. Это позволяет формировать сложные размеры без необходимости вручную конкатенировать строки.
Следует избегать подстановки необработанных значений, содержащих пробелы или недопустимые символы, так как это приведёт к некорректному CSS. Оптимальная практика – использовать интерполяцию только для тех частей свойства, которые точно формируют допустимое значение.
Применение интерполяции при формировании имён классов
Интерполяция через #{ } позволяет создавать динамические имена классов на основе переменных и вычисляемых выражений. Она особенно полезна при работе с повторяющимися элементами, модификаторами и компонентами по методологии БЭМ.
Типовые сценарии использования интерполяции в именах классов:
- .btn-#{$type} – формирование классов кнопок с различными типами, где $type может принимать значения primary, secondary и другие;
- .card-#{$size} – генерация классов карточек разного размера, например small, medium, large;
- .#{$block}__#{$element} – динамическое создание классов по БЭМ, где $block и $element задаются переменными.
Интерполяция преобразует переменные в строку, поэтому недопустимы пробелы и символы, которые не разрешены в CSS-идентификаторах. Если требуется включить несколько частей, их следует объединять внутри конструкции #{ } с явным форматированием: .icon-#{$state}-#{$size}.
При использовании циклов и списков интерполяция позволяет автоматически генерировать серию классов. Например, @each $color in $colors { .btn-#{$color} { background: $color; } } создаст набор кнопок для всех цветов из списка, экономя время и предотвращая дублирование кода.
Интерполяция внутри строк и отличие от обычных строк

Интерполяция через #{ } внутри строк позволяет вставлять переменные или выражения в текст без нарушения синтаксиса CSS. В отличие от обычных строк, где переменные не подставляются автоматически, интерполяция преобразует значение SassScript в строковое представление и вставляет его в нужное место.
Примеры использования интерполяции внутри строк:
- content: «Иконка: #{$icon-name}»; – вставка имени иконки в текстовое значение свойства content;
- font-family: «#{$font-primary}», sans-serif; – динамическая подстановка шрифта внутри строки;
- background-image: url(«images/#{$theme}/bg.png»); – формирование пути к файлу с переменной темой.
Обычные строки без #{ } воспринимаются Sass как буквальные значения, поэтому «#{$variable}» и «$variable» работают по-разному: первая форма подставляет значение, вторая – оставляет текстовую запись переменной.
При комбинировании нескольких переменных и текста рекомендуется использовать интерполяцию для каждой переменной или объединять их внутри одного выражения: «#{$prefix}-#{$name}». Это предотвращает ошибки компиляции и гарантирует корректный результат в CSS.
Важно помнить, что интерполяция внутри строк всегда возвращает строку, даже если внутри вычисляются числа или цвета. Для операций с числами или вычисления цветов необходимо производить вычисления до вставки в строку.
Ограничения интерполяции в числах и единицах измерения

Интерполяция через #{ } преобразует любое выражение в строку. При подстановке чисел и единиц измерения это приводит к особенностям, которые необходимо учитывать для корректного CSS. Число, подставленное без единицы, не интерпретируется как длина, а просто вставляется как текст.
Рекомендации по использованию интерполяции с числами:
- Всегда явно указывать единицы измерения: #{$width}px вместо #{$width};
- При вычислениях использовать интерполяцию только для финального значения: width: #{ $width * 2 }px;;
- Не использовать интерполяцию для операций между строками и числами без явного преобразования.
Примеры правильной и неправильной интерполяции:
| Выражение | Результат CSS | Комментарий |
|---|---|---|
| width: #{$width}px; | width: 100px; | Корректное подставление числа с единицей |
| width: #{$width}; | width: 100; | Некорректно для CSS, единица отсутствует |
| margin: #{ $top + $bottom }px; | margin: 30px; | Сумма чисел корректно вставляется с единицей |
| margin: #{$top}px #{$bottom}; | margin: 10px 20; | Вторая величина без единицы, CSS некорректен |
Для безопасного использования интерполяции с числами рекомендуется всегда комбинировать арифметику и единицы внутри конструкции #{ }, чтобы результат соответствовал требованиям CSS.
Интерполяция в функциях и миксинах Sass
Интерполяция через #{ } позволяет подставлять вычисленные значения переменных и выражений внутри функций и миксинов, создавая динамические правила CSS. Она используется для формирования селекторов, свойств или значений, которые зависят от параметров миксина или функции.
Примеры применения интерполяции в миксинах:
- @mixin button($type) { .btn-#{$type} { padding: 10px; } } – создаёт класс кнопки с динамическим суффиксом;
- @mixin spacing($size) { margin: #{ $size * 2 }px; } – вычисляет размер от параметра и вставляет результат в свойство;
- @mixin theme-color($theme) { color: #{$theme}-main; } – формирует цвет на основе строки параметра.
В функциях Sass интерполяция позволяет возвращать строковые значения, объединяя текст и вычисленные данные. Например, @function icon-path($name) { @return «icons/#{$name}.svg»; } формирует корректный путь к файлу для свойства background-image.
Важно учитывать, что результат интерполяции всегда строковый. Для использования в арифметических операциях необходимо предварительно выполнять вычисления. Также недопустимо вставлять в интерполяцию символы или пробелы, которые нарушают синтаксис CSS селектора или свойства.
Рекомендации при работе с миксинами и функциями:
- Применять интерполяцию только для тех частей, которые формируют идентификаторы или текстовые значения;
- Вычислять числа и единицы измерения отдельно, прежде чем вставлять в строку;
- Использовать интерполяцию для генерации повторяющихся правил и динамических имен классов, избегая ручного дублирования кода.
Типичные ошибки синтаксиса интерполяции и способы их исправления

Ошибки интерполяции в SassScript часто связаны с неправильным использованием конструкции #{ }, несоответствием типов данных и нарушением правил CSS. Их исправление требует точного понимания, как Sass преобразует выражения в строки.
Основные типы ошибок и методы исправления:
- Подстановка переменной без интерполяции: .btn-$type – Sass не распознаёт переменную в контексте селектора.
Исправление: .btn-#{$type}. - Недопустимые символы в идентификаторах: .icon-#{$name}! – CSS-идентификатор невалиден.
Исправление: использовать только буквы, цифры и дефисы .icon-#{$name}. - Числа без единиц измерения: width: #{$width}; – CSS неправильно интерпретирует значение.
Исправление: width: #{$width}px;. - Интерполяция внутри строки без конструкции #{ }: content: «$text»; – переменная подставляется как текст, а не её значение.
Исправление: content: «#{$text}»;. - Функции или миксины, возвращающие числа или цвета: color: #{$color-fn}; – вставляется строка вместо корректного значения.
Исправление: использовать интерполяцию только для текстовых значений или предварительно форматировать результат функции.
Практические рекомендации для предотвращения ошибок:
- Применять интерполяцию только для динамического формирования селекторов, классов или текстовых значений.
- Проверять тип данных перед вставкой и при необходимости преобразовывать в строку.
- Избегать пробелов и недопустимых символов внутри выражений, используемых в селекторах.
- Всегда явно указывать единицы измерения для числовых значений.
Вопрос-ответ:
В чём разница между обычной переменной и интерполяцией через #{ } в Sass?
Обычная переменная в Sass может использоваться только там, где допустим тип данных, например число, цвет или строка, без прямой вставки в идентификаторы CSS. Интерполяция через #{ } преобразует выражение в текст и подставляет его в место, где требуется строка, например в имя класса, селектор или составное значение свойства. Это позволяет динамически формировать CSS, который иначе было бы невозможно создать через обычные переменные.
Можно ли использовать интерполяцию с числами и единицами измерения?
Да, но есть нюансы. Интерполяция всегда возвращает строку, поэтому число без единицы измерения не станет валидным значением CSS. Например, #{$width} вернёт просто число, а не длину. Чтобы правильно подставить размер, нужно указать единицу явно: #{$width}px. Если выполняются арифметические операции, результат лучше сначала вычислить, а затем подставить через интерполяцию вместе с единицей.
Можно ли использовать интерполяцию внутри строки свойства content?
Да, это один из частых случаев использования. Внутри строки нужно обернуть переменную в #{ }, чтобы Sass подставил её значение, а не оставил текст как есть. Пример: content: «#{$icon-name}»; вставит значение переменной $icon-name в свойство, а content: «$icon-name»; оставит текст с именем переменной. Такой подход позволяет динамически формировать текстовые значения в CSS.
Как правильно использовать интерполяцию в миксинах и функциях?
В миксинах и функциях интерполяция применяется для подстановки значений параметров в селекторы, свойства или строки. Например, можно динамически создавать классы: @mixin btn($type) { .btn-#{$type} { padding: 10px; } }. В функциях интерполяция помогает возвращать строки, комбинируя текст и вычисленные значения: @function icon-path($name) { @return «icons/#{$name}.svg»; }. Важно помнить, что результат интерполяции всегда строковый, поэтому для операций с числами или цветами вычисления выполняются заранее.
Какие типичные ошибки возникают при использовании интерполяции?
Наиболее частые ошибки связаны с: 1) подстановкой переменной без #{ }, что вызывает ошибку компиляции в селекторах; 2) использованием недопустимых символов или пробелов внутри идентификаторов; 3) подстановкой чисел без единиц измерения; 4) вставкой значения функции или миксина, возвращающего число или цвет, без предварительного форматирования. Исправление заключается в правильном применении конструкции #{ }, проверке типа данных и явном указании единиц для чисел.
Можно ли комбинировать несколько переменных внутри одного селектора с помощью интерполяции?
Да, Sass позволяет объединять несколько переменных внутри конструкции #{ }, чтобы формировать составные селекторы. Например, запись .#{$block}-#{$element}-#{$modifier} создаст один селектор, объединяя значения трёх переменных. При этом важно, чтобы каждая переменная содержала только допустимые символы для CSS-идентификатора: буквы, цифры и дефисы. Пробелы или специальные символы могут сделать селектор невалидным, и Sass скомпилирует его без предупреждений, но браузер проигнорирует правило.
Как интерполяция влияет на подстановку числовых значений и единиц измерения в CSS-свойствах?
Интерполяция всегда возвращает строку, поэтому число без единицы измерения не будет валидным значением CSS. Например, width: #{$width}; подставит число как текст, и браузер не сможет его интерпретировать как длину. Чтобы результат был корректным, необходимо явно указать единицу: width: #{$width}px;. Если выполняются арифметические операции с числами, лучше сначала выполнить вычисление в Sass, а затем подставить результат через интерполяцию вместе с единицей измерения.
