SnippetUI

动态下划线标签页

卡片的选择可以在光滑的地面上进行导航,并且卡片的选择可以在引导装置下进行。

Tailwind CSSJavaScript

精致的选项卡 UI 具有平滑的滑动下划线,可在用户在选项卡之间切换时跟随用户。

预览

Account settings content goes here. Manage your profile details.

用例和功能

  • 类别切换:非常适合在同一屏幕内不同部分之间切换的 UI,例如文章类别、设置屏幕上的选项卡等。
  • 节省空间:在有限的屏幕空间内提供多种内容,即使在移动环境中也很有效。
  • 视觉当前位置:下划线动画平滑地跟随选项卡的当前位置,让您直观地了解用户当前正在看的位置。

设计和用户体验(Design & UX)的要点

  • 动画跟随:使用 CSS transitiontransform,我们实现下划线滑动的运动。这提供了您已切换标签的良好反馈。
  • 辅助功能注意事项:活动选项卡和非活动选项卡之间的字体颜色(对比度)明显分开,以便于视觉区分。

如何定制(定制指南)

  • 颜色更改:您只需将“indigo-600”等类更改为“blue-500”或“emerald-600”以匹配品牌颜色即可统一设计。
  • 添加选项卡:向 HTML 添加按钮和内容面板,并调整 JavaScript 逻辑(“宽度”和“变换”比率)以匹配选项卡的数量。

实现代码(Implementation)

<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>