Будь аккуратен с inline-стилями: почему это плохая практика?
Когда нужно быстро покрасить кнопку или отступ подвинуть, рука сама тянется к style={{ ... }}
.
Но inline-стили — это как фастфуд: быстро, удобно, но вредно для здоровья проекта.
Inline-стили не поддерживают базовые возможности CSS:
:hover
, :focus
, :active
)<button style={{ color: 'red' }}>Не будет работать :hover без CSS!</button>
::before
, ::after
)@media
)@keyframes
)var(--color-primary)
)🙅♂️ Эти ограничения делают inline-стили бесполезными для адаптивного дизайна и сложных интерфейсов.
Inline-стили встраиваются в DOM напрямую. Это значит:
Стили — это визуальное оформление. Логика — это поведение.
Inline-стили мешают их разделить:
// плохо
<div style={{ padding: 10, backgroundColor: 'blue' }}>Контент</div>
// хорошо
<div className="box">Контент</div>
CSS работает по каскадному принципу. Inline-стили имеют наивысший приоритет, их сложно переопределить:
.button {
color: green; /* не переопределит style={{ color: 'red' }} */
}
🙃 Это усложняет работу с компонентами и делает их «неподатливыми». Потом часами смотрим, где летит верстка в проекте. Разбираемся в бесконечно ленте стилей и ищем, где переопределяется стиль итд.
Когда стили внутри компонента:
Например, стили на :hover
или :focus
не задаются inline — и приходится городить useState/useEffect и писать костыли:
const [hover, setHover] = useState(false);
<button
style={{ color: hover ? 'red' : 'black' }}
onMouseEnter={() => setHover(true)}
onMouseLeave={() => setHover(false)}
>
Наведи мышку
</button>;
👎 Вместо одной строки CSS — целый мини-хак.
Иногда всё же можно:
width: ${progress}%
)Inline-стили — это не зло. Но:
📌 Используйте CSS-модули, Emotion, Styled Components — что угодно, но не пихайте всё в style={{…}}. «Inline-стили — как фастфуд: быстро, но не полезно для долгосрочного здоровья проекта» 🍔🚫.