设计初衷
在开发页面时,往往需要实现,点击页面的导航菜单页面滚动到相应位置,滚动页面实现菜单选项的高亮。在html开发中,我们可以用到a标签锚点实现,jq的动画相结合实现类似效果。在框架中vant UI框架也为我们实现了这一效果。
效果展示
当菜单导航滚动到页面顶部时,菜单吸顶
当点击菜单按钮时,切换到对应区域(过渡到该区域,有动画效果)
当内容区滚动到某类区域时,对应区域的菜单按钮高亮
设计思路
1、吸顶效果的实现
获取菜单导航距离页面顶部距离wx.createSelectorQuery()
页面滚动监听
滚动距离与菜单初始位置值比较
1) 距离
constquery=wx.createSelectorQuery()query.select('.menu_nav').boundingClientRect(function(res){letobj={}if(res&&res.top){obj[item.attr]=parseInt(res.top)}}).exec()
① wx.createSelectorQuery()
返回一个 SelectorQuery 对象实例。在自定义组件或包含自定义组件的页面中,应使用 this.createSelectorQuery() 来代替。
② SelectorQuery.select(string selector)
在当前页面下选择第一个匹配选择器 selector 的节点。返回一个 NodesRef 对象实例,可以用于获取节点信息。
selector 语法
selector类似于 CSS 的选择器,但仅支持下列语法。
属性类型说明idstring节点的 IDdatasetObject节点的 datasetleftnumber节点的左边界坐标rightnumber节点的右边界坐标topnumber节点的上边界坐标bottomnumber节点的下边界坐标widthnumber节点的宽度heightnumber节点的高度
③ NodesRef.boundingClientRect(function callback)
添加节点的布局位置的查询请求。相对于显示区域,以像素为单位。其功能类似于 DOM 的 getBoundingClientRect。返回 NodesRef 对应的 SelectorQuery。
属性类型说明idstring节点的 IDdatasetObject节点的 datasetleftnumber节点的左边界坐标rightnumber节点的右边界坐标topnumber节点的上边界坐标bottomnumber节点的下边界坐标widthnumber节点的宽度heightnumber节点的高度
④ SelectorQuery.exec(function callback)
执行所有的请求。请求结果按请求次序构成数组,在callback的第一个参数中返回。
2) 页面滚动监听
data中初始化–tabFixed=false(表示是否固定定位)
滚动条滚动距离超过了菜单初始距离时,tabFixed=true开启定位
//监听页面滚动onPageScroll:function(e){lethTop=parseInt(e.scrollTop)//菜单是否需要定位到顶部if(hTop>this.data.menu_top){this.setData({tabFixed:true})}else{this.setData({tabFixed:false})}}
onPageScroll(Object object))
监听用户滑动页面事件。
参数 Object object:
属性类型说明scrollTopNumber页面在垂直方向已滚动的距离(单位px)
注意:请只在需要的时候才在 page 中定义此方法,不要定义空方法。以减少不必要的事件派发对渲染层-逻辑层通信的影响。 注意:请避免在 onPageScroll 中过于频繁的执行 setData 等引起逻辑层-渲染层通信的操作。尤其是每次传输大量数据,会影响通信耗时。
2、切换到对应区域
记录当前点击的菜单并高亮
获取每个区域初始距离页面顶部距离
设置当前页面滚动条滚动到的位置,设置过度时间
//导航栏切换设置setSelectType(event){letindex=event.currentTarget.dataset.typethis.setData({tabIndex:index,})letarr=['panel1_top','panel2_top','panel3_top','panel4_top']let_this=thiswx.pageScrollTo({scrollTop:_this.data[arr[index]],duration:500})},
wx.pageScrollTo(Object object)
将页面滚动到目标位置,支持选择器和滚动距离两种方式定位
属性类型默认值必填说明scrollTopnumber无否滚动到页面的目标位置,单位 pxdurationnumber300否滚动动画的时长,单位 msselectorstring无否选择器 2.7.3successfunction无否接口调用成功的回调函数failfunction无否接口调用失败的回调函数completeunction无否接口调用结束的回调函数(调用成功、失败都会执行)
3) 滚动到某类区域时,对应区域的菜单按钮高亮
获取初始时区域距离顶端距离
letarr=[{name:'.menu-nav',attr:'menu_top',addNum:0},{name:'.panel1',attr:'panel1_top',addNum:0},{name:'.panel2',attr:'panel2_top',addNum:0},{name:'.panel3',attr:'panel3_top',addNum:0},{name:'.panel4',attr:'panel4_top',addNum:0},]arr.forEach((item,i)=>{wx.createSelectorQuery().select(item.name).boundingClientRect(function(res){letobj={}if(res&&res.top){obj[item.attr]=parseInt(res.top)if(item.addNum){obj[item.attr]+=item.addNum}that.setData({…obj})}}).exec()})
滚动监听是否超过了该区域
//监听页面滚动onPageScroll:function(e){lethTop=parseInt(e.scrollTop)//自动切换菜单lettab=0if(hTop>=(this.data['panel4_top']-this.data.menu_top)){tab=3}elseif(hTop>=(this.data['panel3_top']-this.data.menu_top)){tab=2}elseif(hTop>=(this.data['panel2_top']-this.data.menu_top)){tab=1}this.setData({tabIndex:tab,})},
完整代码
index.js
//pages/index/index.jsPage({/***页面的初始数据*/data:{tabIndex:0,//当前处于那个菜单menuList:['菜单1','菜单2','菜单3','菜单4'],//导航菜单tabFixed:false,//是否定位//初始页面距离顶部距离menu_top:0,panel1_top:0,panel2_top:0,panel3_top:0,panel4_top:0,},/***生命周期函数–监听页面加载*/onLoad:function(options){},onShow:function(options){this.getTopDistance()},//获取距离页面顶部高度getTopDistance(){letthat=thisletarr=[{name:'.menu-nav',attr:'menu_top',addNum:0},{name:'.panel1',attr:'panel1_top',addNum:0},{name:'.panel2',attr:'panel2_top',addNum:0},{name:'.panel3',attr:'panel3_top',addNum:0},{name:'.panel4',attr:'panel4_top',addNum:0},]arr.forEach((item,i)=>{wx.createSelectorQuery().select(item.name).boundingClientRect(function(res){letobj={}if(res&&res.top){obj[item.attr]=parseInt(res.top)if(item.addNum){obj[item.attr]+=item.addNum}that.setData({…obj})}}).exec()})},//导航栏切换设置setSelectType(event){letindex=event.currentTarget.dataset.typethis.setData({tabIndex:index,})letarr=['panel1_top','panel2_top','panel3_top','panel4_top']let_this=thiswx.pageScrollTo({scrollTop:_this.data[arr[index]],duration:500})},//监听页面滚动onPageScroll:function(e){lethTop=parseInt(e.scrollTop)//菜单是否需要定位到顶部if(hTop>this.data.menu_top){this.setData({tabFixed:true})}else{this.setData({tabFixed:false})}//自动切换菜单if(hTop>=(this.data['panel4_top']-this.data.menu_top)){this.setData({tabIndex:3,})}elseif(hTop>=(this.data['panel3_top']-this.data.menu_top)){this.setData({tabIndex:2,})}elseif(hTop>=(this.data['panel2_top']-this.data.menu_top)){this.setData({tabIndex:1,})}else{this.setData({tabIndex:0,})}},})
index.wxml
<viewclass="Main"><viewclass="head">我是头部区域</view><viewclass="{{tabFixed?'is-fixed':''}}menu-nav"><textwx:for="{{menuList}}"class="{{tabIndex==index?'is-select':''}}"bind:tap="setSelectType"data-type='{{index}}'>{{item}}</text></view><viewclass="content"><viewclass="panel1panel">页面1</view><viewclass="panel2panel">页面2</view><viewclass="panel3panel">页面3</view><viewclass="panel4panel">页面4</view></view></view>
index.wxss
.menu-nav{display:flex;align-items:center;justify-content:space-around;color:black;padding:10px0;width:100%;background-color:white;}.is-select{color:red;}.head{display:flex;align-items:center;justify-content:center;font-size:40px;height:120px;background-color:greenyellow;}.is-fixed{position:fixed;top:0;}.panel{display:flex;align-items:center;justify-content:center;font-size:20px;}.panel1{height:800rpx;background-color:rebeccapurple;}.panel2{height:700rpx;background-color:blue;}.panel3{height:1000rpx;background-color:orange;}.panel4{height:1200rpx;background-color:pink;}
到此这篇关于微信小程序-自定义菜单导航(实现楼梯效果)的文章就介绍到这了,更多相关微信小程序自定义菜单导航内容请搜索以前的文章或继续浏览下面的相关文章希望大家以后多多支持!
产品猿社区致力收录更多优质的商业产品,给服务商以及软件采购客户提供更多优质的软件产品,帮助开发者变现来实现多方共赢;
日常运营的过程中我们难免会遇到各种版权纠纷等问题,如果您在社区内发现有您的产品未经您授权而被用户提供下载或使用,您可按照我们投诉流程处理,点我投诉;
本文来自用户发布投稿,不代表产品猿立场 ;若对此文有疑问或内容有严重错误,可联系平台客服反馈;
部分产品是用户投稿,可能本文没有提供官方下下载地址或教程,若您看到的内容没有下载入口,您可以在我们产品园商城搜索看开发者是否有发布商品;若您是开发者,也诚邀您入驻商城平台发布的产品,地址:点我进入;
如若转载,请注明出处:https://www.chanpinyuan.cn/29819.html;