移动端菜单点击效果,点击当前元素展示到可视区
Posted yw00yw
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了移动端菜单点击效果,点击当前元素展示到可视区相关的知识,希望对你有一定的参考价值。
以微信小程序为例
wxml
<scroll-view
class="scroll-menu"
scroll-left="{{scrollLeft}}"
scroll-x="{{true}}"
scroll-with-animation="{{true}}"
enable-flex="{{true}}">
<view
class="menu-item {{selectedIndex === index && 'activeMenu'}}"
wx:for="{{menuList}}"
wx:key="index"
data-index="{{index}}"
bindtap="handleTap">
{{item.name}}
</view>
</scroll-view>
js
// pages/menu/menu.js
Page({
/**
* 页面的初始数据
*/
data: {
// 菜单数据
menuList: [
{ name: "全部分类" },
{ name: "拼团" },
{ name: "限时" },
{ name: "新人" },
{ name: "爆品" },
{ name: "日用品" },
{ name: "床上用品" },
{ name: "水果类" },
],
selectedIndex: 0, // 当前点击的菜单索引
scrollLeft: 0, // 滚动条距离左边的距离
menuWidth: 0, // 菜单宽度
menuItemArr: [], // 菜单所有的子项数组
},
onReady: function () {
let _this = this;
const queryDom = wx.createSelectorQuery().in(_this);
// 获取菜单整体的宽度
queryDom
.select(".scroll-menu")
.boundingClientRect()
.exec(function(res) {
console.log(res);
_this.setData({
menuWidth: res[0].width
});
});
// 获取菜单所有子项数据
let arr = [];
queryDom
.selectAll(".menu-item")
.boundingClientRect()
.exec(function(res) {
console.log(res);
res[1].forEach(item => {
arr.push({ width: item.width, left: item.left });
});
_this.setData({
menuItemArr: arr
});
});
console.log(_this.data.menuWidth, _this.data.menuItemArr);
},
// 事件点击
handleTap(e) {
let selectedIndex = e.target.dataset.index; // 点击的当前元素索引
let selectedItem = this.data.menuItemArr[selectedIndex]; // 点击的当前菜单item数据
if (selectedItem) {
// 滚动的距离 = 当前点击元素距离左边的距离-(菜单的宽度-当前点击元素的宽度)/2
let targetDistance = selectedItem.left - (this.data.menuWidth - selectedItem.width) / 2;
// 只有距离大于0的时候,需要滚动,否则滚动条还需要在开头
targetDistance = targetDistance < 0 ? 0 : targetDistance;
this.setData({
scrollLeft: targetDistance,
selectedIndex
});
}
}
})
wxss
.scroll-menu {
width: 100%;
height: 40px;
display: flex;
flex-wrap: nowrap;
border-bottom: 2rpx solid #eee;
padding: 0 20rpx;
box-sizing: border-box;
}
.menu-item {
white-space: nowrap;
display: flex;
align-items: center;
margin-right: 40rpx;
}
.activeMenu {
color: red;
}
效果图
以上是关于移动端菜单点击效果,点击当前元素展示到可视区的主要内容,如果未能解决你的问题,请参考以下文章