Estilizando componentes
React não possui sistema de estilo próprio. Você escreve CSS comum, e JSX oferece duas formas de anexá-lo a um elemento: um nome de classe, que cobre quase tudo, e uma prop style para os poucos valores que uma folha de estilo não consegue conhecer antecipadamente. 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 conforme seus dados mudam.
Nomes de classe em JSX
class é uma palavra reservada em JavaScript, então JSX chama o atributo de 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 do jeito que sempre foi.
function Avatar() {
return <img className="avatar avatar--large" src={photo} alt="Ada Lovelace" />
}Dois nomes de classe em uma string, separados por espaço, igual a HTML. A regra camelCase do JSX se aplica aos nomes de atributo na sua marcação; os nomes de classe em si são seus, então kebab-case, BEM, ou qualquer convenção que sua folha de estilo já use passa intacta.
Importando uma folha de estilo
Um arquivo de componente puxa o CSS que precisa com uma importação simples no topo:
import './App.css'
export default function App() {
return <h1 className="title">React Facts</h1>
}Não há variável à esquerda dessa importação, 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. Vite injeta as regras na página durante o desenvolvimento e emite um arquivo .css real em um build de produção. Configurando um projeto React descreve o mesmo mecanismo que lida com imagens.
Onde colocar a importação é uma questão de organização. Importar Button.css no topo de Button.jsx mantém os estilos perto do componente que os usa. As regras em si permanecem globais: um seletor .title corresponde a cada elemento com essa classe em qualquer lugar da página, seja qual for o arquivo que o importou. Convenções de nomenclatura como BEM existem para manter esse namespace compartilhado gerenciável, e CSS Modules e bibliotecas CSS-in-JS delimitam as regras para você uma vez que um app ultrapassa a disciplina de nomenclatura sozinha.
Nota de versão
React 19 adicionou suporte para renderizar <link rel="stylesheet"> e <style> de dentro de um componente, com uma prop precedence que deixa React elevá-los para o head do documento e ordená-los de forma previsível. Versões anteriores precisavam de uma biblioteca como react-helmet. A importação da ferramenta de build acima se comporta da mesma forma em todas as versões.
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. Pegue um jogo de dados onde cada dado pode ser retido entre lançamentos. Se um dado é retido vive em estado mais acima e chega aqui como uma prop:
function Die({ value, isHeld }) {
return (
<button className={`die ${isHeld ? 'die--held' : ''}`}>
{value}
</button>
)
}Cada dado recebe die. Um retido também recebe die--held. A folha de estilo guarda as cores e bordas reais, e o único trabalho do componente é decidir qual classe aplica. Quando isHeld muda, React atualiza o atributo de classe e o navegador redesenha. Nada dentro do componente sabe como "retido" parece, então essa aparência pode mudar sem este arquivo mudar de jeito nenhum.
Um detalhe: quando isHeld é false, o template literal produz "die " com um espaço à direita. Navegadores ignoram isso, embora pareça desorganizado no devtools. Um array lida com isso de forma mais limpa e escala além de uma condição:
const classes = ['die', isHeld && 'die--held'].filter(Boolean).join(' ')
return <button className={classes}>{value}</button>isHeld && 'die--held' avalia como false quando a condição falha, filter(Boolean) o remove, e join(' ') coloca um espaço único entre o que sobrevive.
A prop style
A prop style recebe um objeto JavaScript. Os nomes das propriedades são as versões camelCase das CSS, e as chaves duplas são o slot de expressão usual com um objeto literal dentro:
<div style={{ backgroundColor: 'darkslateblue', paddingTop: 12 }}>
Styled inline
</div>background-color vira backgroundColor e padding-top vira paddingTop. Valores são normalmente strings. Passe um número simples e React anexa px para propriedades que usam comprimento, então paddingTop: 12 renderiza como padding-top: 12px. Propriedades que CSS trata como sem unidade mantêm o número puro: lineHeight, opacity, flexGrow, zIndex e fontWeight todos passam direto. Qualquer outra unidade tem que ser escrita como string, como em width: '60%' ou margin: '2rem'.
A maioria do estilo pertence a uma folha de estilo, 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 como 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 tudo em .progress__fill. O único valor que a folha de estilo não consegue saber é a largura, porque vem de dados, então esse valor fica inline. Uma imagem de fundo cuja URL chega de uma API tem a mesma forma:
<div className="hero" style={{ backgroundImage: `url(${photo.url})` }} />O dimensionamento, posicionamento e sobreposição ficam em .hero, e apenas a URL vem pela prop.
Estilos inline também têm um limite duro. Um objeto de estilo descreve as declarações de um elemento, então não há forma de expressar um estado hover, uma media query, ou uma animação keyframe nele. Essas coisas pertencem ao CSS independentemente de quão dinâmico o resto do estilo fica.
className porque class é uma palavra reservada em JavaScript. Importe sua folha de estilo no topo do arquivo, coloque suas regras nela, e deixe o componente decidir qual classe aplica construindo a string a partir de props ou estado. Guarde a prop style para valores que seu arquivo CSS não consegue saber antecipadamente, como uma largura que vem de dados. Próximo: Props, onde componentes começam a pegar dados de seu pai.

