当前位置: 首页 > news >正文

uniapp-vue2导航栏全局自动下拉变色

全局自动下拉变色解决方案
雀语文章地址
📖 项目简介
这是一个基于 Vue.js 和 uni-app 的全局自动下拉变色解决方案,通过全局 mixin 实现页面滚动时导航栏的自动颜色变化效果。
✨ 核心特性
● 🎯 全局自动生效:无需在每个页面手动导入,自动为所有页面添加滚动监听
● 🎨 智能颜色变化:根据滚动位置自动调整导航栏背景色和文字颜色
● 📱 跨平台兼容:支持微信小程序、H5、App 等多端
● ⚡ 性能优化:使用节流函数优化滚动事件处理
● 🔧 易于配置:支持自定义颜色配置和触发阈值
🏗️ 项目结构
buddhism/
├── mixins/
│ └── page-scroll-mixin.js # 全局滚动监听 mixin
├── components/
│ └── custom-navbar/
│ └── custom-navbar.vue # 自定义导航栏组件
├── main.js # 全局 mixin 注册
└── pages/
└── basePage/
└── basePage.vue # 示例页面
🚀 快速开始

  1. 安装依赖

  2. 全局配置
    在 main.js 中已经配置了全局 mixin:
    import PageScrollMixin from ‘./mixins/page-scroll-mixin.js’

// 注册全局 mixin
Vue.mixin(PageScrollMixin)
3. 使用导航栏组件
在任何页面中直接使用 custom-navbar 组件:



<custom-navbar
title=“页面标题”
:show-back=“true”
@back=“goBack”
ref=“customNavbar”//必写
/>

<!-- 页面内容 -->
<view class="content"><!-- 你的页面内容 -->
</view>

📋 核心文件说明

  1. mixins/page-scroll-mixin.js
    全局滚动监听 mixin,为所有页面提供滚动事件处理:
    export default {
    data() {
    return {
    scrollTop: 0,
    navbarOpacity: 0,
    navbarTextColor: ‘#000000’,
    navbarBgColor: ‘rgba(255, 255, 255, 0)’
    }
    },

onPageScroll(e) {
this.handlePageScroll(e)
},

methods: {
handlePageScroll(e) {
// 节流处理滚动事件
if (this.scrollTimer) return

  this.scrollTimer = setTimeout(() => {this.scrollTop = e.scrollTopthis.updateNavbarStyle()this.scrollTimer = null}, 16) // 约60fps
},updateNavbarStyle() {// 根据滚动位置更新导航栏样式const opacity = Math.min(this.scrollTop / 100, 1)this.navbarOpacity = opacityif (opacity > 0.5) {this.navbarTextColor = '#000000'this.navbarBgColor = `rgba(255, 255, 255, ${opacity})`} else {this.navbarTextColor = '#ffffff'this.navbarBgColor = `rgba(255, 255, 255, ${opacity})`}
}

}
}
2. components/custom-navbar/custom-navbar.vue
自定义导航栏组件,支持动态样式变化:

<view
class=“custom-navbar”
:style=“navbarStyle”

<view class="navbar-content"><view v-if="showBack" class="back-btn"@click="handleBack"><text class="back-icon">‹</text></view><text class="navbar-title":style="{ color: navbarTextColor }">{{ title }}</text>
</view>

computed: {
navbarStyle() {
return {
backgroundColor: this.navbarBgColor,
color: this.navbarTextColor
}
}
},

methods: {
handleBack() {
this.$emit(‘back’)
}
}
}

🎨 自定义配置
修改颜色配置
在 mixins/page-scroll-mixin.js 中可以自定义颜色:
updateNavbarStyle() {
const opacity = Math.min(this.scrollTop / 100, 1)
this.navbarOpacity = opacity

// 自定义颜色逻辑
if (opacity > 0.5) {
this.navbarTextColor = ‘#333333’ // 深色文字
this.navbarBgColor = rgba(255, 255, 255, ${opacity})
} else {
this.navbarTextColor = ‘#ffffff’ // 白色文字
this.navbarBgColor = rgba(0, 0, 0, ${opacity * 0.3})
}
}
修改触发阈值
调整滚动距离阈值:
// 将 100 改为你想要的阈值
const opacity = Math.min(this.scrollTop / 50, 1) // 50px 开始变化
📱 使用示例
基础页面


<custom-navbar
title=“首页”
:show-back=“false”
ref=“customNavbar”//必写
/>

<view class="content"><view class="banner"><image src="/static/banner.jpg" mode="aspectFill" /></view><view class="list"><view v-for="item in 20" :key="item"class="list-item">列表项 {{ item }}</view></view>
</view>

.content {
padding-top: 44px; /* 导航栏高度 */
}

.banner {
height: 200px;
background: linear-gradient(45deg, #667eea, #764ba2);
}

.list-item {
padding: 15px;
margin: 10px;
background: white;
border-radius: 8px;
box-shadow: 0 2px 8px rgba(0,0,0,0.1);
}

详情页面


<custom-navbar
title=“详情页”
:show-back=“true”
@back=“goBack”
/>

<view class="content"><view class="hero-image"><image src="/static/detail.jpg" mode="aspectFill" /></view><view class="detail-content"><text class="title">详情标题</text><text class="description">详情描述内容...</text></view>
</view>

🔧 技术实现
核心原理

  1. 全局 Mixin:通过 Vue 的全局 mixin 机制,为所有页面自动注入滚动监听
  2. 节流优化:使用 setTimeout 实现 60fps 的滚动事件节流
  3. 动态样式:根据滚动位置计算透明度,实现平滑的颜色过渡
  4. 响应式数据:通过 Vue 的响应式系统,自动更新导航栏样式
    性能优化
    ● ✅ 滚动事件节流(16ms 间隔)
    ● ✅ 使用 computed 属性缓存样式计算
    ● ✅ 避免频繁的 DOM 操作
    ● ✅ 合理的内存管理
    🐛 常见问题
    Q: 导航栏不显示?
    A: 确保页面内容有足够的高度可以滚动,并且设置了正确的 padding-top
    Q: 颜色变化不明显?
    A: 检查背景图片的对比度,可以调整颜色配置或透明度
    Q: 在某些页面不需要效果?
    A: 可以在特定页面中覆盖 mixin 的方法:
    export default {
    onPageScroll() {
    // 覆盖全局 mixin,不执行滚动处理
    }
    }

🤝 贡献
欢迎提交 Issue 和 Pull Request!

注意:此解决方案专为 uni-app 项目设计,确保在目标平台上测试兼容性。

全局导航栏组件,自动实现下拉透明到纯色

import PageScrollMixin from ‘./mixins/page-scroll-mixin.js’

// 注册全局 mixin
Vue.mixin(PageScrollMixin)
/**

  • 页面滚动监听 Mixin
  • 用于自动处理 custom-navbar 组件的滚动事件传递
  • 使用方法:
    1. 在页面中引入此 mixin
    1. 确保 custom-navbar 组件有 ref=“customNavbar”(默认)或自定义 ref
    1. 自动处理滚动事件传递
  • 配置选项:
    • scrollRefs: 需要传递滚动事件的组件 ref 数组,默认为 [‘customNavbar’]
  • 使用示例:
  • // 基础用法(使用默认 ref=“customNavbar”)
  • export default {
  • mixins: [PageScrollMixin],
  • // … 其他配置
  • }
  • // 自定义 ref 名称
  • export default {
  • mixins: [PageScrollMixin],
  • scrollRefs: [‘myNavbar’], // 自定义 ref 名称
  • // … 其他配置
  • }
  • // 多个组件
  • export default {
  • mixins: [PageScrollMixin],
  • scrollRefs: [‘customNavbar’, ‘floatingButton’], // 多个组件
  • // … 其他配置
  • }
    */

export default {
data() {
return {
// 默认的滚动组件 ref 列表
scrollRefs: this.$options.scrollRefs || [‘customNavbar’]
};
},

// 页面生命周期
onPageScroll(e) {
// 自动将页面滚动事件传递给所有配置的组件
this.scrollRefs.forEach(refName => {
if (this.KaTeX parse error: Expected 'EOF', got '&' at position 15: refs[refName] &̲& typeof this.refs[refName].handlePageScroll === ‘function’) {
this.$refs[refName].handlePageScroll(e);
}
});
}
};



<!-- 自定义导航栏 -->
<view class="custom-navbar" :class="{ 'navbar-scrolled': isScrolled }":style="{ paddingTop: statusBarHeight + 'px', height: navBarHeight + 'px',backgroundColor: isScrolled ? backgroundColor : 'transparent'}"
><view class="navbar-left" @click="handleBack" :style="{ height: capsuleHeight + 'px', lineHeight: capsuleHeight + 'px' }"><image :src="backIcon" mode="aspectFit" class="back-icon"></image></view><view class="navbar-title" :style="{ height: capsuleHeight + 'px', lineHeight: capsuleHeight + 'px' }">{{ title }}</view><view class="navbar-right" :style="{ height: capsuleHeight + 'px', lineHeight: capsuleHeight + 'px' }"><slot name="right"></slot></view>
</view>

颜色是在枚举中是 #FFFFFF
图片都是 网络地址

雀语文章地址

http://www.lryc.cn/news/612845.html

相关文章:

  • 护网行动之后:容器安全如何升级?微隔离打造内网“微堡垒”
  • imx6ull-驱动开发篇12——GPIO子系统驱动LED
  • Android Studio(2025.1.2)Gemini Agent 使用指南
  • 如何使用 pnpm创建Vue 3 项目
  • Vue内置动画组件 Transition
  • 【FreeRTOS】(号外)任务间通讯2: 信号量- Counting Semaphore
  • 前端发布 发布前端项目流程
  • Spring AI + Redis:构建高效AI应用缓存方案
  • 华为 2025 校招目标院校
  • 杂谈:大模型与垂直场景融合的技术趋势
  • 高通芯片漏洞被在野利用,谷歌发布紧急安卓补丁
  • Swift 实战:高效设计 Tic-Tac-Toe 游戏逻辑(LeetCode 348)
  • ansible-playbook之yum
  • Daemon Tools for Mac —— 专业虚拟光驱与磁盘映像工具
  • LeetCode 面试经典 150_数组/字符串_除自身以外数组的乘积(13_238_C++_中等)(前缀积)
  • 数据结构初阶(5)队列
  • java - 深拷贝 浅拷贝
  • KT148A 语音芯片自研板烧录方案:接口预留与电路连接指南
  • 线上业务突然流量掉 0 ?一次 DNS 污染排查与自救实录
  • itextPdf获取pdf文件宽高不准确
  • 无人机航拍数据集|第8期 无人机海上目标检测YOLO数据集3641张yolov11/yolov8/yolov5可训练
  • BES2700量产项目
  • 7. 什么是事件委托
  • 经营帮:重构企业经营全流程,打造产业互联网新生态
  • 上位机知识篇---AT指令
  • LabVIEW实验室测试框架
  • 复合机器人破局之路:如何逆袭突围
  • 强化学习详解:从理论到前沿的全面解析
  • 知识随记-----Qt 实用技巧:自定义倒计时按钮防止用户频繁点击
  • GitHub 趋势日报 (2025年08月06日)