Estilizando componentes
React não tem um sistema de estilos próprio. Você escreve CSS comum, e JSX oferece duas formas de anexá-lo a um elemento: um nome de classe, que funciona na maioria dos casos, e uma prop style para os poucos valores que uma folha de estilos não consegue saber com antecedência. Este capítulo cobre ambos, junto com o padrão que fica entre eles: construir um nome de classe a partir de props ou estado, para que um elemento se restyle automaticamente quando seus dados mudam.
Nomes de classe em JSX
class é uma palavra reservada em JavaScript, então JSX nomeia o atributo className. O valor é uma string comum, e React a define como o atributo class do elemento no DOM, o que significa que o CSS do outro lado é escrito exatamente como sempre foi.
function Avatar() {
return <img className="avatar avatar--large" src={photo} alt="Brasília" />
}Dois nomes de classe em uma string, separados por um espaço, assim como em HTML. A regra de camelCase de JSX se aplica aos nomes dos atributos no seu markup; os nomes de classe em si são seus, então kebab-case, BEM ou qualquer convenção que sua folha de estilos já usa continua funcionando normalmente.
Importando uma folha de estilos
Um arquivo de componente puxa o CSS que precisa com um import simples no topo:
import './App.css'
export default function App() {
return <h1 className="title">React Facts</h1>
}Não há variável à esquerda desse import, e o componente nunca lê o arquivo. É uma instrução para a ferramenta de build: este módulo depende daquele CSS, então inclua-o. O Vite injeta as regras na página durante o desenvolvimento e emite um arquivo .css de verdade em um build de produção. Configurando um projeto React descreve o mesmo mecanismo que trata imagens.
Onde você coloca o import é uma questão de organização. Importar Button.css no topo de Button.jsx mantém os estilos junto do componente que os usa. As regras em si continuam globais: um seletor .title combina com todo elemento que tenha essa classe em qualquer lugar da página, não importa qual arquivo a tenha importado. Convenções de nomenclatura como BEM existem para manter esse namespace compartilhado gerenciável, e bibliotecas como CSS Modules e CSS-in-JS fazem o escopo das regras por você quando uma aplicação fica grande demais para contar apenas com disciplina de nomes.
Version note
React 19 added support for rendering <link rel="stylesheet"> and <style> from inside a component, with a precedence prop that lets React hoist them into the document head and order them predictably. Earlier versions needed a library such as react-helmet. The build-tool import above behaves the same way in every version.
Nomes de classe que dependem de dados
className fica dentro de chaves como qualquer outra expressão JSX, então a string pode ser computada. Imagine um jogo de dados onde cada dado pode ser retido entre lançamentos. Se um dado está retido fica no estado mais acima e chega aqui como uma prop:
function Die({ value, isHeld }) {
return (
<button className={`die ${isHeld ? 'die--held' : ''}`}>
{value}
</button>
)
}Todo dado recebe die. Um que está retido também recebe die--held. A folha de estilos contém as cores e bordas de verdade, e o único trabalho do componente é decidir qual classe se aplica. Quando isHeld muda, React atualiza o atributo de classe e o navegador repainta. Nada dentro do componente sabe como "retido" aparece, então essa aparência pode mudar sem que este arquivo mude de forma alguma.
Uma observação: quando isHeld é false, o template literal produz "die " com um espaço à direita. Os navegadores o ignoram, embora fique desajeitado no devtools. Um array funciona de forma mais limpa e funciona bem com mais de uma condição:
const classes = ['die', isHeld && 'die--held'].filter(Boolean).join(' ')
return <button className={classes}>{value}</button>isHeld && 'die--held' avalia para false quando a condição falha, filter(Boolean) remove isso, e join(' ') coloca um único espaço entre o que sobrou.
A prop style
A prop style recebe um objeto JavaScript. Os nomes das propriedades são as versões camelCase das do CSS, e as chaves duplas são o slot de expressão comum com um objeto literal dentro:
<div style={{ backgroundColor: 'darkslateblue', paddingTop: 12 }}>
Estilizado inline
</div>background-color vira backgroundColor e padding-top vira paddingTop. Os valores geralmente são strings. Passe um número simples e React acrescenta px para propriedades que aceitam comprimento, então paddingTop: 12 renderiza como padding-top: 12px. Propriedades que CSS trata como sem unidade mantêm o número bruto: lineHeight, opacity, flexGrow, zIndex e fontWeight passam direto. Qualquer outra unidade tem que ser escrita como string, como em width: '60%' ou margin: '2rem'.
A maioria dos estilos pertence a uma folha de estilos, onde uma classe pode carregar uma dúzia de declarações e ser compartilhada por uma dúzia de elementos. A prop style ganha seu lugar quando um valor é conhecido apenas em tempo de execução e CSS não tem forma de alcançá-lo:
function ProgressBar({ percent }) {
return (
<div className="progress">
<div className="progress__fill" style={{ width: `${percent}%` }} />
</div>
)
}A cor do preenchimento, altura, transição e raio de canto vivem em .progress__fill. O único valor que a folha de estilos não consegue saber é a largura, porque vem de dados, então esse valor vai inline. Uma imagem de fundo cuja URL chega de uma API tem a mesma forma:
<div className="hero" style={{ backgroundImage: `url(${photo.url})` }} />O tamanho, posicionamento e overlay ficam em .hero, e apenas a URL chega através da prop.
Estilos inline também têm um limite bem claro. Um objeto de style descreve as declarações de um único elemento, então não há jeito de expressar um estado de hover, uma media query ou uma animação keyframe nele. Esses pertencem a CSS não importa o quão dinâmico o resto da estilização fica.
className porque class é uma palavra reservada em JavaScript. Importe sua folha de estilos no topo do arquivo, coloque suas regras nela e deixe o componente decidir qual classe se aplica construindo a string a partir de props ou estado.
Guarde a prop style para valores que seu arquivo CSS não consegue saber com antecedência, como uma largura que vem de dados.
Próximo: Props, onde componentes começam a receber dados de seu pai.

