O que o overflow faz
Quando o conteúdo é maior que a caixa (uma altura fixa, uma palavra longa, uma tabela larga), ele transborda. A propriedade overflow decide o que acontece com o excesso:
| Valor | O que você vê | Contêiner de rolagem |
|---|---|---|
visible (padrão) | O conteúdo vaza da caixa e fica por cima do que vem depois | Não |
hidden | Cortado na borda do padding, sem barras de rolagem (script ainda consegue rolar) | Sim |
clip | Cortado, e sem rolagem nenhuma, nem por script | Não |
scroll | Sempre mostra barras de rolagem, mesmo que o conteúdo caiba | Sim |
auto | Barras de rolagem só quando o conteúdo não cabe | Sim |
No macOS e nos celulares, as barras de rolagem ficam por cima do conteúdo e somem, então scroll e auto podem parecer iguais até você rolar.
Criar uma caixa com rolagem
Uma caixa só transborda se algo limita o tamanho dela. Um height ou max-height, mais overflow-y: auto, transforma uma lista longa em um painel com rolagem:
max-height é melhor que height aqui: uma lista curta continua curta, e só uma lista longa rola. Uma região com rolagem sem nenhum conteúdo focável dentro deve receber tabindex="0", para que quem usa teclado também consiga rolá-la.
overflow-x e overflow-y
Os dois eixos podem ser definidos separadamente. O uso comum é uma tabela larga que rola para o lado dentro do contêiner, em vez de alargar a página inteira:
Uma regra para lembrar: se um eixo é hidden, scroll ou auto, um valor visible no outro eixo vira auto. Então overflow-x: hidden sozinho pode criar uma barra de rolagem vertical inesperada. overflow-x: clip não tem esse efeito:
.a { overflow-x: hidden; } /* overflow-y computes to auto */
.b { overflow-x: clip; } /* overflow-y stays visible */
Cortar texto com reticências
text-overflow: ellipsis troca o fim cortado de uma linha por "…". Ele precisa de três coisas juntas: uma largura limitada, um texto que não pode quebrar linha e o overflow escondido:
O line clamp com prefixo -webkit- funciona no Chrome, no Firefox e no Safari. Os leitores de tela continuam lendo o texto completo, então as palavras cortadas não se perdem para eles.
Efeitos colaterais do overflow
Definir overflow com qualquer valor que não seja visible ou clip muda mais do que o corte:
- Ele contém floats e as margens dos filhos. O elemento forma um novo contexto de formatação de bloco, então cresce para envolver filhos com float.
display: flow-rootfaz o mesmo sem cortar nada. - Ele quebra o
position: stickyabaixo dele. Um filho sticky gruda no contêiner de rolagem mais próximo; se esse contêiner não rola, nada gruda. - Ele corta filhos com posição absoluta (quando o elemento que transborda também é o bloco que os contém), incluindo dropdowns e tooltips, e corta também as sombras dos filhos.
Esconder a barra de rolagem
Você pode manter uma caixa com rolagem e esconder a barra com scrollbar-width: none. Use com moderação: sem a barra, muitos leitores não percebem que existe mais conteúdo. scrollbar-gutter: stable faz o contrário: reserva o espaço da barra para o conteúdo não se deslocar quando uma barra aparece.
Erros comuns
- Esperar overflow sem limite de tamanho. Uma caixa sem
heightoumax-heightcresce em vez de transbordar. overflow: hiddennobodypara "consertar" a rolagem horizontal. Encontre o elemento largo demais (muitas vezes umwidthfixo, uma URL longa ou um100vwcom barra de rolagem).- Reticências sem
white-space: nowrap. O texto quebra linha, então nada transborda na horizontal e nenhuma reticência aparece. overflow-x: hiddencriando uma barra de rolagem vertical. Useclip.- Um dropdown cortado pelo card. O
overflow: hiddendo card o corta; mude a regra de overflow de lugar ou renderize o dropdown fora dele.
Perguntas frequentes
O que overflow: hidden faz?
Corta o conteúdo que não cabe na caixa do padding do elemento, sem barras de rolagem. A parte escondida ainda pode ser alcançada por script ou quando algo dentro dela recebe foco.
Qual a diferença entre overflow auto e scroll?
scroll sempre reserva as barras de rolagem, mesmo quando o conteúdo cabe. auto só mostra a barra quando o conteúdo é maior que a caixa, que é o que você normalmente quer.
Como fazer uma div com rolagem?
Limite o tamanho e permita a rolagem: max-height: 300px; overflow-y: auto;. Sem um limite de height ou max-height, a div cresce com o conteúdo e nunca transborda.
Por que overflow-x: hidden também cria uma barra de rolagem vertical?
Se um eixo é hidden, scroll ou auto, um valor visible no outro eixo é calculado como auto. Use overflow-x: clip, que não cria um contêiner de rolagem e deixa o outro eixo visível.
Como pôr reticências (...) em um texto que transborda?
Para uma linha: white-space: nowrap; overflow: hidden; text-overflow: ellipsis; em um elemento com largura limitada. Para várias linhas, use display: -webkit-box; -webkit-box-orient: vertical; -webkit-line-clamp: 3; overflow: hidden;.