Executando verificação de segurança...
3

Os lemas invisíveis do scroll bem feito

🧭 Esta é a edição #14 da minha newsletter Logbook for Devs.

Se curtir, assina lá pra acompanhar as próximas :)


No episódio passado, contei como um bug visual estranho me pegou de surpresa: marquei uma checkbox dentro de uma tabela, e o conteúdo do modal deu um salto bizarro… culpa do famigerado scroll anchoring.

Mas a verdade é que aquele bug foi só a cereja do bolo.

Ele me fez revisitar uma dúvida que aparece sempre que a gente tenta fazer scroll funcionar do jeito certo em modais com cabeçalho e rodapé fixos. E aí veio aquela pergunta clássica:

“Por que eu botei overflowY: auto e mesmo assim não scrolla?”

A resposta, infelizmente, não está numa única propriedade, mas numa dança coreografada entre flex, minHeight, e a colaboração da hierarquia inteira.

Então resolvi documentar. Transformei o padrão em lemas fáceis de lembrar, que funcionam como lembretes mentais quando a gente tá perdido naquele modal que simplesmente se recusa a scrollar.


📌 Lemas do scroll bem feito em modais

  • 🔁 Scrolla quem tem overflowY: auto, flex: 1 e minHeight: 0
  • 🗂 O Content precisa ser display: flex com flexDirection: column
  • 📏 flex: 1 diz: “ocupe o espaço restante”
  • 🔓 minHeight: 0 diz: “pode encolher até o mínimo”
  • 🧬 O pai também precisa liberar o encolhimento
  • 💥 flex: 1 sem minH: 0 quebra. Sempre. Nunca esqueça.

💡 O raciocínio por trás

A base é simples: Flexbox distribui altura proporcionalmente, mas só se todo mundo colaborar.

Se um container tiver min-height: auto (valor padrão), ele impede que o filho encolha, o scroll não acontece, e você fica ali, com cara de quem “fez tudo certo”, mas ainda assim está quebrado.

É aí que minHeight: 0 vira herói silencioso: ele permite que os elementos realmente usem o espaço que o flex: 1 promete. Sem isso, o navegador ignora seu overflow e a rolagem desaparece.


🧠 A metáfora dos três níveis

  • 🧓 Avô (Dialog.Content): define o limite da modal com maxHeight: 90vh
  • 👨 Pai (Stack): diz “posso ocupar esse limite” com flex: 1, minHeight: 0
  • 👶 Neto (BodyContent): é quem realmente scrolla, com overflowY: auto

Todos precisam cooperar. Nenhum pode bloquear o outro.

Se um deles esquecer a parte dele, o scroll quebra.


🧦 E por que a modal não cresce inteira com pouco conteúdo?

Porque maxHeight é só um limite, não um comando.

E flex-grow não força expansão — ele só ocupa o que sobra.

maxHeight é como um teto: “você pode chegar até aqui”

flex: 1 é como um elástico: “se sobrar espaço, eu me estico”

Mas se o conteúdo for curto, o elástico nem sente pressão.

Se quiser que a modal tenha tamanho fixo mesmo com pouco conteúdo, adicione um minHeight nos lugares certos.


Esse conjunto de lemas e ajustes resolve 99% dos problemas de scroll quebrado em modais. E evita aquele ciclo sem fim de “funcionou num lugar mas quebrou no outro”.

Fica aqui no Logbook, como uma continuação direta do episódio anterior, pra lembrar que, no front-end, até as técnicas certas precisam do contexto certo pra funcionarem.


🌊 Marés da semana


📦 Treasure - Good Stuff

Carregando publicação patrocinada...