Better-scroll实现楼层联动

第一步:先搭建vue-cli环境 (具体过程就不多说啦)

第二步:下载better-scroll : npm/cnpm i better-scroll -S

第三步:在components中创建scroll组件
在这里插入图片描述
并且在main.js中配置
在这里插入图片描述

//复制并运行代码,即可实现效果

scroll.vue中的布局:

template中的代码:

<div class="scroll" ref="wrapper">
    <slot></slot>
</div>

js代码:

import BScroll from 'better-scroll'
export default {
    name: 'scroll',
    props: {
        scrollY: {
            type: Boolean,
            default: true
        },
        scrollX: {
            type: Boolean,
            default: true
        },
        click: {
            type: Boolean,
            default: true
        },
        probeType: {
            type: Number,
            default: 0
        }
    },
    mounted () {
        let wrapper = this.$refs.wrapper
        this.scroll = new BScroll(wrapper, {
            click: this.click,
            probeType: this.probeType,
            scrollY: this.scrollY
        })
        this.scroll.on('scroll', position => {
            this.$emit('scroll', position)
        })
    },
    methods: {
        scrollToElement (...args) {
            this.scroll && this.scroll.scrollToElement(...args)
        }
    }
}

主页面中的布局:
template中的代码:

<div class="floor">
    <scroll class="left" ref="scroll">
        <ul>
            <li v-for="(item,index) in Floor" :key="index" :class="{active: currentIndex === index}" @click="currentFloor(index,$event)">{{item}}</li>
        </ul>
    </scroll>
    <scroll class="right" ref="scroll" :probe-type="3" @scroll="scroll">
        <ul>
            <li v-for="(item,index) in Floor" :key="index" ref="current-li">{{item}}</li>
        </ul>
    </scroll>
</div>

js代码:

export default {
    name: 'floor',
    data () {
        return {
            Floor: ["one","two","three","four","five","six","seven","eight","nine","ten","eleven","twelve"],
            rightListHeight: [], //用于保存右侧每个li的高度
            scrollY: 0, //用于保存滚动高度
        }
    },
    created () {
        //由于页面渲染数据时可能会出现延迟现象,所以,设置一个延时器,延迟获取所有右侧楼层的高或使用this.$nextTick
        setTimeout( () => {
            this.rightItemHeight()
        }, 500)
        
       //this.$nextTick(() => {
        	//this.rightItemHeight()
        //})
    },
    methods: {
        //点击左侧楼层,改变右侧楼层高度
        currentFloor (index) {
            //参数为左侧里的下标
            //获取右侧所有的li
            let currentLi = this.$refs['current-li']
            //该事件为scroll组件内的事件
            this.$refs.scroll.scrollToElement(currentLi[index],600)
        },
        rightItemHeight () {
            //初始化右侧li第一个高度
            let Height = 0
            //将右侧的第一个li的高度添加进数组中
            this.rightListHeight.push(Height)
            //获取右侧所有li的长度
            let currentLi = this.$refs['current-li']
            //将所有的li的高度都添加进数组
            currentLi.forEach( item => {
                Height += item.clientHeight
                this.rightListHeight.push(Height)
            })
        },
        //设置滚动事件,该事件由scoll组件发送过来的
        scroll (position) {
            //保存滚动高度,该值是一个绝对值
            this.scrollY = Math.round(Math.abs(position.y))
        }
    },
    computed: {
        //设置一个currentIndex 用于返回右侧li滑动时的当前下标
        currentIndex () {
            for(let i=0; i<this.rightListHeight.length; i++){
                let currentHeight = this.rightListHeight[i]
                let nextHeight = this.rightListHeight[i+1]
                if(this.scrollY >= currentHeight && this.scrollY< nextHeight || !nextHeight){
                    return i
                }
            }
            return 0
        }
    }
}

css样式:

/*为了方便,未使用sass语言编译*/
*{
    padding: 0;margin: 0;
}
ul{
    list-style:none;
}
.floor{
    width: 100vw;
    height: 100vh;
    display:flex;
    flex-direction: row;
    box-sizing: border-box;
    padding:20vw 0;
    background-color: #f2f2f2;
}
.left{
    flex:1;
    background: skyblue;
    overflow:hidden;
}
.right{
    flex:4;
    background-color: #ccc;
    overflow:hidden;
}
.left ul li{
    width: 100%;
    height:12vw;
    background-color: #fff;
    margin-top:2vw;
    text-align:center;
    line-height:12vw;
    font-size:15px;
}
.left ul li.active{
    color:green;
    font-weight:700;
    background-color: #f0f0f0;
}
.right ul li{
    height:40vw;
    background-color:#f5f5f5;
    margin-top:2vw;
    text-align:center;
    line-height:40vw;
    font-size:36px;
}
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Vue是一种用于构建用户界面的渐进式JavaScript框架,它可以帮助开发者更高效地构建单页面应用程序。而vue-better-scroll是基于Vue的一款优秀的滚动插件,它能够实现更流畅的滚动效果,并且支持上下左右的滚动和联动效果。 如果需要实现左右侧菜单的联动效果,我们可以通过使用vue-better-scrollscrollToElement方法来实现。首先,我们需要在Vue中引入vue-better-scroll插件并进行配置。 在Vue实例的data中,我们可以定义左右两个菜单的数据,例如leftMenu和rightMenu,并在created生命周期中初始化数据。然后,在mounted生命周期中,我们可以通过refs属性获取到两个菜单容器的DOM元素。 接下来,我们需要监听左边菜单的点击事件,当点击左边菜单的某个选项时,我们可以通过调用vue-better-scrollscrollToElement方法,将右边菜单滚动到对应的位置。通过传递目标元素的选择器或具体的DOM元素,我们可以实现左右菜单的联动效果。 具体实现时,我们可以在左边菜单的点击事件中,使用this.$refs来访问右边菜单容器,并调用scrollToElement方法,将目标元素滚动到可视区域。通过传递选择器或具体DOM元素作为参数,我们可以精确控制滚动的位置。 同时,为了视觉上更好的效果,我们还可以给目标元素添加样式,如高亮当前选中项,以提升用户体验。 最后,通过一系列的事件处理和样式设置,我们就可以实现左右侧菜单的联动demo了。 以上就是使用Vue和vue-better-scroll实现左右侧菜单联动demo的大致思路和步骤。通过合理运用这两个工具,我们可以轻松地实现出一个流畅、友好的用户界面效果
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值