0Pricing
React Academy · Aula

Dicas de ferramentas e menus suspensos com Portals

Use Portals para renderizar dicas de ferramentas e menus suspensos que escapem de contêineres com overflow-hidden.

Dicas de ferramentas e menus suspensos com Portals é uma aula grátis de React Academy no CoddyKit. Esta é a aula 4 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de React Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de React Academy inclui 4 aulas no total.

Boas-vindas

Nesta lição, você criará componentes de dicas de ferramenta e menus suspensos que usam Portais do React para renderizar em document.body, escapando das restrições de overflow oculto e dos contextos de empilhamento de z-index dos pais.

O problema do overflow

Uma dica de ferramenta posicionada em relação ao seu botão acionador será recortada se algum ancestral tiver `overflow: hidden` ou `overflow: scroll`. Mover a dica de ferramenta para document.body por meio de um portal resolve completamente esse problema.

Estratégia de posicionamento

Para posicionar corretamente uma dica de ferramenta renderizada por um portal, meça o retângulo delimitador do elemento acionador com `getBoundingClientRect()` e calcule coordenadas absolutas que levem em conta a posição da rolagem.
const rect = triggerRef.current.getBoundingClientRect();
const top = rect.bottom + window.scrollY + 8;
const left = rect.left + window.scrollX;

Componente de dica de ferramenta

Crie uma dica de ferramenta que envolva seus filhos, anexe uma ref ao acionador e renderize por meio de um portal uma caixa de dica de ferramenta posicionada quando o usuário passar o cursor sobre ela.
function Tooltip({ content, children }) {
  const [visible, setVisible] = useState(false);
  const [pos, setPos] = useState({ top: 0, left: 0 });
  const ref = useRef();

  const show = () => {
    const r = ref.current.getBoundingClientRect();
    setPos({ top: r.bottom + window.scrollY + 4,
             left: r.left + window.scrollX });
    setVisible(true);
  };

  return (
    <span ref={ref} onMouseEnter={show} onMouseLeave={() => setVisible(false)}>
      {children}
      {visible && createPortal(
        <div style={{ position:'absolute', top: pos.top, left: pos.left }}
             className="tooltip">{content}</div>,
        document.body
      )}
    </span>
  );
}

Atualizando a posição ao rolar e redimensionar

Se o usuário rolar a página enquanto uma dica de ferramenta estiver visível, a posição dela ficará desatualizada. Escute os eventos `scroll` e `resize` para recalcular a posição ou fechar a dica de ferramenta.
useEffect(() => {
  if (!visible) return;
  const update = () => setVisible(false);
  window.addEventListener('scroll', update, true);
  window.addEventListener('resize', update);
  return () => {
    window.removeEventListener('scroll', update, true);
    window.removeEventListener('resize', update);
  };
}, [visible]);

Arquitetura de menus suspensos

Um menu suspenso segue o mesmo padrão de uma dica de ferramenta. O botão acionador mostra ou oculta o menu, o menu é renderizado por meio de um portal e um handler de clique fora o fecha.

Manipulador de cliques fora

Use um ouvinte de `mousedown` em `document` para detectar cliques fora do menu. Compare o alvo do clique com as referências do menu e do acionador para decidir se o menu deve ser fechado.
useEffect(() => {
  if (!open) return;
  const handler = (e) => {
    if (!menuRef.current?.contains(e.target) &&
        !triggerRef.current?.contains(e.target)) {
      setOpen(false);
    }
  };
  document.addEventListener('mousedown', handler);
  return () => document.removeEventListener('mousedown', handler);
}, [open]);

Navegação por teclado em menus suspensos

Implemente ArrowDown/ArrowUp para mover-se entre os itens do menu, Enter para selecionar e Escape para fechar. Acompanhe o índice em foco no estado e chame `.focus()` programaticamente nos itens do menu.

Usando uma biblioteca de posicionamento

Para produção, use **@floating-ui/react** (anteriormente Popper.js). Ela lida automaticamente com a inversão (reposicionamento quando está perto das bordas da janela de visualização), o deslocamento (mantendo a dica de ferramenta visível) e o posicionamento da seta.
import { useFloating, flip, shift } from '@floating-ui/react';

const { refs, floatingStyles } = useFloating({
  middleware: [flip(), shift()],
});

Acessibilidade: ARIA para dicas de ferramenta

Para dicas de ferramenta, adicione `role='tooltip'` ao elemento da dica de ferramenta e `aria-describedby` apontando para o ID da dica no acionador. Isso permite que os leitores de tela anunciem o conteúdo da dica de ferramenta.
<button aria-describedby="tip1">Hover me</button>
{visible && createPortal(
  <div id="tip1" role="tooltip">Helpful text</div>,
  document.body
)}

Verificação rápida

Como você calcula a posição correta na tela para uma dica de ferramenta renderizada por um portal?

Recapitulação

Os portais permitem que dicas de ferramentas e menus suspensos escapem de elementos pais com overflow oculto. Meça o elemento acionador com getBoundingClientRect, adicione os deslocamentos de rolagem para o posicionamento absoluto, feche ao clicar fora e ao rolar, e adicione atributos ARIA para acessibilidade.

Curso concluído

Parabéns! Você concluiu **Portais e modais no React**. Agora você pode criar modais, dicas de ferramentas e menus suspensos acessíveis e posicionados corretamente, que escapam de quaisquer restrições de empilhamento do CSS.

Perguntas Frequentes

A aula “Dicas de ferramentas e menus suspensos com Portals” é grátis?

Sim — o texto completo de “Dicas de ferramentas e menus suspensos com Portals” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de React Academy, atualize para CoddyKit PRO. O curso de React Academy inclui 4 aulas no total.

O que vou aprender em “Dicas de ferramentas e menus suspensos com Portals”?

Use Portals para renderizar dicas de ferramentas e menus suspensos que escapem de contêineres com overflow-hidden. Você pratica React Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar React Academy?

Nenhuma experiência prévia é necessária. React Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 4 de 4.

Quanto tempo leva a aula “Dicas de ferramentas e menus suspensos com Portals”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de React Academy?

Sim. Cada aula de React Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. O que são os Portals do React
  2. Criação de um componente modal com Portals
  3. Tratamento de foco e armadilhas de teclado em modais
  4. Dicas de ferramentas e menus suspensos com Portals
← Voltar para React Academy