Menu flutuante

Quando o conteúdo se estende para além do conteúdo pai, há muitas opções de como ele pode ser processado. Você pode rolar a tela para adicionar mais espaço, cortar as bordas excedentes, indicar o corte com reticências e muito mais. É muito importante considerar o overflow ao desenvolver aplicativos para celulares e para vários tamanhos de tela.

Há duas opções de recorte diferentes no CSS: text-overflow ajuda com linhas individuais de texto, e as propriedades overflow ajudam a controlar o overflow no modelo de caixa.

Linha única com text-overflow

Use a propriedade text-overflow em qualquer elemento que contenha nós de texto, por exemplo, um parágrafo, <p>. Ele especifica como o texto aparece quando não cabe no espaço disponível do elemento. Todo texto HTML visível em uma página está em nós de texto. Para usar text-overflow, você precisa de uma única linha de texto sem quebra de linha. Portanto, também precisa definir overflow como hidden e ter um valor white-space que evite o ajuste.

p {
   
text-overflow: ellipsis;
   
overflow: hidden;
   
white-space: nowrap;
}

Como usar propriedades de overflow

As propriedades de estouro são definidas em um elemento para controlar o que acontece quando os filhos dele precisam de mais espaço do que o disponível. Isso pode ser intencional, como em um mapa interativo, como o Google Maps, em que um usuário explora uma imagem grande recortada em um tamanho específico. Também pode ser não intencional, como em um aplicativo de chat em que o usuário digita uma mensagem longa que não cabe no balão de texto.

Você pode pensar no overflow em duas partes. O elemento pai tem um espaço firmemente limitado que não vai mudar. Pense nisso como uma janela. Os elementos filhos são o conteúdo que precisa de mais espaço do elemento pai. Pense nisso como o que você olha pela janela. Gerenciar o overflow ajuda a orientar como a janela enquadra esse conteúdo.

Rolagem no eixo vertical e horizontal

A propriedade overflow-y controla o estouro físico ao longo do eixo vertical da janela de visualização do dispositivo, rolando para cima e para baixo.

A propriedade overflow-x controla o transbordamento ao longo do eixo horizontal da janela de visualização do dispositivo, rolando para a esquerda e para a direita.

Propriedades lógicas para a direção da rolagem

Compatibilidade com navegadores

  • Chrome: incompatível.
  • Edge: não compatível.
  • Firefox: 69.
  • Safari: incompatível.

Origem

As propriedades overflow-inline e overflow-block definem o overflow com base na direção do documento e no modo de gravação.

A abreviação overflow

A abreviação overflow define os estilos overflow-x e overflow-y em uma linha:

overflow: hidden scroll;

Se duas palavras-chave forem especificadas, a primeira será aplicada a overflow-x e a segunda a overflow-y. Caso contrário, overflow-x e overflow-y usam o mesmo valor.

Valores

Vamos analisar em mais detalhes os valores e as palavras-chave disponíveis para as propriedades overflow.

overflow: visible (padrão)
Sem definir a propriedade, overflow: visible é o valor padrão para a Web. Isso garante que o conteúdo nunca seja ocultado acidentalmente e segue os princípios básicos de "nunca ocultar conteúdo" ou "layouts seguros de layouts precisos".
overflow: hidden
Com o overflow: hidden, o conteúdo é recortado na direção especificada e nenhuma barra de rolagem é fornecida para mostrá-lo.
overflow: scroll
overflow: scroll ativa as barras de rolagem para permitir que os usuários rolem o conteúdo. Mesmo que o conteúdo não esteja transbordando no momento, as barras de rolagem vão estar presentes. Essa é uma ótima maneira de reduzir a futura mudança de layout se um contêiner puder ser rolável no futuro, por exemplo, no redimensionamento, e preparar visualmente o usuário para áreas roláveis.
overflow: clip
Como overflow: hidden, o conteúdo com overflow: clip é cortado na caixa de padding do elemento. A diferença entre clip e hidden é que a palavra-chave clip também proíbe toda a rolagem, incluindo a programática.
overflow: auto
Por fim, o valor mais usado, overflow: auto. Isso respeita as preferências do usuário e mostra as barras de rolagem, se necessário, mas as oculta por padrão e dá a responsabilidade de rolar a tela ao usuário e ao navegador.

Rolagem e overflow

Muitos desses comportamentos overflow apresentam uma barra de rolagem, mas há alguns comportamentos e propriedades específicos de rolagem que podem ajudar a controlar a rolagem no contêiner de overflow.

Rolagem e acessibilidade

É importante garantir que a área rolável aceite o foco para que um usuário do teclado possa usar a tecla Tab até chegar à caixa e, em seguida, usar as teclas de seta para rolar.

Para permitir que uma caixa de rolagem aceite o foco, adicione tabindex="0", um nome com o atributo aria-labelledby e um atributo role adequado. Exemplo:

<div tabindex="0" role="region" aria-labelledby="id-of-descriptive-text">
    content
</div>

O CSS pode ser usado para indicar que a caixa tem foco, usando a propriedade outline para dar uma dica visual de que ela agora pode ser rolada.

Em Como usar o CSS para aplicar a acessibilidade, Adrian Roselli demonstra como o CSS pode ajudar a evitar regressões de acessibilidade. Por exemplo, para ativar a rolagem e adicionar o indicador de foco apenas se os atributos corretos forem usados. As regras a seguir só vão permitir que a caixa seja rolada se ela tiver um atributo tabindex, aria-labelledby e role.

[role][aria-labelledby][tabindex] {
 
overflow: auto;
}

[role][aria-labelledby][tabindex]:focus {
 
outline: .1em solid blue;
}

Posicionamento da barra de rolagem no modelo de caixa

As barras de rolagem ocupam espaço na caixa de padding e podem competir por espaço se forem inline, e não overlaid. O módulo de modelo de caixa detalha mais essa possível fonte de mudança de layout.

root-scroller x implicit-scroller

Você pode notar que alguns controles de rolagem têm um comportamento de puxar para atualizar e outros comportamentos especiais, especialmente ao desenvolver para aplicativos móveis e híbridos. Esse comportamento de rolagem acontece no scroller raiz. Há apenas um scroller raiz em uma página. Por padrão, documentElement é o botão de rolagem raiz da página. No entanto, ao mudar qual elemento é o botão de rolagem raiz, os comportamentos especiais podem ser aplicados a controles de rolagem diferentes do documentElement. Chamamos esse novo botão de rolagem raiz implícito.

Para criar um botão de rolagem raiz, use algo chamado promoção de rolagem posicionando um contêiner como fixo, garantindo que ele cubra toda a janela de visualização e fique com o Z-index na parte de cima com um botão de rolagem. Confira um scroller raiz e um scroller implícito aninhado aqui.

O vídeo mostra um scroller raiz com comportamento de salto e novos recursos de estilo,
em comparação com um scroller implícito sem comportamento de rolagem aprimorado.

scroll-behavior

Compatibilidade com navegadores

  • Chrome: 61.
  • Edge: 79.
  • Firefox: 36.
  • Safari: 15.4.

Origem

scroll-behavior permite ativar a rolagem controlada pelo navegador para elementos. Isso permite especificar como a navegação na página, como .scrollTo() ou links, é processada.

Isso é útil principalmente quando usado com prefers-reduced-motion para especificar o comportamento de rolagem com base na preferência do usuário.

@media (prefers-reduced-motion: no-preference) {
 
.scroll-view {
   
scroll-behavior: auto;
 
}
}

overscroll-behavior

Compatibilidade com navegadores

  • Chrome: 63.
  • Edge: 18.
  • Firefox: 59.
  • Safari: 16.

Origem

Se você já chegou ao fim de uma sobreposição modal, continuou rolando e fez a página por trás da sobreposição se mover, isso é o encadeamento de rolagem, ou o fluxo para o contêiner de rolagem pai. A propriedade overscroll-behavior permite evitar o vazamento da rolagem flutuante para um contêiner pai, o que é chamado de encadeamento de rolagem.

Teste seu conhecimento

Teste seu conhecimento sobre estouro

O overflow de texto e de elemento são iguais?

falso
verdadeiro

A propriedade overflow aceita duas palavras-chave. A primeira é para qual eixo?

horizontal
categoria

Qual espaço no modelo de caixa as barras de rolagem consomem ao aparecer e inline?

caixa da margem
caixa de borda
caixa de padding
caixa de conteúdo

Para capturar o momentum extra da rolagem em um scroller implícito aninhado, qual propriedade você usaria?

scroll-padding
overscroll-effect
scroll-behavior
overscroll-behavior
scroll-hint

Recursos

Overflow and Data Loss in CSS da revista Smashing (em inglês)