2026-04-17 06:16:08
要实现类似微信首页搜索框的优雅滑动隐藏和显示效果,需结合滚动事件监听、动态状态判断及CSS过渡动画。以下是具体实现方案:
核心实现步骤HTML结构确保搜索框为固定定位(position: fixed),并设置初始可见状态:
<div class="search-box">搜索框内容</div>CSS样式通过transform和transition实现平滑动画:
.search-box { position: fixed; top: 0; left: 0; width: 100%; height: 44px; /* 根据实际需求调整 */ background: #fff; transform: translateY(0); /* 初始显示 */ transition: transform 0.3s ease-in-out; /* 平滑过渡 */ z-index: 1000; /* 确保层级最高 */}.search-box.hidden { transform: translateY(-100%); /* 完全隐藏 */}JavaScript逻辑监听滚动事件,动态判断搜索框显示/隐藏状态:
function handleScroll() { const searchBox = document.querySelector('.search-box'); const offsetHeight = searchBox.offsetHeight; const scrollTop = document.documentElement.scrollTop || document.body.scrollTop; // 核心逻辑:滚动距离超过搜索框高度一半时隐藏 if (scrollTop < offsetHeight / 2) { searchBox.classList.remove('hidden'); } else { searchBox.classList.add('hidden'); } // 滚动停止检测(优化性能) clearTimeout(scrollTimer); scrollTimer = setTimeout(() => { // 滚动停止后的额外逻辑(可选) }, 100);}let scrollTimer;window.addEventListener('scroll', handleScroll);上滑/下滑差异化逻辑若需实现“上滑显示、下滑隐藏”(类似微信),可修改判断条件:
let lastScrollTop = 0;function handleScroll() { const scrollTop = document.documentElement.scrollTop; const delta = scrollTop - lastScrollTop; lastScrollTop = scrollTop; const searchBox = document.querySelector('.search-box'); if (delta > 0) { // 下滑 searchBox.classList.add('hidden'); } else { // 上滑 searchBox.classList.remove('hidden'); }}节流优化使用requestAnimationFrame或节流函数(throttle)减少滚动事件触发频率:
function throttle(func, delay) { let lastCall = 0; return function(...args) { const now = new Date().getTime(); if (now - lastCall < delay) return; lastCall = now; return func.apply(this, args); };}window.addEventListener('scroll', throttle(handleScroll, 50));动态高度适配若搜索框高度可变,需在显示/隐藏前重新获取offsetHeight:
function updateSearchBoxHeight() { const searchBox = document.querySelector('.search-box'); return searchBox.offsetHeight;}通过以上方法,可实现接近微信首页的流畅滑动效果,同时保持代码简洁和可维护性。