组件运行效果
组件代码
<script setup lang="ts">
import { defineProps, toRef, ref, onMounted, onBeforeUnmount } from "vue";
const props = defineProps({
scrollamount: Number,//滚动速度数字越大越慢
direction: String,//滚动方向 up从上到下,left从左至右
});
let timerID = 0;
const scrollamount = toRef(props, "scrollamount");
const direction = toRef(props, "direction");
const boxRef = ref();
const moveboxRef = ref();
const upInit = () => {
let moveTarget = moveboxRef.value;
let initTop = 0;
timerID = setInterval(function () {
initTop++;
if (initTop >= moveTarget.offsetHeight / 2) {
initTop = 0;
}
moveTarget.style = "transform: translateY(-" + initTop + "px)";
}, scrollamount.value);
};
const leftInit = () => {
let target = boxRef.value;
let initLeft = 0;
setInterval(function () {
initLeft++;
if (initLeft >= target.offsetWidth / 2) {
initLeft = 0;
}
target.style = "transform: translateX(-" + initLeft + "px)";
}, scrollamount.value);
};
onMounted(() => {
if (direction.value === "left") {
leftInit();
} else {
upInit();
}
});
onBeforeUnmount(() => {
clearInterval(timerID);
timerID = 0;
});
</script>
<template>
<div class="my-outbox" v-if="direction === 'left'">
<div class="my-inbox" ref="boxRef">
<slot></slot>
</div>
</div>
<div class="my-outbox" ref="outboxRef" v-if="direction === 'up'">
<div ref="moveboxRef">
<slot></slot>
</div>
</div>
</template>
<style lang="scss" scoped>
.my-outbox {
overflow: hidden;
height: 100%;
position: relative;
.my-inbox {
white-space: nowrap;
position: absolute;
}
}
</style>
组件使用
//组件包裹的内容就是需要滚动的文字
<ScrollContainer :scrollamount="option.scrollamount" direction="up">
<span> 文字从上到下滚动/span>
</ScrollContainer>