uniapp 菜单栏左右滑动自动居中

<template>
    <view class="center-cut-menu">
        <scroll-view scroll-x="true" scroll-with-animation="true" class="scroll-view" :scroll-left="scrollLeft">
            <view class="scroll-item" v-for="(item, index) in list" :key="index" @click="changeMenu(index)">
                <text class="item-text" :class="curIndex == index? 'active' : ''">{{item.name}}</text>
            </view>
        </scroll-view>
    </view>
</template>
 
<script>
    export default {
        data() {
            return {
                list: [{
                        id: 1,
                        name: '星期一'
                    },
                    {
                        id: 2,
                        name: '星期二'
                    },
                    {
                        id: 3,
                        name: '星期三'
                    },
                    {
                        id: 4,
                        name: '星期四'
                    },
                    {
                        id: 5,
                        name: '星期五'
                    },
                    {
                        id: 6,
                        name: '星期六'
                    },
                    {
                        id: 7,
                        name: '星期七'
                    },
                    {
                        id: 8,
                        name: '星期八'
                    },
                    {
                        id: 9,
                        name: '星期九'
                    },
                    {
                        id: 10,
                        name: '星期十'
                    }
                ],
                contentScrollW: 0, // 导航区宽度
                curIndex: 0, // 当前选中
                scrollLeft: 0, // 横向滚动条位置
            }
        },
        mounted() {
            // 获取标题区域宽度,和每个子元素节点的宽度
            this.getScrollW()
        },
        methods: {
            // 获取标题区域宽度,和每个子元素节点的宽度以及元素距离左边栏的距离
            getScrollW() {
                let query = uni.createSelectorQuery().in(this);
                query.select('.scroll-view').boundingClientRect(data => {
                    // 拿到 scroll-view 组件宽度
                    this.contentScrollW = data.width
                }).exec();
 
                query.selectAll('.scroll-item').boundingClientRect(data => {
                    let dataLen = data.length;
                    for (let i = 0; i < dataLen; i++) {
                        //  scroll-view 子元素组件距离左边栏的距离
                        this.list[i].left = data[i].left;
                        //  scroll-view 子元素组件宽度
                        this.list[i].width = data[i].width
                        console.log(this.list[i].left,"left")
                        console.log(this.list[i].width,"width")
                    }
                }).exec()
            },
 
            // 选择标题
            changeMenu(index) {
                this.curIndex = index;
 
                // 效果一(当前点击子元素靠左展示)  局限性:子元素宽度相同
                // this.scrollLeft = index * this.list[index].width
 
                // 效果一(当前点击子元素靠左展示)  子元素宽度不相同也可实现
                // this.scrollLeft = 0;
                // for (let i = 0; i < index; i++) {
                //     this.scrollLeft += this.list[i].width
                // };
 
 
                // 效果二(当前点击子元素靠左留一展示)  局限性:子元素宽度相同
                // this.scrollLeft = (index - 1)  * this.list[index].width
 
                // 效果二(当前点击子元素靠左留一展示)  子元素宽度不相同也可实现
                // this.scrollLeft = 0;
                // for (let i = 0; i < index - 1; i++) {
                //     this.scrollLeft += this.list[i].width
                // };
 
 
                // 效果三(当前点击子元素居中展示)  不受子元素宽度影响
                this.scrollLeft = this.list[index].left - this.contentScrollW / 2 + this.list[index].width / 2;
 
            }
        }
    }
</script>
 
<style lang="scss">
    .center-cut-menu {
        width: 100%;
        height: 100rpx;
        box-sizing: border-box;
 
        .scroll-view {
            height: 100rpx;
            white-space: nowrap;
 
            .scroll-item {
                height: 100rpx;
                padding: 0 20rpx;
                display: inline-block;
                text-align: center;
 
                .item-text {
                    font-size: 30rpx;
                    line-height: 100rpx;
 
                    &.active {
                        color: #1468FF;
                    }
                }
            }
        }
    }
</style>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
uniapp 是一个基于 Vue.js 的跨平台开发框架,它可以帮助开发者快速构建出多端(如:iOS、Android、H5、小程序等)的应用程序。在 uniapp 中,可以使用内置的组件和 API 来实现菜单栏的功能。 菜单栏是一个常用的 UI 组件,通常用于导航和切换页面。在 uniapp 中,菜单栏可以通过内置的 tabbar 组件来实现。tabbar 组件可以在底部或顶部显示一组菜单项,每个菜单项通常对应着一个页面或一组相关页面。 使用 tabbar 组件时,需要在页面配置文件(如:pages.json)中设置 "tabBar" 字段,并定义菜单项的样式和跳转路径。同时,在每个要显示的页面中也需要设置对应的菜单项的索引值(即 tabBar 中定义的 list 数组中的索引值)。 以下是一个简单的例子: ``` // pages.json { "tabBar": { "list": [ { "pagePath": "pages/index/index", "text": "首页", "iconPath": "static/tabbar/home.png", "selectedIconPath": "static/tabbar/home-selected.png" }, { "pagePath": "pages/cart/cart", "text": "购物车", "iconPath": "static/tabbar/cart.png", "selectedIconPath": "static/tabbar/cart-selected.png" }, { "pagePath": "pages/user/user", "text": "个人中心", "iconPath": "static/tabbar/user.png", "selectedIconPath": "static/tabbar/user-selected.png" } ] } } // index.vue <template> <view> <text>这是首页</text> </view> </template> <script> export default { onTabItemTap(item) { console.log(item.index) // 输出当前菜单项的索引值 } } </script> ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值