基于Vue2實(shí)現(xiàn)數(shù)字縱向滾動(dòng)效果
需求:
在頁(yè)面中顯示一個(gè)數(shù)字,并在進(jìn)入視口時(shí)顯示計(jì)時(shí)器滾動(dòng)效果:

效果如上
實(shí)現(xiàn)代碼
新建組件ScrollNumber.vue:
<template>
<div
style="
display: inline-flex;
justify-content: flex-start;
align-items: center;
"
>
<div
v-for="(item, index) in numberList"
:key="index"
style="
display: inline-flex;
justify-content: flex-start;
align-items: center;
padding-bottom: 0.3rem;
box-sizing: border-box;
"
>
<span v-if="isNaN(item)">{{ item }}</span>
<div class="number" v-else>
<span
class="number-item"
ref="numberItem"
:data-number="item"
:data-index="index"
>0123456789</span
>
</div>
</div>
</div>
</template>
<script>
export default {
name: "ScrollNumber",
props: {
value: {
type: [String, Number],
default: 0,
},
},
watch: {
value(newVal) {
if (newVal) {
this.$nextTick(() => {
this.setNumberTransform();
});
}
},
},
computed: {
numberList() {
return String(this.value).split("");
},
},
data() {
return {
hasShow: false, // 是否已展示過(guò)動(dòng)畫(huà)
};
},
mounted() {
window.addEventListener("scroll", this.scrollHandle, true); // 監(jiān)聽(tīng) 監(jiān)聽(tīng)元素是否進(jìn)入/移出可視區(qū)域
},
methods: {
scrollHandle() {
const offset = this.$el.getBoundingClientRect();
const offsetTop = offset.top;
const offsetBottom = offset.bottom;
// 進(jìn)入可視區(qū)域
if (offsetTop <= window.innerHeight && offsetBottom >= 0) {
this.setNumberTransform();
this.hasShow = true;
window.removeEventListener("scroll", this.scrollHandle, true);
} else {
// 移出可視區(qū)域
if (this.hasShow) {
window.removeEventListener("scroll", this.scrollHandle, true);
}
}
},
// 設(shè)置每一位數(shù)字的偏移
setNumberTransform() {
let numberItems = this.$refs.numberItem;
let obj = {};
Array.from(numberItems).forEach((c) => {
let key = c.dataset.index;
let value = c.dataset.number;
let init = 0;
obj[key] = setInterval(() => {
if (init < value * 10) {
init += 1;
c.style.transform = `translateY(-${init}%)`;
} else {
clearInterval(obj[key]);
obj[key] = null;
}
}, 8);
});
},
},
};
</script>
<style scoped lang="less">
.number {
width: 0.42rem;
height: 0.62rem;
font-size: 0.56rem;
font-weight: 800;
color: #ffe52c;
text-align: center;
overflow: hidden;
line-height: 0.42rem;
> span {
text-align: center;
writing-mode: vertical-rl;
text-orientation: upright;
transform: translateY(0%);
}
}
</style>使用:
import ScrollNumber from "../ScrollNumber/ScrollNumber.vue";
<scroll-number :value="num.toString()"></scroll-number>
到此這篇關(guān)于基于Vue2實(shí)現(xiàn)數(shù)字縱向滾動(dòng)效果的文章就介紹到這了,更多相關(guān)Vue2數(shù)字縱向滾動(dòng)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
vxe-grid與vxe-table實(shí)現(xiàn)表格尾部合并方式
本文介紹了如何在Vue項(xiàng)目中使用vxe-table和vxe-grid組件實(shí)現(xiàn)表格尾部的動(dòng)態(tài)合并功能,包括如何配置和使用`mergeFooterItems`屬性來(lái)定義底部單元格合并規(guī)則,并提供了示例代碼,同時(shí),對(duì)比了兩種組件在尾部合并配置方面的差異,總結(jié)了各自的優(yōu)勢(shì)和適用場(chǎng)景2026-02-02
通過(guò)命令行創(chuàng)建vue項(xiàng)目的方法
這篇文章主要介紹了通過(guò)命令創(chuàng)建vue項(xiàng)目的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
vue如何將字符串的一部分處理為html文檔并渲染到頁(yè)面
這篇文章主要介紹了vue如何將字符串的一部分處理為html文檔并渲染到頁(yè)面,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06
Vue3中defineProps設(shè)置默認(rèn)值的方法實(shí)現(xiàn)
Vue3中我們經(jīng)常需要使用defineProps來(lái)定義組件的屬性,本文主要介紹了Vue3中defineProps設(shè)置默認(rèn)值的方法實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
Vue3 KeepAlive緩存組件實(shí)現(xiàn)方式
文章主要介紹了Vue中內(nèi)置組件的使用,其中著重講解了KeepAlive的使用方式和細(xì)節(jié),KeepAlive用于在多個(gè)組件間動(dòng)態(tài)切換時(shí)緩存被移除的組件實(shí)例,可以使用include/exclude和max屬性來(lái)定制緩存行為,同時(shí),還介紹了onActivated和onDeactivated生命周期鉤子的使用方法2026-04-04
vue+element-ui實(shí)現(xiàn)表格編輯的三種實(shí)現(xiàn)方式
這篇文章主要介紹了vue+element-ui實(shí)現(xiàn)表格編輯的三種實(shí)現(xiàn)方式,主要有表格內(nèi)部顯示和編輯切換,通過(guò)彈出另外一個(gè)表格編輯和直接通過(guò)樣式控制三種方式,感興趣的小伙伴們可以參考一下2018-10-10

