CSS-в-JS — это техника стилизации, при которой вы можете писать CSS непосредственно в своем коде JavaScript.
Этот подход позволяет:
- Писать CSS с использованием JavaScript
- Создавать стили, привязанные к компонентам
- Применять динамические стили на основе пропсов
- Избегать конфликтов имён CSS-классов
styled-components.
Начало работы
CSS-в-JS не входит в основную библиотеку React, но может быть установлен с помощью многих инструментов сборки React, таких как Vite, Webpack или Create React App.
Чтобы установить styled-components, выполните следующую команду:
npm install styled-components
Теперь вы можете писать CSS прямо в своих файлах .jsx:
Пример
Вставьте стили непосредственно в файл .jsx:
import styled from 'styled-components';
const MyHeader = styled.h1`
padding: 10px 20px;
background-color: #007bff;
color: white;
`;
function App() {
return (
<>
<MyHeader>Добро пожаловать!</MyHeader>
</>
);
}
Без CSS-в-JS вам пришлось бы:
- Писать CSS в отдельном файле
.cssи импортировать его в ваши компоненты React, либо - Использовать встроенные стили
Обратите внимание, что:
- Мы используем объект
styledдля создания компонентов - Стили написаны внутри шаблонных строк (обратные апострофы)
- Вы можете использовать обычный синтаксис CSS
Пропсы в CSS-в-JS
Еще одна мощная особенность CSS-в-JS — возможность использовать пропсы для создания динамических стилей.
Давайте создадим пример, в котором у нас есть две кнопки, одна первичная и одна вторичная.
Мы хотим задать фоновый цвет каждой кнопки на основании значения пропса btntype:
Пример
import styled from 'styled-components';
const Button = styled.button`
padding: 10px 20px;
border: none;
border-radius: 4px;
background-color: ${props => props.btntype === 'primary' ? '#007bff' : '#6c757d'};
color: white;
cursor: pointer;
`;
function App() {
return (
<div>
<Button btntype="primary">Первичная кнопка</Button><br /><br />
<Button>Вторичная кнопка</Button>
</div>
);
}
Расширение стилей
Другой способ заставить несколько элементов иметь одинаковые стили — расширить существующие компоненты с использованием styled-components.
Например, мы можем создать PrimaryButton и SuccessButton, которые имеют тот же базовый стиль, что и стандартный компонент Button, но разные цвета фона:
Пример
import styled from 'styled-components';
const Button = styled.button`
padding: 10px 20px;
border: none;
border-radius: 4px;
color: white;
cursor: pointer;
`;
const PrimaryButton = styled(Button)`
background-color: #007bff;
`;
const SuccessButton = styled(Button)`
background-color: #28a745;
`;
function App() {
return (
<div>
<PrimaryButton>Основная</PrimaryButton>
<SuccessButton>Успех</SuccessButton>
</div>
);
}
Стили, привязанные к компонентам
Так же, как и в модулях CSS, стили, созданные с помощью CSS-в-JS, относятся только к компоненту, в котором они определены.
Они получают уникальные имена и могут быть использованы только в компоненте, который их импортирует.
Если посмотреть исходный код страницы в приведённом выше примере, кнопки будут иметь уникальные имена классов, такие как bSOFjJ и pkxvl, ссылающиеся на соответствующие CSS-классы в секции стилей.

Глобальные стили
Вы также можете создавать глобальные стили, доступные для всех компонентов:
Пример
import { createGlobalStyle } from 'styled-components';
const GlobalStyle = createGlobalStyle`
h1 {
color: white;
background-color: purple;
font-family: Arial, sans-serif;
}
.myparagraph {
font-family: Courier, monospace;
color: blue;
}
`;
function App() {
return (
<>
<GlobalStyle />
<h1>Добро пожаловать!</h1>
<p className="myparagraph">Этот параграф оформлен с помощью глобальных стилей.</p>
</>
);
}
Если просмотреть исходный код результата в приведенном выше примере, CSS будет иметь обычные имена классов и будет доступен для всех компонентов.
