← Назад к вопросам
Для чего нужно написание CSS класса через амперсанд в Saas?
2.3 Middle🔥 181 комментариев
#HTML и CSS#Оптимизация и производительность
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI2 апр. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Для чего нужно написание CSS класса через амперсанд в Saas?
Амперсанд (&) в SCSS — это селектор родителя, который позволяет избежать повторения полного селектора и создавать вложенные правила. Это инструмент для DRY кода и лучшей организации стилей.
Основное использование: вложенные селекторы
Без амперсанда (много повторений):
.button {
padding: 10px 20px;
background: blue;
color: white;
}
.button:hover {
background: darkblue;
}
.button:active {
background: navy;
}
.button.primary {
background: green;
}
.button.disabled {
opacity: 0.5;
}
С амперсандом в SCSS (DRY):
.button {
padding: 10px 20px;
background: blue;
color: white;
&:hover {
background: darkblue;
}
&:active {
background: navy;
}
&.primary {
background: green;
}
&.disabled {
opacity: 0.5;
}
}
Амперсанд заменяется на родительский селектор (.button).
Использование с модификаторами БЭМ
SCSS с модификаторами (рекомендуется):
.card {
padding: 20px;
border: 1px solid #ddd;
border-radius: 8px;
&__header {
font-size: 20px;
font-weight: bold;
}
&__body {
margin: 15px 0;
}
&__footer {
color: #666;
}
&--primary {
background: #f0f8ff;
}
&--error {
border-color: red;
background: #ffe0e0;
}
&--disabled {
opacity: 0.5;
cursor: not-allowed;
}
}
Компилируется в:
.card { ... }
.card__header { ... }
.card__body { ... }
.card__footer { ... }
.card--primary { ... }
.card--error { ... }
.card--disabled { ... }
Вложенные селекторы для дочерних элементов
.navbar {
display: flex;
background: #333;
& > li {
color: white;
padding: 10px;
&:hover {
background: #555;
}
}
& a {
text-decoration: none;
color: white;
&:visited {
color: #ccc;
}
}
}
Компилируется в:
.navbar { ... }
.navbar > li { ... }
.navbar > li:hover { ... }
.navbar a { ... }
.navbar a:visited { ... }
Несколько амперсандов для сложных селекторов
Комбинирование амперсандов:
.btn {
padding: 10px;
border: none;
cursor: pointer;
&:hover {
background: #eee;
& svg {
transform: scale(1.1);
}
}
&:disabled,
&.disabled {
opacity: 0.5;
cursor: not-allowed;
}
& + & {
margin-left: 10px;
}
}
Амперсанд в конце селектора (контекстные стили)
Применение класса родителя к потомкам:
.form-field {
margin-bottom: 15px;
.form-compact & {
margin-bottom: 8px;
}
.form-large & {
margin-bottom: 20px;
}
}
Компилируется в:
.form-field {
margin-bottom: 15px;
}
.form-compact .form-field {
margin-bottom: 8px;
}
.form-large .form-field {
margin-bottom: 20px;
}
Полезно для изменения стилей в зависимости от контекста.
Практический пример: компонент Input
.input {
padding: 10px;
border: 1px solid #ccc;
border-radius: 4px;
font-size: 16px;
transition: all 0.3s;
// Состояния
&:focus {
outline: none;
border-color: #0066cc;
box-shadow: 0 0 0 3px rgba(0, 102, 204, 0.1);
}
&:disabled {
background: #f5f5f5;
color: #999;
cursor: not-allowed;
}
// Модификаторы размера
&--small {
padding: 6px 10px;
font-size: 12px;
}
&--large {
padding: 14px 16px;
font-size: 18px;
}
// Модификаторы ошибки
&--error {
border-color: #d32f2f;
&:focus {
box-shadow: 0 0 0 3px rgba(211, 47, 47, 0.1);
}
}
// Значок справа
& + .input-icon {
margin-left: -30px;
pointer-events: none;
}
}
Переменные в селекторах с амперсандом
$button-states: (
'primary': #007bff,
'success': #28a745,
'danger': #dc3545,
'warning': #ffc107
);
.btn {
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
transition: all 0.2s;
@each $state, $color in $button-states {
&--#{$state} {
background: $color;
color: white;
&:hover {
background: darken($color, 10%);
}
&:active {
background: darken($color, 20%);
}
}
}
}
Частая ошибка: забывчивость амперсанда
// НЕПРАВИЛЬНО: создаёт новый селектор вместо вложенного
.card {
padding: 20px;
:hover { // это не &:hover!
background: #eee;
}
}
// Компилируется в:
// .card { ... }
// .card :hover { ... } <- это ВСЕ :hover элементы внутри .card
// ПРАВИЛЬНО:
.card {
padding: 20px;
&:hover { // с амперсандом
background: #eee;
}
}
// Компилируется в:
// .card { ... }
// .card:hover { ... } <- селектор самого card
Амперсанд в современном Tailwind CSS
В Tailwind используется @apply с амперсандом:
@layer components {
.btn {
@apply px-4 py-2 rounded-lg font-semibold transition-all;
&:hover {
@apply shadow-lg;
}
&:active {
@apply scale-95;
}
&.primary {
@apply bg-blue-600 text-white;
&:hover {
@apply bg-blue-700;
}
}
}
}
Ключевые выводы
- Амперсанд (&) заменяет селектор родителя — избегаешь повторений
- Используй & для :hover, :active, :focus — вложи в компонент
- Модификаторы БЭМ с & — разделяй вариации компонента
- Контекстные стили — амперсанд в конце селектора
- DRY код — одна логика в одном месте, легче поддерживать
Правильное использование амперсанда создаёт чистый, структурированный и поддерживаемый SCSS код.