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


理想画室是一家线下美术培训机构,官网首页有大幅轮播图,视觉冲击力要强。如果导航栏一上来就是白底,会让首屏被"截断感,破坏沉浸式体验。
所以我们采用「首屏透明、,透明红底半透明红底背景图+渐变遮罩」的顶部与首屏顶部透明→滚动后切换为白底+阴影。这样两个状态。
两种状态的核心差异:
| 状态 | 背景 | 文字颜色 | Logo | 搜索框 |
|---|---|---|---|---|
| 顶部(未滚动 | 红底+背景图+渐变 | 白色 | 白色 Logo | 半透明白框、透明 |
| 滚动后(scrolled) | 纯白底+阴影 | 深灰 #333 | 黑色 Logo | 浅灰底、灰字 |
采用 BEM(Block Element Modifier)命名规范,便于在多个页面和模块清晰、便于维护。
<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>结构清晰,三级:
header — 整个导航块header\_\_container、header\_\_logo、header\_\_nav、header\_\_searchheader\_\_nav-link--active — 当前页高亮/\* ===== 基础样式:顶部透明红底背景图 + 渐变遮罩 \*/
.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; }.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 加一个类,所有子元素的颜色、背景、边框全部联动。
.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;
}(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,切换平滑过渡,不会有生硬的"跳变"感。
这套双态导航的核心思路是「首屏沉浸 + 滚动后实用」。首屏让用户沉浸在品牌氛围里,滚动后立即提供清晰的导航信息。适用于:
如果你的网站首屏视觉冲击力较强,不妨试试这种「透明→白底」的双态导航,既能提升品牌调性又不影响可用性。
*作者:夏末浅笑
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。