首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >从0到1拆解理想画室官网头部导航:一套双态透明导航栏的设计与实现

从0到1拆解理想画室官网头部导航:一套双态透明导航栏的设计与实现

原创
作者头像
夏末浅笑
修改2026-08-09 16:55:45
修改2026-08-09 16:55:45
1020
举报

在网站设计中,头部导航(Header)是用户进入每个页面都会看到的组件。它既要承载品牌识别、导航、搜索等核心功能,又不能抢了页面内容的风头。今天以「理想画室官网」的 class="header" 为例,拆解一个完整拆解一套"透明→白底双态导航栏是如何从设计到落地。

一、为什么要做"双态导航"

理想画室是一家线下美术培训机构,官网首页有大幅轮播图,视觉冲击力要强。如果导航栏一上来就是白底,会让首屏被"截断感,破坏沉浸式体验。

所以我们采用「首屏透明、,透明红底半透明红底背景图+渐变遮罩」的顶部与首屏顶部透明→滚动后切换为白底+阴影。这样两个状态。

两种状态的核心差异:

| 状态 | 背景 | 文字颜色 | Logo | 搜索框 |

|---|---|---|---|---|

| 顶部(未滚动 | 红底+背景图+渐变 | 白色 | 白色 Logo | 半透明白框、透明 |

| 滚动后(scrolled) | 纯白底+阴影 | 深灰 #333 | 黑色 Logo | 浅灰底、灰字 |

二、HTML 结构:BEM 命名法

采用 BEM(Block Element Modifier)命名规范,便于在多个页面和模块清晰、便于维护。

代码语言:html
复制
<header class="header">

    <div class="header\_\_container">

        <!-- Logo -->

        <div class="header\_\_logo">

            <a href="/" class="header\_\_logo-link">

                <img src="/skin/img/logo-white.png" 

                     alt="理想艺术" 

                     class="header\_\_logo-img"

                     data-black="/skin/img/logo-black.png">

            </a>

        </div>

        <!-- 导航菜单 -->

        <nav class="header\_\_nav">

            <a href="/" class="header\_\_nav-link header\_\_nav-link--active">首页</a>

            <a href="/about/" class="header\_\_nav-link">关于我们</a>

            <a href="/school/" class="header\_\_nav-link">理想校园</a>

            <a href="/teacher/" class="header\_\_nav-link">师资介绍</a>

            <a href="/course/" class="header\_\_nav-link">专业课程</a>

            <a href="/news/" class="header\_\_nav-link">新闻动态</a>

            <a href="/enroll/" class="header\_\_nav-link">在线报名</a>

            <a href="/contact/" class="header\_\_nav-link">联系我们</a>

        </nav>

        <!-- 搜索框 -->

        <div class="header\_\_search">

            <form method="get" action="/search.html">

                <input type="text" name="keywords" placeholder="搜索" class="header\_\_search-input">

                <button type="submit">

                    <i class="fas fa-search header\_\_search-icon"></i>

                </button>

                <input type="hidden" name="method" value="1" />

                <input type="hidden" name="type" value="all" />

            </form>

        </div>

    </div>

</header>

结构清晰,三级:

  • **Block**:header — 整个导航块
  • **Element**:header\_\_containerheader\_\_logoheader\_\_navheader\_\_search
  • **Modifier**:header\_\_nav-link--active — 当前页高亮

三、CSS 实现:双态切换的核心

代码语言:css
复制
/\* ===== 基础样式:顶部透明红底背景图 + 渐变遮罩 \*/

.header {

    position: fixed;

    top: 0;

    left: 0;

    right: 0;

    z-index: 1000;

    height: 80px;

    display: flex;

    align-items: center;

    background-color: #c00000;

    background-image:

        linear-gradient(135deg, 

            rgba(26,26,46,0.35) 0%,

            rgba(177,11,24,0.25) 50%,

            rgba(192,0,0,0.35) 100%),

        url('/skin/img/header-bg.jpg');

    background-size: cover;

    background-position: center;

    transition: background-color 0.3s ease, 

                box-shadow 0.3s ease, 

                background-image 0.3s ease;

}



/\* ===== 滚动后白底 \*/

.header.scrolled {

    background-image: none;

    background-color: #fff;

    box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);

}



/\* 给 body 顶部留空,防止 fixed 定位不遮挡内容 \*/

body { padding-top: 80px; }

导航链接的双态文字颜色:

代码语言:css
复制
.header\_\_nav-link {

    color: #fff;

    font-size: 16px;

    font-weight: 500;

    position: relative;

    transition: color 0.3s ease;

}



/\* 滚动后文字变深灰 \*/

.header.scrolled .header\_\_nav-link { color: #333; }



/\* active / hover 下划线效果 \*/

.header\_\_nav-link::after {

    content: '';

    position: absolute;

    bottom: -5px;

    left: 0;

    width: 0;

    height: 2px;

    background-color: #fff;

    transition: width 0.3s ease;

}

.header\_\_nav-link--active::after { 

    width: 100%;

    background-color: #fff;

}

.header.scrolled .header\_\_nav-link--active::after {

    background-color: #a30000;

}

关键技巧:通过 .header.scrolled 作为「开关状态切换所有子元素颜色的状态。切换只需加一行 JS 加一个类,所有子元素的颜色、背景、边框全部联动。

搜索框的双态

代码语言:css
复制
.header\_\_search-input {

    width: 140px;

    height: 36px;

    border: 1px solid rgba(255,255,255,0.3);

    border-radius: 18px;

    background: rgba(255,255,255,0.1);

    color: #fff;

    outline: none;

    transition: all 0.3s ease;

}

.header\_\_search-input::placeholder { 

    color: rgba(255,255,255,0.6);

}



/\* 滚动后白底 \*/

.header.scrolled .header\_\_search-input {

    border-color: #e0e0e0;

    background: #f5f5f5;

    color: #333;

}

.header.scrolled .header\_\_search-input::placeholder { 

    color: #999;

}



/\* 聚焦时展开 \*/

.header\_\_search-input:focus { 

    width: 180px; 

    border-color: #a30000;

}

四、JavaScript:滚动切换逻辑

代码语言:javascript
复制
(function() {

    'use strict';



    const headerEl = document.querySelector('.header');

    if (!headerEl) return;



    /\* 1. Logo 黑白切换(data-black 属性存黑色 Logo 地址

    const logoImg = headerEl.querySelector('.header\_\_logo-img');

    if (logoImg && logoImg.dataset && logoImg.dataset.black) {

        const whiteSrc = logoImg.src;

        const blackSrc = logoImg.dataset.black;



        function updateLogo() {

            logoImg.src = window.scrollY > 80 ? blackSrc : whiteSrc;

        }



        window.addEventListener('scroll', updateLogo, { passive: true });

        updateLogo();

    }



    /\* 2. Header 滚动样式切换 \*/

    function updateHeaderScroll() {

        if (window.scrollY > 80) {

            headerEl.classList.add('scrolled');

            headerEl.classList.remove('transparent');

        } else {

            headerEl.classList.remove('scrolled');

            headerEl.classList.add('transparent');

        }

    }



    window.addEventListener('scroll', updateHeaderScroll, { passive: true });

    updateHeaderScroll();



    /\* 3. 搜索框交互 \*/

    const searchIcon = headerEl.querySelector('.header\_\_search-icon');

    const searchInput = headerEl.querySelector('.header\_\_search-input');



    if (searchIcon && searchInput) {

        searchIcon.addEventListener('click', function(e) {

            e.stopPropagation();

            searchInput.focus();

        });



        searchInput.addEventListener('keydown', function(e) {

            if (e.key === 'Enter' && this.value.trim()) {

                window.location.href = '/search.html?keyword=' + encodeURIComponent(this.value.trim());

            }

        });



        document.addEventListener('click', function(e) {

            if (searchInput.value && !e.target.closest('.header\_\_search')) {

                searchInput.value = '';

            }

        });

    }

})();

五、核心亮点

**1. 数据驱动的 Logo 切换**

data-black 属性存黑色 Logo 地址,HTML 写一行代码就能实现黑白 Logo 切换,JS 代码不用改 JS,换个图片地址就行。

**2. 单一状态类控制所有子元素**

只用一个 .scrolled 类,配合 CSS 后代选择器联动所有子元素的颜色、背景、边框。维护成本极低,新增元素只需在 CSS 里加一行即可。

**3. passive: hover**

滚动监听使用 passive: true,提升滚动性能,避免页面卡顿。

**4. 搜索框的微交互**

聚焦时输入框宽度从 140px → 180px 展开,给用户明确的输入反馈。点击外部自动清空,保持页面干净。

**5. 全站一致的过渡动画**

所有颜色、背景、阴影都加了 transition: 0.3s ease,切换平滑过渡,不会有生硬的"跳变"感。

六、扩展思考

这套双态导航的核心思路是「首屏沉浸 + 滚动后实用」。首屏让用户沉浸在品牌氛围里,滚动后立即提供清晰的导航信息。适用于:

  • 品牌官网、企业官网首页
  • 产品落地页
  • 有大幅 Banner/轮播的页面

如果你的网站首屏视觉冲击力较强,不妨试试这种「透明→白底」的双态导航,既能提升品牌调性又不影响可用性。


*作者:夏末浅笑

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

目录
  • 一、为什么要做"双态导航"
  • 二、HTML 结构:BEM 命名法
  • 三、CSS 实现:双态切换的核心
    • 导航链接的双态文字颜色:
    • 搜索框的双态
  • 四、JavaScript:滚动切换逻辑
  • 五、核心亮点
  • 六、扩展思考
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档