Browse Source

实现搜索框下滑隐藏上滑展示,选择时固定展示功能

pull/1/head
Trae AI 2 months ago
parent
commit
5dbfd70146
  1. 35
      pages/index/index.js
  2. 2
      pages/index/index.wxml
  3. 26
      pages/index/index.wxss

35
pages/index/index.js

@ -26,6 +26,7 @@ Page({
lastScrollTop: 0, lastScrollTop: 0,
isScrollLocked: false, isScrollLocked: false,
isSearchBarFullyHidden: false, isSearchBarFullyHidden: false,
isSearchBarFocused: false,
// 回到顶部按钮 // 回到顶部按钮
showBackToTop: false, showBackToTop: false,
@ -688,6 +689,23 @@ Page({
}) })
}, },
// 搜索框获得焦点
onSearchFocus: function() {
// 当搜索框获得焦点时,固定显示搜索框,不隐藏
this.setData({
isSearchBarFocused: true,
isSearchBarFullyHidden: false
})
},
// 搜索框失去焦点
onSearchBlur: function() {
// 当搜索框失去焦点时,恢复正常的隐藏逻辑
this.setData({
isSearchBarFocused: false
})
},
// 切换地区选择器 // 切换地区选择器
toggleRegionPicker: function() { toggleRegionPicker: function() {
this.setData({ this.setData({
@ -848,21 +866,26 @@ Page({
// 滚动事件处理 // 滚动事件处理
onScroll: function(e) { onScroll: function(e) {
const { scrollTop } = e.detail; const { scrollTop } = e.detail;
const lastScrollTop = this.data.lastScrollTop;
// 只控制搜索区域的完全显示/隐藏状态,使用CSS类统一控制过渡效果 // 只控制搜索区域的完全显示/隐藏状态,使用CSS类统一控制过渡效果
// 简化逻辑,避免iOS上的兼容性问题 let isSearchBarFullyHidden = this.data.isSearchBarFullyHidden;
let isSearchBarFullyHidden = false;
// 增加iOS兼容性处理,使用更简单的触发逻辑 // 如果搜索框被选中,则不隐藏
if (!this.data.isSearchBarFocused) {
// 判断滚动方向
if (scrollTop > lastScrollTop) {
// 向下滚动,隐藏搜索框
if (scrollTop > 150) { if (scrollTop > 150) {
// 当滚动距离超过150rpx时,完全隐藏搜索区域
isSearchBarFullyHidden = true; isSearchBarFullyHidden = true;
} }
} else {
// 当滚动回到顶部时,显示搜索区域 // 向上滚动,显示搜索框
if (scrollTop <= 100) { if (scrollTop <= 100) {
isSearchBarFullyHidden = false; isSearchBarFullyHidden = false;
} }
}
}
// 更新搜索框状态 // 更新搜索框状态
this.setData({ this.setData({

2
pages/index/index.wxml

@ -23,6 +23,8 @@
placeholder-class="search-placeholder" placeholder-class="search-placeholder"
value="{{searchKeyword}}" value="{{searchKeyword}}"
bindinput="onSearchInput" bindinput="onSearchInput"
bindfocus="onSearchFocus"
bindblur="onSearchBlur"
/> />
</view> </view>
<button class="search-button" bindtap="searchGoods">搜索</button> <button class="search-button" bindtap="searchGoods">搜索</button>

26
pages/index/index.wxss

@ -25,30 +25,24 @@ page {
padding: 10rpx 0; padding: 10rpx 0;
margin-bottom: 20rpx; margin-bottom: 20rpx;
overflow: hidden; overflow: hidden;
transition: opacity 0.4s ease-in-out, transform 0.4s ease-in-out, visibility 0.4s ease-in-out; transition: max-height 0.4s ease-in-out, opacity 0.4s ease-in-out, transform 0.4s ease-in-out, margin-bottom 0.4s ease-in-out, padding 0.4s ease-in-out;
-webkit-transition: opacity 0.4s ease-in-out, -webkit-transform 0.4s ease-in-out, visibility 0.4s ease-in-out; -webkit-transition: max-height 0.4s ease-in-out, opacity 0.4s ease-in-out, -webkit-transform 0.4s ease-in-out, margin-bottom 0.4s ease-in-out, padding 0.4s ease-in-out;
will-change: opacity, transform; will-change: opacity, transform, max-height, margin;
max-height: 200rpx;
opacity: 1; opacity: 1;
transform: translateY(0); transform: translateY(0);
-webkit-transform: translateY(0); -webkit-transform: translateY(0);
visibility: visible;
height: auto;
/* 固定高度,避免iOS上的布局抖动 */
min-height: 160rpx;
} }
/* 顶部搜索区域完全隐藏状态 - 用于平滑收缩高度 */ /* 顶部搜索区域完全隐藏状态 - 用于平滑收缩高度 */
.top-hidden { .top-hidden {
opacity: 0; max-height: 0;
transform: translateY(-100%); padding: 0;
-webkit-transform: translateY(-100%); margin-bottom: 0;
pointer-events: none; pointer-events: none;
visibility: hidden; opacity: 0;
/* 保持高度不变,避免iOS上的布局抖动 */ transform: translateY(-20rpx);
height: auto; -webkit-transform: translateY(-20rpx);
min-height: 160rpx;
padding: 10rpx 0;
margin-bottom: 20rpx;
} }
/* 标题样式 */ /* 标题样式 */

Loading…
Cancel
Save