轻松掌握!Vue实现超酷文字上下滚动动画的极简教程
前言
实现原理
vue官方自己实现了一个TransitionGroup动画组件,
下面是官方的描述:
<TransitionGroup>
是一个内置组件,用于对 v-for
列表中的元素或组件的插入、移除和顺序改变添加动画效果。
到这里,朋友们应该明白了,我们只需要加一个往上或者往下的css动画效果,然后利用计时器定时增加和删除数据,TransitionGroup组件就会自己触发css动画效果,完全不需要自己额外操作dom之类的。
但是如果数据只有不足4条的情况下,这个动画效果就无法连贯了,所以在数据不足的情况下需要将数据填充至4条并增加唯一id。
动画效果
代码逻辑
<template>
<div>
<TransitionGroup name="fade" tag="ul" :duration="1000">
// 此处ID需要唯一
<li v-for="(item) in data" :key="item.id">
【{{ item.user }}】{{ item.age }} //...
</li>
</TransitionGroup>
</div>
</template>
import { onMounted, onUnmounted, ref, unref } from "vue";
import { getTransactionToday } from "@/services/common";
import store from "@/store";
import dayjs from "dayjs";
const data = ref([]);
let timer;
const getScrollText = async () => {
const res = await api()
data.value = res.data
return Promise.resolve(res.data);
};
let num = 2000;
const init = async () => {
clearTimeout(timer);
await getScrollText();
if (!unref(data).length) return;
if ([1,2].includes(unref(data).length)) {
// 这里的id可以改成其他字段,只要是唯一就行
for (let i = 0; i < (4-unref(data).length); i++) {
unref(data).push({ ...unref(data)[0], id: Date.now() + i });
}
}
let delData;
timer = setInterval(() => {
if (delData) {
unref(data).push(delData);
delData = null;
} else {
delData = unref(data)[0];
unref(data).shift();
}
}, num);
};
onMounted(() => {
init();
});
onUnmounted(() => {
clearInterval(timer);
});
<style scoped lang="scss">
$height: 40px;
.fade-move,
.fade-enter-active,
.fade-leave-active {
transition: all 0.5s;
}
.fade-enter-from {
transform: translate(0, $height);
}
.fade-leave-to {
transform: translate(0, -$height);
}
.fade-enter-active,
.fade-leave-active {
position: absolute;
}
</style>
转载自:https://juejin.cn/post/7346031272920481803