Styled-components — популярная библиотека для CSS-in-JS в React. Позволяет описывать стили компонент прямо в JS-коде с помощью tagged template literals, делает стили изолированными и более удобными для масштабирования.
npm install styled-components
или
yarn add styled-components
import styled from 'styled-components';
const Button = styled.button`
background: palevioletred;
color: white;
font-size: 1em;
border-radius: 5px;
border: none;
padding: 0.5em 1em;
`;
function App() {
return <Button>Click me</Button>;
}
- Создаём компонент с помощью
styled.тег
. - Внутри косых кавычек — обычный CSS.
Передавайте пропсы в компонент, чтобы динамически менять стили:
const Button = styled.button`
background: ${props => props.primary ? "palevioletred" : "white"};
color: ${props => props.primary ? "white" : "palevioletred"};
`;
<Button primary>Primary</Button>
<Button>Default</Button>
Новый компонент может наследовать стили другого:
const TomatoButton = styled(Button)`
background: tomato;
color: white;
`;
Работают привычно, как в Sass:
const Wrapper = styled.section`
padding: 4em;
background: papayawhip;
&:hover {
background: peachpuff;
}
h1 {
color: palevioletred;
}
`;
Для глобальных (reset, базовые темы):
import { createGlobalStyle } from 'styled-components';
const GlobalStyle = createGlobalStyle`
body {
background: #eee;
margin: 0;
font-family: 'Roboto', sans-serif;
}
`;
function App() {
return (
<>
<GlobalStyle />
<MainApp />
</>
);
}
Создайте объект темы и используйте провайдер:
import { ThemeProvider } from 'styled-components';
const theme = {
primary: "#6200ee",
};
const Button = styled.button`
background: ${props => props.theme.primary};
`;
function App() {
return (
<ThemeProvider theme={theme}>
<Button>Theme button</Button>
</ThemeProvider>
);
}
Можно передать свой компонент и обернуть его:
function Custom({ className }) {
return <div className={className}>Custom content</div>;
}
const StyledCustom = styled(Custom)`
color: orangered;
font-weight: bold;
`;
Можно использовать keyframes:
import styled, { keyframes } from 'styled-components';
const rotate = keyframes`
from { transform: rotate(0deg); }
to { transform: rotate(360deg); }
`;
const Rotating = styled.div`
animation: ${rotate} 2s linear infinite;
`;
- Структурируйте компоненты по принципу “один компонент — один стиль”.
- Используйте props для модификаций, ThemeProvider для тем.
- Не создавайте слишком сложные вложенные селекторы: поддерживайте стили читаемыми.
- styled-components изолирует стили по уникальному classname.
- Стили можно наследовать, переопределять и комбинировать с обычным CSS.
- Можно легко интегрировать с TypeScript, глобальными темами и SSR-рендерингом.
- Все возможности CSS (в том числе медиазапросы, анимации, псевдоэлементы) поддерживаются напрямую.
Все описанное поддерживается и в других современных библиотечных подходах к CSS-in-JS, но styled-components максимально дружелюбен к React-разработчику.
P.S.: Для быстрого старта ориентируйтесь на структуру:
import styled from 'styled-components';
const MyStyledComp = styled.тег
...
И используйте все привычные CSS-правила прямо в JS!