当前位置:首页 > JavaScript

js 实现tab实现切换效果

2026-04-07 06:23:34JavaScript

js 实现tab实现切换效果

使用HTML和CSS构建基础结构

<div class="tab-container">
  <div class="tab-buttons">
    <button class="tab-btn active" data-tab="tab1">Tab 1</button>
    <button class="tab-btn" data-tab="tab2">Tab 2</button>
    <button class="tab-btn" data-tab="tab3">Tab 3</button>
  </div>
  <div class="tab-content">
    <div class="tab-pane active" id="tab1">Content 1</div>
    <div class="tab-pane" id="tab2">Content 2</div>
    <div class="tab-pane" id="tab3">Content 3</div>
  </div>
</div>
.tab-btn {
  padding: 10px 20px;
  background: #eee;
  border: none;
  cursor: pointer;
}
.tab-btn.active {
  background: #ddd;
}
.tab-pane {
  display: none;
  padding: 20px;
  border: 1px solid #ddd;
}
.tab-pane.active {
  display: block;
}

通过事件委托实现切换逻辑

document.querySelector('.tab-buttons').addEventListener('click', (e) => {
  if (e.target.classList.contains('tab-btn')) {
    const tabId = e.target.dataset.tab;

    // 移除所有按钮和内容面板的active类
    document.querySelectorAll('.tab-btn').forEach(btn => {
      btn.classList.remove('active');
    });
    document.querySelectorAll('.tab-pane').forEach(pane => {
      pane.classList.remove('active');
    });

    // 为当前点击的按钮和对应内容面板添加active类
    e.target.classList.add('active');
    document.getElementById(tabId).classList.add('active');
  }
});

使用classList API优化性能

const tabButtons = document.querySelector('.tab-buttons');
const tabs = document.querySelectorAll('.tab-btn');
const panes = document.querySelectorAll('.tab-pane');

tabButtons.addEventListener('click', (e) => {
  const targetBtn = e.target.closest('.tab-btn');
  if (!targetBtn) return;

  tabs.forEach(tab => tab.classList.toggle('active', tab === targetBtn));
  panes.forEach(pane => {
    pane.classList.toggle('active', pane.id === targetBtn.dataset.tab);
  });
});

添加过渡动画效果

.tab-pane {
  opacity: 0;
  height: 0;
  overflow: hidden;
  transition: opacity 0.3s, height 0.3s;
}
.tab-pane.active {
  opacity: 1;
  height: auto;
}

支持键盘导航

tabButtons.addEventListener('keydown', (e) => {
  if (e.key === 'ArrowLeft' || e.key === 'ArrowRight') {
    const currentTab = document.querySelector('.tab-btn.active');
    const tabsArray = Array.from(tabs);
    let index = tabsArray.indexOf(currentTab);

    if (e.key === 'ArrowLeft') index = (index - 1 + tabs.length) % tabs.length;
    if (e.key === 'ArrowRight') index = (index + 1) % tabs.length;

    tabsArray[index].click();
    tabsArray[index].focus();
  }
});

标签: 效果js
分享给朋友:

相关文章

js实现

js实现

JavaScript 实现方法 JavaScript 是一种广泛使用的编程语言,适用于网页开发、服务器端编程以及移动应用开发。以下是几种常见的 JavaScript 实现方法: 网页交互功能 使用…

vue实现定位效果

vue实现定位效果

使用Geolocation API实现定位 在Vue中可以通过浏览器内置的Geolocation API获取用户位置信息。需要在组件的mounted钩子中调用相关方法: mounted() {…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

vue实现气泡效果

vue实现气泡效果

实现气泡效果的方法 在Vue中实现气泡效果可以通过CSS动画、第三方库或自定义组件完成。以下是几种常见方法: 使用纯CSS动画 通过CSS的@keyframes和transform属性创建气泡上升动…

vue实现预览效果

vue实现预览效果

实现预览效果的常见方法 在Vue中实现预览效果可以通过多种方式完成,以下列举几种典型场景和对应的实现方案: 图片/文件预览 使用<input type="file">结合FileRead…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…