效果图:
代码(template):
<template> <div class="scrollAnimation"> <ul v-scroll-height height="3" speed1='1000' speed2='500' isEnd="true" > <li class="list_item" :class="{ bg: index == current }" v-for="(item, index) in items" :key="item.id" > {{ item.name }} </li> </ul> </div> </template> <script> export default { directives: {}, data() { return { items: [], current: 0, timer: null, show: true, parentHeight: "", childHeight: "", totalPage: "", // rotationTime: { // // 轮播的时间 // time: 10000, // 轮播间隔时间 // leaveAndGoTime: 3000, // 鼠标进入后离开,轮播的间隔时间 // animateTime: 1000, // 动画时间 // }, }; }, mounted() { this.getList(); }, methods: { }, watch: { }, }; </script> <style lang="less" scoped> .scrollAnimation { width: 200px; background-color: red; overflow-y: auto; position: relative; ul { position: relative; left: 0; top: 0; height: 100px; overflow-y: auto; li { font-size: 18px; // color: #cccc; background-color: #cccc; margin-bottom: 5px; line-height: 20px; height: 20px; } .bg { color: red; } } } </style>
指令代码
import Vue from "vue"; Vue.directive('scroll-height', { // el:指令所绑定的元素,可以用来直接操作 DOM。 //binding:一个对象,包含以下 property: bind(el, binding, vnode) { let time = null; let scrollTime = null; let speed = 1000; let current = 0; let self = vnode.context; let $el = $(el); let myHeigth = $el.attr("height") ? $el.attr("height") : ''; let tag = $el.attr("Tag") ? $el.attr("Tag") : 'li'; let isEnd = $el.attr("isEnd")==true ? true : false; let speed1 = $el.attr("speed1") ? $el.attr("speed1") : 1000; let speed2= $el.attr("speed2") ? String($el.attr("speed2")) : 500; self.$nextTick(() => { // 1.首先,几行可以滑动 let maxHeight = 0; let chrLength = $el.find(tag).length; for (let i = 0; i < myHeigth; i++) { maxHeight += $el.find(tag).eq(i).outerHeight(true) } $el.css({ height: maxHeight }); $el.css({ overflowY: 'auto' }); // 定时滚动 function autoPlay() { clearInterval(time) time = setInterval(animation, speed1) } // 移动 function animation() { let end = isEnd ? myHeigth : 0 if (current < self.items.length-1 ) { current++ } else { current = 0 } self.current = current let offsetTop = $el.find(tag).eq(current).outerHeight(true) $el.stop(false, true).animate({ scrollTop: `${current *offsetTop}px`, }, speed2) } //鼠标进入 function bindMouseEnter() { clearInterval(time) clearInterval(scrollTime) } // 鼠标离开 function bindMouseLeave() { scrollTime = setTimeout(() => { autoPlay(); animation(); }, 1000); } autoPlay(); el.addEventListener( "mouseenter", bindMouseEnter ); el.addEventListener( "mouseleave", bindMouseLeave ); }) }, inserted: function (el) { // inserted 表示被绑定元素插入父节点时调用 el.focus(); }, update(el, binding) { } })
在全局全局即可(main.js)