手机底部导航栏制作

前言

以下是一套 高度还原手机原生风格 的底部导航栏实现方案,支持点击切换、图标 + 文字组合、选中状态高亮,适配移动端屏幕,可直接嵌入网页或 Hybrid 应用,兼容主流浏览器。

一、核心效果说明

  • 固定在页面底部,占满屏幕宽度,适配手机尺寸;
  • 支持 3-5 个导航项(手机常见数量),每个项包含 "图标 + 文字";
  • 点击导航项切换选中状态(图标变色、文字变色、底部高亮条);
  • 支持默认选中项,切换时可联动页面内容切换(可选功能);
  • 适配触摸操作,无点击延迟,样式贴近 iOS/Android 原生风格。

二、完整实现代码(直接可用)

html

预览

复制代码
<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <!-- 适配移动端:禁止缩放,设置视口宽度 -->
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <title>仿手机底部导航栏</title>
    <style>
        /* 重置默认样式 */
        * {
            margin: 0;
            padding: 0;
            box-sizing: border-box;
            list-style: none;
            text-decoration: none;
        }

        body {
            /* 给底部导航栏留空间,避免内容被遮挡 */
            padding-bottom: 56px;
            font-family: "PingFang SC", "Helvetica Neue", Arial, sans-serif;
            background-color: #f5f5f5;
        }

        /* 底部导航栏容器 */
        .bottom-nav {
            position: fixed;
            bottom: 0;
            left: 0;
            right: 0;
            height: 56px; /* 手机导航栏常见高度 */
            background-color: #fff;
            box-shadow: 0 -2px 10px rgba(0, 0, 0, 0.05); /* 顶部阴影,增强层次感 */
            display: flex;
            z-index: 999; /* 确保在页面最上层 */
        }

        /* 导航项:平均分配宽度 */
        .nav-item {
            flex: 1;
            display: flex;
            flex-direction: column;
            align-items: center;
            justify-content: center;
            color: #999; /* 未选中颜色 */
            font-size: 12px; /* 文字大小 */
            padding: 4px 0;
            transition: color 0.2s ease; /* 颜色过渡动画 */
        }

        /* 选中状态 */
        .nav-item.active {
            color: #2d8cf0; /* 选中主色(可自定义,如微信绿#07C160、淘宝橙#FF4400) */
        }

        /* 导航图标:使用 Font Awesome 图标(免费开源) */
        .nav-icon {
            font-size: 24px; /* 图标大小 */
            margin-bottom: 2px;
        }

        /* 可选:底部高亮条(增强选中反馈) */
        .nav-item.active::after {
            content: "";
            display: block;
            width: 24px;
            height: 3px;
            background-color: #2d8cf0;
            border-radius: 3px;
            margin-top: 2px;
        }

        /* 页面内容区域(示例) */
        .content {
            padding: 20px;
            text-align: center;
        }

        .content-item {
            display: none; /* 默认隐藏所有内容 */
            font-size: 18px;
            color: #333;
        }

        .content-item.active {
            display: block; /* 选中项对应的内容显示 */
        }
    </style>
    <!-- 引入 Font Awesome 图标库(免费,无需本地存储图标) -->
    <link rel="stylesheet" href="https://cdn.bootcdn.net/ajax/libs/font-awesome/6.4.0/css/all.min.css">
</head>
<body>
    <!-- 页面内容区域(示例:对应4个导航项) -->
    <div class="content">
        <div class="content-item active" id="home">首页内容</div>
        <div class="content-item" id="discover">发现内容</div>
        <div class="content-item" id="message">消息内容</div>
        <div class="content-item" id="mine">我的内容</div>
    </div>

    <!-- 底部导航栏 -->
    <nav class="bottom-nav">
        <a href="#home" class="nav-item active" data-target="home">
            <i class="fas fa-home nav-icon"></i>
            <span>首页</span>
        </a>
        <a href="#discover" class="nav-item" data-target="discover">
            <i class="fas fa-compass nav-icon"></i>
            <span>发现</span>
        </a>
        <a href="#message" class="nav-item" data-target="message">
            <i class="fas fa-comment-dots nav-icon"></i>
            <span>消息</span>
        </a>
        <a href="#mine" class="nav-item" data-target="mine">
            <i class="fas fa-user nav-icon"></i>
            <span>我的</span>
        </a>
    </nav>

    <script>
        // 1. 获取导航项和内容项
        const navItems = document.querySelectorAll('.nav-item');
        const contentItems = document.querySelectorAll('.content-item');

        // 2. 给每个导航项绑定点击事件
        navItems.forEach(item => {
            item.addEventListener('click', function(e) {
                e.preventDefault(); // 阻止默认跳转(如果用a标签的话)
                
                // 3. 移除所有导航项的选中状态
                navItems.forEach(nav => nav.classList.remove('active'));
                // 4. 给当前点击的导航项添加选中状态
                this.classList.add('active');

                // 5. 切换对应页面内容(可选功能)
                const targetId = this.getAttribute('data-target');
                contentItems.forEach(content => {
                    content.classList.remove('active');
                });
                document.getElementById(targetId).classList.add('active');
            });
        });
    </script>
</body>
</html>

三、关键设计细节(贴近原生体验)

1. 样式优化

  • 尺寸适配 :导航栏高度 56px 是手机原生导航栏的主流尺寸,文字 12px、图标 24px 比例协调,触摸区域足够大(每个导航项占 1/4 宽度,触摸无压力);
  • 视觉层次:白色背景 + 顶部阴影,模拟手机原生导航栏的 "悬浮感",避免与页面内容混淆;
  • 选中反馈:采用 "颜色变化 + 底部高亮条" 双重反馈,比单一颜色变化更清晰(可根据需求删除高亮条,仅保留颜色变化)。

2. 交互优化

  • 无点击延迟 :通过 meta 标签 user-scalable=no 禁用缩放,配合 transition 过渡动画,点击响应流畅;
  • 内容联动:默认绑定 "导航切换→内容切换" 逻辑,无需额外修改即可用,也可根据需求删除(仅保留导航栏样式);
  • 图标兼容性:使用 Font Awesome 图标库,支持千余种免费图标,无需本地存储图片,加载快、适配高清屏。

四、自定义修改指南(按需调整)

1. 修改导航项数量(3/5 个均可)

  • 新增导航项:复制一个 <a class="nav-item">...</a>,修改 data-target、图标、文字,确保 content 区域对应新增 content-item
  • 减少导航项:直接删除多余的 <a class="nav-item">,同步删除对应的 content-item

2. 修改颜色风格(适配不同 APP)

  • 选中主色:修改 .nav-item.activecolor.nav-item.active::afterbackground-color(示例用蓝色,可改为微信绿 #07C160、淘宝橙 #FF4400、抖音蓝 #00C48C);
  • 背景色:修改 .bottom-navbackground-color(原生多为白色,也可改为深色 #111,配合文字颜色 #fff 实现深色模式)。

3. 更换图标

  • 打开 Font Awesome 图标库,搜索需要的图标(如 "首页" 可用 home、"购物车" 可用 shopping-cart、"设置" 可用 cog);
  • 替换 <i class="fas fa-xxx nav-icon"></i> 中的 fa-xxx 为目标图标类名即可。

4. 禁用内容联动

  • 如果仅需要导航栏样式,不需要切换内容,删除 <script> 标签中 "切换对应页面内容" 的代码(即 const targetId = ...document.getElementById(targetId)... 部分)。

五、适配与兼容性

  • 设备适配 :支持 iPhone、Android 手机,通过 viewport 标签确保在不同屏幕宽度下全屏显示;
  • 浏览器兼容:兼容 Chrome、Safari、微信浏览器、QQ 浏览器等主流移动端浏览器;
  • Hybrid 应用适配:可直接嵌入 React Native、UniApp 等 Hybrid 框架的 WebView 中,样式无冲突。

六、进阶功能扩展(可选)

  1. 添加角标提示 (如消息未读数量):

    html

    预览

    复制代码
    <a href="#message" class="nav-item" data-target="message">
        <i class="fas fa-comment-dots nav-icon"></i>
        <span>消息</span>
        <span style="position: absolute; top: 6px; right: 25%; background: red; color: white; font-size: 10px; width: 16px; height: 16px; border-radius: 50%; display: flex; align-items: center; justify-content: center;">3</span>
    </a>
  2. 图标动画 :点击时添加图标缩放效果,在 .nav-item.active 中添加 transform: scale(1.1);,配合 transition: all 0.2s ease;

  3. 深色模式切换 :通过 JS 动态修改 .bottom-nav.nav-item 的颜色,适配系统深色模式。

这套方案兼顾了 原生体验、易用性、可扩展性,无需复杂配置,复制代码即可运行,适合快速开发移动端网页、小程序内嵌页面或 Hybrid 应用的底部导航栏。

相关推荐
CodeAmaz6 小时前
通用 List 分批切割并循环查询数据库工具类
java·数据结构·工具类·分页
消失的旧时光-19436 小时前
Kotlinx.serialization 对多态对象(sealed class )支持更好用
java·服务器·前端
leonardee7 小时前
Spring Security安全框架原理与实战
java·后端
q***5187 小时前
Spring Cloud gateway 路由规则
java
空空kkk8 小时前
SpringMVC框架——入门
java·spring
liyi_hz20088 小时前
云原生 + 国产化适配:O2OA (翱途)开发平台后端技术栈深度解析
java·后端·开源软件
⑩-8 小时前
缓存穿透,击穿,雪崩
java·redis
合作小小程序员小小店8 小时前
web网页开发,在线%考试管理%系统,基于Idea,html,css,jQuery,java,jsp,servlet,mysql。
java·前端·intellij-idea
程序媛_MISS_zhang_01108 小时前
vant-ui中List 组件可以与 PullRefresh 组件结合使用,实现下拉刷新的效果
java·linux·ui
曹牧8 小时前
Java中处理URL转义并下载PDF文件
java·开发语言·pdf