Модули CSS позволяют оформлять стили компонента с локально ограниченной областью видимости.
Это предотвращает конфликты имён CSS-классов и упрощает поддержку ваших стилей.
Что такое модули CSS?
В React модули CSS представляют собой файлы CSS, в которых имена классов по умолчанию ограничиваются областью видимости конкретного компонента.
Файлы CSS должны иметь расширение .module.css и могут использоваться путём импорта в ваши файлы React-компонентов.
Создание модуля CSS
Давайте создадим модуль CSS под названием Button.module.css, в котором зададим оформление кнопок.
Пример
Создайте файл с именем Button.module.css и добавьте в него стили:
/* Button.module.css */
.mybutton {
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
Использование модуля CSS
Подключите и используйте модуль CSS в вашем компоненте:
Пример
Создаём компонент кнопки, использующий модуль CSS:
import styles from './Button.module.css';
function App() {
return (
<div>
<button className={styles.mybutton}>
Моя кнопка
</button>
</div>
);
}
Объяснение примера:
- Мы импортируем объект стилей из модуля CSS.
- Используем запись
styles.mybutton, чтобы применить классmybutton. - Реальное имя класса для кнопки будет уникальным (например,
_mybutton_q1obu_1).
Несколько классов одновременно
В предыдущем примере мы использовали лишь один класс, давайте теперь добавим ещё классы:
Пример
Дополните файл Button.module.css новыми стилями:
/* Button.module.css */
.mybutton {
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
.primary {
background-color: #007bff;
color: white;
}
.secondary {
background-color: #6c757d;
color: white;
}
Чтобы показать изменения, создадим две кнопки с двумя классами для каждой:
Пример
Компонент с двумя кнопками с разными стилями:
import styles from './Button.module.css';
function App() {
return (
<div>
<button className={`${styles.mybutton} ${styles.primary}`}>
Основная кнопка
</button>
<button className={`${styles.mybutton} ${styles.secondary}`}>
Второстепенная кнопка
</button>
</div>
);
}
Наследование классов
Модули CSS поддерживают объединение классов с помощью ключевого слова composes, позволяющего одному классу наследовать стили другого класса.
Например, в предыдущем примере оба класса primary и secondary зависят от стилей класса mybutton.
Эту зависимость можно определить добавив строку composes: mybutton в объявления обоих классов:
Пример
/* Button.module.css */
.mybutton {
padding: 10px 20px;
border: none;
border-radius: 4px;
cursor: pointer;
}
.primary {
composes: mybutton;
background-color: #007bff;
color: white;
}
.secondary {
composes: mybutton;
background-color: #6c757d;
color: white;
}
Теперь достаточно применить классы primary и secondary в компоненте:
Пример
import styles from './Button.module.css';
function App() {
return (
<div>
<button className={styles.primary}>
Первичная кнопка
</button>
<button className={styles.secondary}>
Вторичная кнопка
</button>
</div>
);
}
Глобальные классы
По умолчанию классы в файле .module.css доступны только в том компоненте, который их импортирует. Имя класса автоматически префиксируется уникальным идентификатором, что позволяет избежать конфликтов имён даже при одинаковых названиях классов в разных файлах.
Однако иногда возникает необходимость сделать классы доступными глобально, чтобы использовать их в других компонентах.
Это можно сделать с помощью конструкции :global:
Пример
Вот пример модуля CSS с глобальным классом .myheader:
/* BlueHeader.module.css */
:global(.myheader) {
padding: 10px 20px;
font-size: 50px;
color: white;
background-color: dodgerblue;
}
Конструкция :global() делает класс доступным для любого компонента.
Достаточно просто вызвать его напрямую как .myheader, без уникального префикса.
Использовать глобальные классы в компонентах можно следующим образом:
Пример
import styles from './BlueHeader.module.css';
function App() {
return (
<div>
<h1 className="myheader">
Мой заголовок
</h1>
</div>
);
}
Объединение глобальных и локальных классов
Также возможно комбинирование глобальных и локальных классов в одном модуле CSS:
Пример
CSS модуль с глобальным и локальным классами:
/* MyStyles.module.css */
:global(.myheader) {
padding: 10px 20px;
font-size: 50px;
color: white;
background-color: dodgerblue;
}
.myparagraph {
font-size: 20px;
color: white;
background-color: purple;
}
Применяем их в компонентах следующим образом:
Пример
import styles from './MyStyles.module.css';
function App() {
return (
<div>
<h1 className="myheader">
Заголовок
</h1>
<p className={styles.myparagraph}>
Параграф
</p>
</div>
);
}