SnippetUI

Tabs com Underline Animado

Navegação por guias com indicadores de sublinhado que seguem suavemente as guias ativas.

Tailwind CSSJavaScript

Uma interface de usuário de guias sofisticada com sublinhados deslizantes suaves que acompanham o usuário enquanto ele alterna entre as guias.

Visualização

Account settings content goes here. Manage your profile details.

Casos de uso e recursos

  • Troca de categoria: Ideal para UIs que alternam entre diferentes seções na mesma tela, como categorias de artigos, guias em telas de configurações, etc.
  • Economia de espaço: fornece vários conteúdos em espaço de tela limitado e é eficaz mesmo em ambientes móveis.
  • Posição visual atual: a animação do sublinhado segue suavemente a posição atual da guia, permitindo que você entenda intuitivamente para onde o usuário está olhando no momento.

Pontos-chave de design e UX (Design & UX)

  • Animação seguinte: Usando CSS transition ou transform, implementamos um movimento onde o sublinhado desliza.Isso fornece um bom feedback de que você trocou de guia.
  • Considerações de acessibilidade: a cor da fonte (contraste) é claramente separada entre guias ativas e inativas para facilitar a diferenciação visual.

Como personalizar (Guia de Personalização)

  • Mudança de cor: Você pode unificar o design simplesmente alterando classes como indigo-600 para blue-500 ou emerald-600 para combinar com a cor da marca.
  • Adicionando guias: Adicione botões e painéis de conteúdo ao HTML e ajuste a lógica JavaScript (proporções width e transform) para corresponder ao número de guias.

Código de implementação (Implementação)

<div class="max-w-md mx-auto">
<div class="relative flex border-b border-gray-200 dark:border-zinc-800">
  <button class="tab-btn flex-1 py-3 text-sm font-medium text-indigo-600 dark:text-indigo-400" data-target="tab1">Account</button>
  <button class="tab-btn flex-1 py-3 text-sm font-medium text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200" data-target="tab2">Security</button>
  <button class="tab-btn flex-1 py-3 text-sm font-medium text-gray-500 hover:text-gray-700 dark:text-gray-400 dark:hover:text-gray-200" data-target="tab3">Notifications</button>
  
  <div id="tab-indicator" class="absolute bottom-0 left-0 h-0.5 bg-indigo-600 dark:bg-indigo-400 transition-all duration-300 ease-out" style="width: 33.33%; transform: translateX(0%);"></div>
</div>
<div class="pt-4">
  <div id="tab1" class="tab-content text-gray-600 dark:text-gray-300 text-sm">Account settings content goes here. Manage your profile details.</div>
  <div id="tab2" class="tab-content hidden text-gray-600 dark:text-gray-300 text-sm">Security settings content goes here. Change your password.</div>
  <div id="tab3" class="tab-content hidden text-gray-600 dark:text-gray-300 text-sm">Notification preferences go here. Manage email alerts.</div>
</div>
</div>
<script>
const btns = document.querySelectorAll('.tab-btn');
const contents = document.querySelectorAll('.tab-content');
const indicator = document.getElementById('tab-indicator');

btns.forEach((btn, i) => {
  btn.addEventListener('click', () => {
    btns.forEach(b => {
      b.classList.remove('text-indigo-600', 'dark:text-indigo-400');
      b.classList.add('text-gray-500', 'dark:text-gray-400');
    });
    btn.classList.remove('text-gray-500', 'dark:text-gray-400');
    btn.classList.add('text-indigo-600', 'dark:text-indigo-400');
    
    indicator.style.transform = `translateX(${i * 100}%)`;
    
    contents.forEach(c => c.classList.add('hidden'));
    document.getElementById(btn.dataset.target).classList.remove('hidden');
  });
});
</script>