uniapp实现页面滚动显示隐藏自定义导航栏

**

方式设计的很全面 从封装工具类 到vue的原型挂载 到vuex的使用

基础不好不建议看****但是可以找关键代码复制
原理是:定义好的自定义导航栏让css属性opacity:0隐藏 利用uni的滚动事件的event滚动长度大于某一个值的时候 让自定义导航栏的动态class值为true触发 进而改变opacity:1实现显示

**
刚开始进来是隐藏自定义导航栏的
在这里插入图片描述
我上拉查看下面的参数信息的时候 顶部自定义导航栏出现
在这里插入图片描述
1.首先废话不多说实现这种肯定是自定义导航栏(在page.json里面的page取消原生导航栏)
在这里插入图片描述在这里插入图片描述
实施步骤
1.该代码是封装在工具类js文件里面的 config/tool.js


getNavWHdata() {
		console.log('获取导航信息');
		try {
			// 有时候getSystemInfoSync API在手机端会报错 所以我做了缓存,
			调用此方法先读取缓存 没缓存继续执行去获取数据 否则return终止
			const value = uni.getStorageSync('statusBar_key_hk');
			if (value) {
				let obj = {
					statusBarHeight: value.statusBarHeight,
					navBarHeight: value.navBarHeight,
					windowWidth: value.windowWidth,
				}
				console.log('获取缓存导航信息成功');
				this.$store.dispatch('addasync', obj)
				return
			}


			let obj = {}
			// 获取手机系统信息
			const info = uni.getSystemInfoSync()
			// 设置状态栏高度(H5顶部无状态栏小程序有状态栏需要撑起高度)
			obj.statusBarHeight = info.statusBarHeight
			//可使用窗口宽度
			obj.windowWidth = info.windowWidth

			// 获取胶囊的位置
			const menuButtonInfo = uni.getMenuButtonBoundingClientRect() 
			// (胶囊底部高度 - 状态栏的高度) + (胶囊顶部高度 - 状态栏内的高度) = 导航栏的高度
			obj.navBarHeight = (menuButtonInfo.bottom - info.statusBarHeight) + (menuButtonInfo.top - info
				.statusBarHeight)
			obj.windowWidth = menuButtonInfo.left
			//此处是调用的vuex的方法是把获取到的参数传输进去
			this.$store.dispatch('addasync', obj)
			uni.setStorage({
				key: 'statusBar_key_hk',
				data: obj,
				success: function() {
					console.log('缓存导航信息成功');
				}
			});
			return

		} catch (e) {
			console.log(e);
			//TODO handle the exception
			uni.showToast({
				title: '获取导航信息出错',
				icon: 'none'
			})
		}
	},

veux

在这里插入代码片
const store = new Vuex.Store({
	state: {
		/* 状态栏高度 */
		statusBarHeight: 39,
		/* 导航栏高度 */
		navBarHeight: 48,
		//可使用窗口宽度
		windowWidth: 255,
	},
	mutations: {
		tabarDara(state, value) {
			state.statusBarHeight = value.statusBarHeight
			state.navBarHeight = value.navBarHeight
			state.windowWidth = value.windowWidth
		}
	},
	actions: {
		addasync(context,data){
			context.commit('tabarDara',data)
		} 
	},
	//我们使用的时候直接调用getters(有计算属性的意思)  return出state的值
	getters:{
		statusBarHeight(state){
			return state.statusBarHeight
		},
		navBarHeight(state){
			return state.navBarHeight
		},
		windowWidth(state){
			return state.windowWidth
		}
	}
})

main.js程序入口

import tool from '@/config/tool.js' // 工具模块
Vue.prototype.$tool=tool//注册到Vue的原型对象上 方便随时拿取

App.vue 应用生命周期仅可在App.vue中监听,在其它页面监听无效
我们在App.vue直接获取该方法获取导航信息

export default {
		onLaunch: function() {
			// 我们已经吧工具类放在vue原型上直接this.工具类.使用的方法.apply(this//指定下this指向)
			this.$tool.getNavWHdata.apply(this) 
			console.log('App Launch');
		},
		onShow: function() {
			console.log('App Show')
		},
		onHide: function() {
			console.log('App Hide')
		}
	}

正常使用
**

原理是:定义好的自定义导航栏让css属性opacity:0隐藏 利用uni的滚动事件的event滚动长度大于某一个值的时候 让自定义导航栏的动态class值为true触发 进而改变opacity:1实现显示

子组件

**


<template>
	<view class="">
		<view class="navbar-fixed" :class="title_bg?'actve':''" >
			<!-- 状态栏小程序撑起高度 -->
			<view :style="{height:statusBarHeight+'px'}"></view>
			<!-- 状态栏的高度 -->
			<view class="navbar-content" :style="{height:navBarHeight+'px'}">
				<view class="navbar-search">
					<view class="imgbox" @tap="$tool.navigateBack()">
						<image class="img-bg" src="/static/icon/fanhui.png" mode=""></image>
					</view>
					<text class="navbar-search_text">{{titleText}}</text>
					<view class="navbar-serach"></view>
				</view>
			</view>
		</view>
		<!-- 需要添加占位符高度  状态栏高度+导航栏高度(否则下面tab会塌陷)-->
		<view v-if="ishowZw" :style="{height:statusBarHeight+navBarHeight+'px'}"></view>
	</view>
</template>

<script>
	import {
		mapGetters
	} from 'vuex'
	export default {
		name:'x-details-nav',
		props:{
			title_bg:{
				type:Boolean,
				default:false
			},
			titleText:{
				type:String,
				default:''
			},
			ishowZw:{
				type:Boolean,
				default:true
			}
		},
		data(){
			return {
				
			}
		},
		computed: {
			...mapGetters(['statusBarHeight', 'navBarHeight', 'windowWidth'])
		},
		methods: {
		}
	}
</script>

<style lang="scss">
	.navbar-fixed {
		position: fixed;
		top: 0;
		left: 0;
		z-index: 99;
		width: 100%;
		background: transparent;
		transition: all 0.3s;
		.navbar-content {
			display: flex;
			justify-content: center;
			align-items: center;
			height: 45px;
			box-sizing: border-box; 
			.navbar-search {
				position: relative;
				display: flex;
				align-items: center;
				justify-content: center;
				// padding: 0 10px;
				width: 100%;
				height: 30px;
				.imgbox{
					position: absolute;
					left: 0;
					margin: 0 20rpx;
					width: 65rpx;
					height: 65rpx;
					display: flex;
					align-items: center;
					justify-content: center;
					background: rgba(255,255,255,0.3);
					border-radius: 50%;
					image {
						
						width: 40rpx;
						height: 40rpx;
						margin-right: -12rpx;
					}
				}
				
				.img-bg{
					transition: all 0.3s;
				}
				.navbar-search_text {
					font-size: 30rpx;
					opacity: 0;
					transition: all 0.3s;
				}
			}
		}
	
	}
	.navbar-fixed.actve{
		background: #fff;
		box-shadow: 0rpx 0rpx 14rpx 0rpx rgba(0, 0, 0, 0.1);
		.navbar-search_text{
			opacity: 1 !important;
		}
	}
</style>

父组件

<template>
<view>
 <x-details-nav :ishowZw='false' :title_bg='navbaractive' titleText='商品详情'></x-details-nav>
</<view>>
</<template>
<script>
这里无需引入import子组件 原因看下面
 methods:{},
 //该事件和methods是平级的
 //监听界面滚动事件
 onPageScroll(e) {
			if (e.scrollTop > 100) {
				this.navbaractive = true
			} else if (e.scrollTop < 100) {
				this.navbaractive = false
			}
		},
</script>

**具体原因:**子组件存放的位置 components/x-details-nav/x-details-nav.vue
在这里插入图片描述
在pages.json定义easycom标准

"easycom": {
			//熟悉不 引入uview组件配置项
		"^u-(.*)": "@/uview-ui/components/u-$1/u-$1.vue",
		//自定义组件配置项
		"^x-(.*)": "@/components/x-$1/x-$1.vue"
	},

官网的说法 easycom组件规范 Hb2.5.5支持 所以为了保险起见建议加上
“^x-(.*)”: “@/components/x-$1/x-$1.vue”
在这里插入图片描述

                                      **

欢迎留言进行提取建议

**
在这里插入图片描述

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Uniapp中,可以通过配置文件pages.json来设置自定义导航栏样式。具体的配置如下所示: 在pages.json中,可以为每个页面设置导航栏样式。例如,可以在某个页面的配置项中添加"navigationStyle":"custom"来取消默认的原生导航栏,只保留右上角的胶囊按钮。同时,可以设置navigationBarTitleText来指定导航栏的标题文字颜色,navigationBarTextStyle来指定导航栏的文字样式。 在页面的模板文件中,可以使用自定义导航栏样式。例如,可以在模板文件中添加一个view元素,设置class为"status_bar"来表示状态栏的样式。可以在该view元素中添加其他的子元素,来实现自定义导航栏内容。 同时,可以通过CSS样式来设置导航栏的样式。可以为状态栏设置固定的高度和宽度,并设置背景色、位置等属性。可以为导航栏中的文字内容设置样式,如字体大小、颜色等。 需要注意的是,如果只写了一部分CSS样式,自定义的标题栏内容可能会随着页面滚动而移动。为了固定在页面的头部,可以设置position为fixed,并指定top属性为0。 综上所述,Uniapp实现自定义导航栏样式的步骤包括: 1. 在pages.json中为每个页面设置导航栏样式,包括取消默认导航栏和设置标题文字颜色等。 2. 在页面的模板文件中添加自定义导航栏的HTML结构,可以使用view元素来表示状态栏和导航栏内容。 3. 使用CSS样式来设置导航栏的样式,包括状态栏的高度、背景色等,以及导航栏内容的样式。 希望以上信息对您有所帮助。\[1\]\[2\]\[3\] #### 引用[.reference_title] - *1* *2* *3* [uni-app 小程序自定义导航栏](https://blog.csdn.net/weixin_44711440/article/details/116486458)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值