buddhism/components/custom-navbar/README.md

277 lines
6.4 KiB
Markdown
Raw Normal View History

2025-10-14 11:00:34 +08:00
# 自定义变色导航栏组件
## 概述
这是一个支持滚动时动态变色的自定义导航栏组件,通过配合 `page-scroll-mixin.js` 实现页面滚动监听和导航栏样式自动切换。
## 功能特性
2025-10-14 11:00:34 +08:00
-**自适应系统状态栏**:自动适配不同设备的状态栏高度
-**滚动变色效果**:页面滚动时导航栏背景色和阴影自动切换
-**平滑过渡动画**CSS 过渡效果让颜色变化更自然
-**可配置参数**:支持自定义滚动阈值、背景色等
-**事件系统**:提供丰富的滚动事件供父组件监听
-**插槽支持**:右侧支持自定义内容
-**全局混入**:通过 Mixin 实现滚动逻辑自动处理
## 文件结构
```
components/custom-navbar/
├── custom-navbar.vue # 导航栏组件
├── README.md # 文档说明
mixins/
├── page-scroll-mixin.js # 滚动监听混入
main.js # 全局混入注册
```
## 核心组件
### 1. custom-navbar.vue
#### Props 配置
| 参数 | 类型 | 默认值 | 说明 |
|------|------|--------|------|
| title | String | "" | 导航栏标题 |
| backIcon | String | CommonEnum.BACK_BUTTON | 返回按钮图标 |
| showBack | Boolean | true | 是否显示返回按钮 |
| backgroundColor | String | CommonEnum.BASE_COLOR | 滚动时的背景色 |
| scrollThreshold | Number | 20 | 滚动阈值px |
| enableScrollEffect | Boolean | true | 是否启用滚动效果 |
#### 事件
| 事件名 | 参数 | 说明 |
|--------|------|------|
| back | - | 点击返回按钮时触发 |
| scroll-change | { isScrolled, scrollTop } | 滚动状态变化时触发 |
| scroll | { scrollTop, isScrolled } | 滚动时触发 |
#### 方法
| 方法名 | 参数 | 说明 |
|--------|------|------|
| handlePageScroll | e | 处理页面滚动事件(供 Mixin 调用) |
| setScrollState | scrollTop | 手动设置滚动状态 |
### 2. page-scroll-mixin.js
#### 功能
- 自动监听页面滚动事件
- 将滚动事件传递给配置的组件
- 支持多个组件同时监听
#### 配置选项
- `scrollRefs`: 需要传递滚动事件的组件 ref 数组,默认为 `['customNavbar']`
## 使用方法
2025-10-14 11:00:34 +08:00
### 1. 基础用法
```vue
<template>
2025-10-14 11:00:34 +08:00
<view class="page">
<custom-navbar ref="customNavbar" title="页面标题" />
2025-08-07 17:30:36 +08:00
<!-- 页面内容 -->
</view>
</template>
2025-10-14 11:00:34 +08:00
<script>
export default {
// 无需额外配置,全局混入已自动处理
}
</script>
2025-08-07 17:30:36 +08:00
```
2025-10-14 11:00:34 +08:00
### 2. 自定义配置
2025-08-07 17:30:36 +08:00
```vue
<template>
2025-10-14 11:00:34 +08:00
<view class="page">
<custom-navbar
ref="customNavbar"
title="自定义标题"
:scroll-threshold="50"
background-color="#ff6b6b"
2025-08-07 17:30:36 +08:00
@scroll-change="onScrollChange"
2025-10-14 11:00:34 +08:00
/>
2025-08-07 17:30:36 +08:00
</view>
</template>
<script>
2025-10-14 11:00:34 +08:00
export default {
methods: {
onScrollChange(data) {
console.log('滚动状态:', data.isScrolled);
console.log('滚动距离:', data.scrollTop);
}
}
2025-10-14 11:00:34 +08:00
}
</script>
```
2025-10-14 11:00:34 +08:00
### 3. 多个组件监听
2025-10-14 11:00:34 +08:00
```vue
<template>
<view class="page">
<custom-navbar ref="customNavbar" title="页面标题" />
<floating-button ref="floatingButton" />
</view>
</template>
2025-10-14 11:00:34 +08:00
<script>
export default {
scrollRefs: ['customNavbar', 'floatingButton']
}
</script>
```
2025-10-14 11:00:34 +08:00
### 4. 自定义右侧内容
2025-10-14 11:00:34 +08:00
```vue
<template>
<custom-navbar title="页面标题">
<template #right>
<view class="custom-right">
<text>自定义</text>
</view>
</template>
</custom-navbar>
</template>
```
2025-10-14 11:00:34 +08:00
## 全局配置
2025-10-14 11:00:34 +08:00
### main.js 中的配置
2025-10-14 11:00:34 +08:00
```javascript
// 引入滚动混入
import PageScrollMixin from "./mixins/page-scroll-mixin.js";
2025-10-14 11:00:34 +08:00
// 注册全局混入
Vue.mixin(PageScrollMixin);
```
2025-10-14 11:00:34 +08:00
通过全局混入,所有页面都会自动支持滚动监听功能。
2025-10-14 11:00:34 +08:00
## 样式说明
2025-10-14 11:00:34 +08:00
### 核心样式类
2025-10-14 11:00:34 +08:00
```scss
.custom-navbar {
position: fixed;
top: 0;
left: 0;
right: 0;
z-index: 999;
background-color: transparent;
transition: background-color 0.3s ease; /* 平滑过渡 */
}
2025-10-14 11:00:34 +08:00
.navbar-scrolled {
box-shadow: 0 2rpx 10rpx rgba(0, 0, 0, 0.1); /* 滚动时阴影 */
}
```
2025-08-07 17:30:36 +08:00
2025-10-14 11:00:34 +08:00
### 自适应布局
- **状态栏适配**`paddingTop: statusBarHeight`
- **胶囊按钮适配**:自动计算导航栏高度
- **填充区**:避免内容被导航栏遮挡
## 工作原理
### 1. 滚动监听流程
```mermaid
graph TD
A[页面滚动] --> B[onPageScroll 触发]
B --> C[Mixin 分发事件]
C --> D[customNavbar.handlePageScroll]
D --> E[判断滚动阈值]
E --> F{超过阈值?}
F -->|是| G[设置 isScrolled = true]
F -->|否| H[设置 isScrolled = false]
G --> I[更新样式和阴影]
H --> I
I --> J[触发 scroll-change 事件]
```
### 2. 样式切换机制
```javascript
// 动态样式绑定
:style="{
backgroundColor: isScrolled ? backgroundColor : 'transparent',
}"
// 动态类名绑定
:class="{ 'navbar-scrolled': isScrolled }"
2025-08-07 17:30:36 +08:00
```
2025-10-14 11:00:34 +08:00
## 实际应用示例
### activity.vue 页面使用
2025-08-07 17:30:36 +08:00
```vue
<template>
2025-10-14 11:00:34 +08:00
<view class="page">
<custom-navbar ref="customNavbar" title="寺庙活动" />
<view class="header">
<!-- 页面内容 -->
</view>
2025-08-07 17:30:36 +08:00
</view>
</template>
<script>
2025-10-14 11:00:34 +08:00
export default {
// 自动支持滚动监听,无需额外配置
}
2025-08-07 17:30:36 +08:00
</script>
2025-08-14 11:22:53 +08:00
```
2025-10-14 11:00:34 +08:00
## 最佳实践
### 1. 性能优化
- 使用 `enableScrollEffect` 控制是否启用滚动效果
- 合理设置 `scrollThreshold` 避免频繁切换
### 2. 样式定制
- 通过 `backgroundColor` 属性自定义滚动时的背景色
- 使用 CSS 变量实现主题切换
### 3. 事件处理
- 监听 `scroll-change` 事件处理滚动状态变化
- 使用 `scroll` 事件获取实时滚动信息
## 注意事项
1. **必须设置 ref**:组件必须有 `ref="customNavbar"` 属性
2. **全局混入**:确保在 `main.js` 中注册了 `PageScrollMixin`
3. **系统适配**:组件会自动适配不同设备的状态栏高度
4. **性能考虑**:滚动监听可能影响性能,建议在不需要时禁用
## 故障排除
### 常见问题
1. **滚动效果不生效**
- 检查是否正确设置了 `ref="customNavbar"`
- 确认 `enableScrollEffect``true`
2. **样式异常**
- 检查 `backgroundColor` 属性是否正确设置
- 确认 CSS 样式没有被其他样式覆盖
3. **事件不触发**
- 确认全局混入已正确注册
- 检查组件是否正确引入
## 更新日志
- **v1.0.0**: 初始版本,支持基础滚动变色功能
- **v1.1.0**: 添加全局混入支持,简化使用方式
- **v1.2.0**: 优化性能,添加可配置选项