基础纯 HTML/CSS 实现(无 JavaScript)

这种方法最简单,适用于只需要点击跳转到不同页面的场景,所有内容一次性加载。

tab选项卡切换代码 网页 新闻
(图片来源网络,侵删)

特点:

  • 纯前端,无需 JS。
  • 点击后页面会刷新或跳转。
  • 代码量最少。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">新闻 Tab - 纯 CSS 实现</title>
    <style>
        /* 基础样式 */
        body {
            font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif;
            margin: 0;
            padding: 20px;
            background-color: #f4f4f4;
            color: #333;
        }
        .container {
            max-width: 900px;
            margin: 0 auto;
            background-color: #fff;
            padding: 20px;
            border-radius: 8px;
            box-shadow: 0 2px 10px rgba(0,0,0,0.1);
        }
        h1 {
            text-align: center;
            color: #333;
        }
        /* Tab 导航样式 */
        .tab-nav {
            display: flex;
            border-bottom: 2px solid #eee;
            margin-bottom: 20px;
        }
        .tab-nav a {
            flex: 1; /* 让每个选项卡平均分配宽度 */
            text-align: center;
            padding: 12px 20px;
            text-decoration: none;
            color: #666;
            border: 1px solid transparent;
            border-bottom: none;
            transition: all 0.3s ease;
        }
        .tab-nav a:hover {
            background-color: #f9f9f9;
            color: #007bff;
        }
        /* 当前激活的 Tab 样式 */
        .tab-nav a.active {
            color: #007bff;
            border: 1px solid #eee;
            border-bottom-color: #fff;
            margin-bottom: -2px;
            font-weight: bold;
        }
        /* Tab 内容区域 */
        .tab-content {
            padding: 20px 0;
        }
        .tab-pane {
            display: none; /* 默认隐藏所有内容 */
        }
        .tab-pane.active {
            display: block; /* 显示激活的内容 */
        }
        .news-item {
            padding: 15px 0;
            border-bottom: 1px solid #eee;
        }
        .news-item:last-child {
            border-bottom: none;
        }
        .news-item h3 {
            margin: 0 0 5px 0;
        }
        .news-item a {
            color: #007bff;
            text-decoration: none;
        }
        .news-item a:hover {
            text-decoration: underline;
        }
        .news-meta {
            font-size: 0.9em;
            color: #888;
        }
    </style>
</head>
<body>
    <div class="container">
        <h1>每日新闻</h1>
        <!-- Tab 导航 -->
        <div class="tab-nav">
            <!-- 使用锚点链接,href 对应下方内容的 id -->
            <a href="#tab1" class="active">国内新闻</a>
            <a href="#tab2">国际新闻</a>
            <a href="#tab3">科技新闻</a>
        </div>
        <!-- Tab 内容 -->
        <div class="tab-content">
            <!-- 国内新闻 -->
            <div id="tab1" class="tab-pane active">
                <div class="news-item">
                    <h3><a href="#">我国成功发射新型遥感卫星,用于环境监测</a></h3>
                    <p class="news-meta">2025年10月27日 10:30 来源:新华社</p>
                </div>
                <div class="news-item">
                    <h3><a href="#">全国多地迎来降温,请注意添衣保暖</a></h3>
                    <p class="news-meta">2025年10月27日 09:15 来源:中国天气网</p>
                </div>
                <div class="news-item">
                    <h3><a href="#">第三季度GDP同比增长4.9%,经济持续恢复向好</a></h3>
                    <p class="news-meta">2025年10月26日 14:00 来源:国家统计局</p>
                </div>
            </div>
            <!-- 国际新闻 -->
            <div id="tab2" class="tab-pane">
                <div class="news-item">
                    <h3><a href="#">联合国气候变化大会在迪拜开幕</a></h3>
                    <p class="news-meta">2025年10月27日 11:00 来源:路透社</p>
                </div>
                <div class="news-item">
                    <h3><a href="#">美联储宣布维持利率不变,市场反应积极</a></h3>
                    <p class="news-meta">2025年10月26日 22:30 来源:彭博社</p>
                </div>
                <div class="news-item">
                    <h3><a href="#">欧洲议会通过新法案,加强对大型科技公司的监管</a></h3>
                    <p class="news-meta">2025年10月25日 16:45 来源:欧洲新闻台</p>
                </div>
            </div>
            <!-- 科技新闻 -->
            <div id="tab3" class="tab-pane">
                <div class="news-item">
                    <h3><a href="#">苹果发布新款MacBook Pro,搭载M3系列芯片</a></h3>
                    <p class="news-meta">2025年10月30日 01:00 来源:The Verge</p>
                </div>
                <div class="news-item">
                    <h3><a href="#">OpenAI发布Sora模型,能生成长达1分钟的高清视频</a></h3>
                    <p class="news-meta">2025年10月23日 20:00 来源:AI科技评论</p>
                </div>
                <div class="news-item">
                    <h3><a href="#">特斯拉推出全新自动驾驶测试版,城市街道导航能力增强</a></h3>
                    <p class="news-meta">2025年10月20日 18:30 来源:TechCrunch</p>
                </div>
            </div>
        </div>
    </div>
</body>
</html>

经典 JavaScript + DOM 操作实现

这是最常见、最灵活的实现方式,无需刷新页面即可切换内容。

特点:

  • 单页面应用体验,切换流畅。
  • 使用原生 JavaScript,不依赖任何库。
  • 代码结构清晰,易于理解。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">新闻 Tab - JS 实现</title>
    <style>
        /* CSS 样式与方案一基本相同,这里省略,可以直接复制方案一的 <style> 部分 */
        body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; margin: 0; padding: 20px; background-color: #f4f4f4; color: #333; }
        .container { max-width: 900px; margin: 0 auto; background-color: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        h1 { text-align: center; }
        .tab-nav { display: flex; border-bottom: 2px solid #eee; margin-bottom: 20px; }
        .tab-nav button { /* 改用 button */ flex: 1; padding: 12px 20px; border: none; background: none; cursor: pointer; text-align: center; color: #666; font-size: 16px; transition: all 0.3s ease; position: relative; }
        .tab-nav button:hover { background-color: #f9f9f9; color: #007bff; }
        .tab-nav button.active { color: #007bff; }
        .tab-nav button.active::after { /* 添加下划线指示器 */ content: ''; position: absolute; bottom: -2px; left: 0; width: 100%; height: 2px; background-color: #007bff; }
        .tab-content { padding: 20px 0; }
        .tab-pane { display: none; }
        .tab-pane.active { display: block; }
        .news-item { padding: 15px 0; border-bottom: 1px solid #eee; }
        .news-item:last-child { border-bottom: none; }
        .news-item h3 { margin: 0 0 5px 0; }
        .news-item a { color: #007bff; text-decoration: none; }
        .news-item a:hover { text-decoration: underline; }
        .news-meta { font-size: 0.9em; color: #888; }
    </style>
</head>
<body>
    <div class="container">
        <h1>每日新闻</h1>
        <!-- Tab 导航,使用 button -->
        <div class="tab-nav">
            <button class="tab-btn active" data-tab="tab1">国内新闻</button>
            <button class="tab-btn" data-tab="tab2">国际新闻</button>
            <button class="tab-btn" data-tab="tab3">科技新闻</button>
        </div>
        <!-- Tab 内容 -->
        <div class="tab-content">
            <div id="tab1" class="tab-pane active">
                <!-- 国内新闻内容 (与方案一相同) -->
                <div class="news-item">
                    <h3><a href="#">我国成功发射新型遥感卫星,用于环境监测</a></h3>
                    <p class="news-meta">2025年10月27日 10:30 来源:新华社</p>
                </div>
                <div class="news-item">
                    <h3><a href="#">全国多地迎来降温,请注意添衣保暖</a></h3>
                    <p class="news-meta">2025年10月27日 09:15 来源:中国天气网</p>
                </div>
                <div class="news-item">
                    <h3><a href="#">第三季度GDP同比增长4.9%,经济持续恢复向好</a></h3>
                    <p class="news-meta">2025年10月26日 14:00 来源:国家统计局</p>
                </div>
            </div>
            <div id="tab2" class="tab-pane">
                <!-- 国际新闻内容 (与方案一相同) -->
                 <div class="news-item">
                    <h3><a href="#">联合国气候变化大会在迪拜开幕</a></h3>
                    <p class="news-meta">2025年10月27日 11:00 来源:路透社</p>
                </div>
                <div class="news-item">
                    <h3><a href="#">美联储宣布维持利率不变,市场反应积极</a></h3>
                    <p class="news-meta">2025年10月26日 22:30 来源:彭博社</p>
                </div>
                <div class="news-item">
                    <h3><a href="#">欧洲议会通过新法案,加强对大型科技公司的监管</a></h3>
                    <p class="news-meta">2025年10月25日 16:45 来源:欧洲新闻台</p>
                </div>
            </div>
            <div id="tab3" class="tab-pane">
                <!-- 科技新闻内容 (与方案一相同) -->
                <div class="news-item">
                    <h3><a href="#">苹果发布新款MacBook Pro,搭载M3系列芯片</a></h3>
                    <p class="news-meta">2025年10月30日 01:00 来源:The Verge</p>
                </div>
                <div class="news-item">
                    <h3><a href="#">OpenAI发布Sora模型,能生成长达1分钟的高清视频</a></h3>
                    <p class="news-meta">2025年10月23日 20:00 来源:AI科技评论</p>
                </div>
                <div class="news-item">
                    <h3><a href="#">特斯拉推出全新自动驾驶测试版,城市街道导航能力增强</a></h3>
                    <p class="news-meta">2025年10月20日 18:30 来源:TechCrunch</p>
                </div>
            </div>
        </div>
    </div>
    <script>
        document.addEventListener('DOMContentLoaded', () => {
            // 1. 获取所有 Tab 按钮和所有内容面板
            const tabBtns = document.querySelectorAll('.tab-btn');
            const tabPanes = document.querySelectorAll('.tab-pane');
            // 2. 为每个 Tab 按钮添加点击事件监听器
            tabBtns.forEach(btn => {
                btn.addEventListener('click', () => {
                    // a. 获取被点击按钮的 data-tab 属性值('tab1')
                    const activeTabId = btn.getAttribute('data-tab');
                    // b. 移除所有按钮和面板的 'active' 类
                    tabBtns.forEach(b => b.classList.remove('active'));
                    tabPanes.forEach(p => p.classList.remove('active'));
                    // c. 给被点击的按钮添加 'active' 类
                    btn.classList.add('active');
                    // d. 找到对应 id 的面板,并为其添加 'active' 类
                    const activePane = document.getElementById(activeTabId);
                    if (activePane) {
                        activePane.classList.add('active');
                    }
                });
            });
        });
    </script>
</body>
</html>

使用 jQuery 库实现(更简洁)

如果你已经在项目中使用了 jQuery,或者喜欢它简洁的语法,这是一个很好的选择。

tab选项卡切换代码 网页 新闻
(图片来源网络,侵删)

特点:

  • 代码量更少,选择器强大。
  • 需要引入 jQuery 库。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">新闻 Tab - jQuery 实现</title>
    <!-- 引入 jQuery 库 -->
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
    <style>
        /* CSS 样式与方案二完全相同 */
        body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; margin: 0; padding: 20px; background-color: #f4f4f4; color: #333; }
        .container { max-width: 900px; margin: 0 auto; background-color: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        h1 { text-align: center; }
        .tab-nav { display: flex; border-bottom: 2px solid #eee; margin-bottom: 20px; }
        .tab-nav button { flex: 1; padding: 12px 20px; border: none; background: none; cursor: pointer; text-align: center; color: #666; font-size: 16px; transition: all 0.3s ease; position: relative; }
        .tab-nav button:hover { background-color: #f9f9f9; color: #007bff; }
        .tab-nav button.active { color: #007bff; }
        .tab-nav button.active::after { content: ''; position: absolute; bottom: -2px; left: 0; width: 100%; height: 2px; background-color: #007bff; }
        .tab-content { padding: 20px 0; }
        .tab-pane { display: none; }
        .tab-pane.active { display: block; }
        .news-item { padding: 15px 0; border-bottom: 1px solid #eee; }
        .news-item:last-child { border-bottom: none; }
        .news-item h3 { margin: 0 0 5px 0; }
        .news-item a { color: #007bff; text-decoration: none; }
        .news-item a:hover { text-decoration: underline; }
        .news-meta { font-size: 0.9em; color: #888; }
    </style>
</head>
<body>
    <div class="container">
        <h1>每日新闻</h1>
        <div class="tab-nav">
            <button class="tab-btn active" data-tab="tab1">国内新闻</button>
            <button class="tab-btn" data-tab="tab2">国际新闻</button>
            <button class="tab-btn" data-tab="tab3">科技新闻</button>
        </div>
        <div class="tab-content">
            <div id="tab1" class="tab-pane active">
                <!-- 内容省略,与方案二相同 -->
            </div>
            <div id="tab2" class="tab-pane">
                <!-- 内容省略,与方案二相同 -->
            </div>
            <div id="tab3" class="tab-pane">
                <!-- 内容省略,与方案二相同 -->
            </div>
        </div>
    </div>
    <script>
        $(document).ready(function() {
            // 为所有 class 为 tab-btn 的按钮绑定点击事件
            $('.tab-btn').on('click', function() {
                // $(this) 指代当前被点击的按钮
                // 1. 移除所有按钮和面板的 active 类
                $('.tab-btn').removeClass('active');
                $('.tab-pane').removeClass('active');
                // 2. 给当前点击的按钮添加 active 类
                $(this).addClass('active');
                // 3. 获取 data-tab 属性的值
                var activeTabId = $(this).data('tab');
                // 4. 找到对应 id 的面板,并添加 active 类
                $('#' + activeTabId).addClass('active');
            });
        });
    </script>
</body>
</html>

使用现代前端框架(如 Vue.js)

对于构建复杂的应用程序,使用 Vue 或 React 这样的框架是更好的选择,这里以 Vue 3 为例。

特点:

  • 数据驱动视图,代码更优雅。
  • 组件化开发,易于维护和扩展。
  • 需要构建工具或引入 Vue 的 CDN 版本。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">新闻 Tab - Vue 实现</title>
    <!-- 引入 Vue 3 -->
    <script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
    <style>
        /* CSS 样式与方案二完全相同 */
        body { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; margin: 0; padding: 20px; background-color: #f4f4f4; color: #333; }
        .container { max-width: 900px; margin: 0 auto; background-color: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 10px rgba(0,0,0,0.1); }
        h1 { text-align: center; }
        .tab-nav { display: flex; border-bottom: 2px solid #eee; margin-bottom: 20px; }
        .tab-nav button { flex: 1; padding: 12px 20px; border: none; background: none; cursor: pointer; text-align: center; color: #666; font-size: 16px; transition: all 0.3s ease; position: relative; }
        .tab-nav button:hover { background-color: #f9f9f9; color: #007bff; }
        .tab-nav button.active { color: #007bff; }
        .tab-nav button.active::after { content: ''; position: absolute; bottom: -2px; left: 0; width: 100%; height: 2px; background-color: #007bff; }
        .tab-content { padding: 20px 0; }
        .news-item { padding: 15px 0; border-bottom: 1px solid #eee; }
        .news-item:last-child { border-bottom: none; }
        .news-item h3 { margin: 0 0 5px 0; }
        .news-item a { color: #007bff; text-decoration: none; }
        .news-item a:hover { text-decoration: underline; }
        .news-meta { font-size: 0.9em; color: #888; }
    </style>
</head>
<body>
    <div id="app">
        <div class="container">
            <h1>每日新闻</h1>
            <!-- Tab 导航,使用 v-for 循环生成 -->
            <div class="tab-nav">
                <button 
                    v-for="tab in tabs" 
                    :key="tab.id"
                    @click="activeTab = tab.id"
                    :class="{ active: activeTab === tab.id }"
                >
                    {{ tab.name }}
                </button>
            </div>
            <!-- Tab 内容,使用 v-if 或 v-show 切换 -->
            <div class="tab-content">
                <!-- 国内新闻 -->
                <div v-if="activeTab === 'tab1'" class="tab-pane active">
                    <div class="news-item" v-for="news in domesticNews" :key="news.title">
                        <h3><a href="#">{{ news.title }}</a></h3>
                        <p class="news-meta">{{ news.meta }}</p>
                    </div>
                </div>
                <!-- 国际新闻 -->
                <div v-if="activeTab === 'tab2'" class="tab-pane active">
                    <div class="news-item" v-for="news in internationalNews" :key="news.title">
                        <h3><a href="#">{{ news.title }}</a></h3>
                        <p class="news-meta">{{ news.meta }}</p>
                    </div>
                </div>
                <!-- 科技新闻 -->
                <div v-if="activeTab === 'tab3'" class="tab-pane active">
                    <div class="news-item" v-for="news in techNews" :key="news.title">
                        <h3><a href="#">{{ news.title }}</a></h3>
                        <p class="news-meta">{{ news.meta }}</p>
                    </div>
                </div>
            </div>
        </div>
    </div>
    <script>
        const { createApp } = Vue;
        createApp({
            data() {
                return {
                    // 当前激活的 Tab ID
                    activeTab: 'tab1',
                    // Tab 列表数据
                    tabs: [
                        { id: 'tab1', name: '国内新闻' },
                        { id: 'tab2', name: '国际新闻' },
                        { id: 'tab3', name: '科技新闻' }
                    ],
                    // 新闻数据
                    domesticNews: [
                        { title: '我国成功发射新型遥感卫星,用于环境监测', meta: '2025年10月27日 10:30 来源:新华社' },
                        { title: '全国多地迎来降温,请注意添衣保暖', meta: '2025年10月27日 09:15 来源:中国天气网' },
                        { title: '第三季度GDP同比增长4.9%,经济持续恢复向好', meta: '2025年10月26日 14:00 来源:国家统计局' }
                    ],
                    internationalNews: [
                        { title: '联合国气候变化大会在迪拜开幕', meta: '2025年10月27日 11:00 来源:路透社' },
                        { title: '美联储宣布维持利率不变,市场反应积极', meta: '2025年10月26日 22:30 来源:彭博社' },
                        { title: '欧洲议会通过新法案,加强对大型科技公司的监管', meta: '2025年10月25日 16:45 来源:欧洲新闻台' }
                    ],
                    techNews: [
                        { title: '苹果发布新款MacBook Pro,搭载M3系列芯片', meta: '2025年10月30日 01:00 来源:The Verge' },
                        { title: 'OpenAI发布Sora模型,能生成长达1分钟的高清视频', meta: '2025年10月23日 20:00 来源:AI科技评论' },
                        { title: '特斯拉推出全新自动驾驶测试版,城市街道导航能力增强', meta: '2025年10月20日 18:30 来源:TechCrunch' }
                    ]
                }
            }
        }).mount('#app');
    </script>
</body>
</html>

总结与选择建议

方案 技术栈 优点 缺点 适用场景
纯 CSS HTML, CSS 简单、快速、无 JS 依赖 页面会刷新/跳转,体验不连贯 静态网站、SEO 优化的简单页面
原生 JS HTML, CSS, Vanilla JS 灵活、无依赖、性能好 代码量比 jQuery/Vue 多,DOM 操作繁琐 简单的交互页面、不想引入库的项目
jQuery HTML, CSS, jQuery 代码简洁、选择器强大 依赖 jQuery 库、已非主流 旧项目维护、已引入 jQuery 的环境
Vue.js HTML, CSS, Vue.js 数据驱动、组件化、代码优雅 需要学习框架、有轻微性能开销 单页面应用、需要复杂交互和状态管理的项目

对于大多数现代网页开发,方案二(原生 JS) 是一个非常好的平衡点,它既提供了流畅的单页体验,又不引入任何外部依赖,而如果你正在构建一个大型应用,方案四(Vue.js) 则是更专业、更具扩展性的选择。

tab选项卡切换代码 网页 新闻
(图片来源网络,侵删)