效果

点击上下可以中间滚动,鼠标在框内滚动也会滚动。

外部js

const mouseEvent = {
    wheel(opt){
        console.log(opt)
        if(!opt.target){
            console.log('什么都没有,还让我帮忙!');
            return ;
        }
        let callback = opt.callback || function () {};
        let target = opt.target;

        //获取兼容事件
        let mouseWheel=(/Firefox/i.test(navigator.userAgent))?"DOMMouseScroll": "mousewheel";

        //IE
        if(document.attachEvent){
            document.attachEvent('on'+mouseWheel,function (e) {
                if(e.target.parentElement == target){
                    callback(e, e.wheelDelta)
                }
            })
        }

        //FF、Chrome、Opera、safari
        else{
            document.addEventListener(mouseWheel,function (e) {
                e = e || window.event;
                if(e.target.parentElement == target){
                    if(e.detail){ //FF
                        callback(e,e.detail*40)
                    }else{
                        callback(e,e.wheelDelta)
                    }
                }
            })
        }

    }
};

export { mouseEvent }

在图中模块处引入,代码如下

<template>
    <div class="text-carousel-group">
        <div class="go-up mt-10" @click="goUp">︿</div>
        <div class="content-wrapper" ref="carouselBox">
            <div class="content moveContent" ref="carouselContent" :style="{transform:'translateY('+transLateY+'px)'}">
                <p v-for="(item,index) in lists" :key="item.id" :class="{active:item.selected}" @click="selectEle(item)">{{item.text}}</p>
            </div>
        </div>
        <div class="go-down mb-10" @click="goDown">﹀</div>
    </div>
</template>

<script>
    import {mouseEvent} from '../../assets/js/common'
    export default {
        name: "text-carousel",
        props:['lists'],
        data(){
            return {
                carouselEle:0, //滚动元素
                carouselBox:0, //滚动盒子
                carouselEleH:0, //滚动元素
                carouselBoxH:0, //滚动盒子
                transLateY:0    //滚动Y轴距离
            }
        },
        methods:{
            goUp(){
                if(this.carouselEleH + this.transLateY <= this.carouselBoxH){
                    this.transLateY = this.carouselBoxH - this.carouselEleH >0 ? 0:this.carouselBoxH - this.carouselEleH;
                }else{
                    this.transLateY -= 29;
                }
            },
            goDown(){
                if(this.transLateY>=0){
                    this.transLateY= 0;
                }else{
                    this.transLateY += 29;
                }
            },
            selectEle(str){
                this.$emit('myChange',str)
            },
        },
        mounted(){
            let This = this;
            window.addEventListener('scroll',this.handleScroll,true)
            this.carouselBox = this.$refs.carouselBox;
            this.carouselEle = this.$refs.carouselContent;
            this.carouselBoxH = this.$refs.carouselBox.offsetHeight;
            this.carouselEleH = this.$refs.carouselContent.offsetHeight;
            this.transLateY = 0;
            //将选中元素显示在中间
            var curIndex = 0;
            this.lists.forEach(function (value,index) {
                if(value.selected){
                    curIndex = index;
                }
            });
            if(this.carouselBoxH<this.carouselEleH){
                if(curIndex>3){
                    if( curIndex < this.lists.length - 3){
                        this.transLateY = -(curIndex - 3)*29
                    }else if(curIndex >= this.lists.length - 3){
                        this.transLateY = this.carouselBoxH - this.carouselEleH
                    }
                }
            };
            mouseEvent.wheel({
                target: This.carouselEle,
                callback(e, direction){
                    if(direction>0){
                        This.goUp();
                    }else{
                        This.goDown();
                    }
                }
            })
        },
        watch:{

        }
    }
</script>

<style scoped>
    p{
        height: 29px;
        line-height: 29px;
        cursor: pointer;
    }
    p:hover,
    p.active{
        background-color: rgba(0, 0, 0, 0.2);
    }
    .go-up,.go-down{
        height: 29px;
        line-height: 29px;
        color: #fff;
        cursor: pointer;
        user-select: none;
    }
    .content p{
        color: rgba(255,255,255,0.6);
        overflow: hidden;
        white-space: nowrap;
        text-overflow: ellipsis;
    }
</style>

 

Logo

前往低代码交流专区

更多推荐