Vue?transition組件簡單實(shí)現(xiàn)數(shù)字滾動(dòng)
實(shí)現(xiàn)效果
Scrip
<template> <button @click="addCount">點(diǎn)我滾動(dòng)數(shù)字</button> <div class="roll-container"> <transition name="roll"> <div class="roll-number" :key="count">{{ count }}</div> </transition> </div> </template> <script> import { defineComponent, ref } from 'vue'; export default defineComponent({ setup() { const count = ref(0); let click_time = Date.now(); function addCount() { if (Date.now() - click_time < 300) return; click_time = Date.now(); count.value += 1; } return { count, addCount, }; }, }); </script> <style> .roll-container { position: relative; text-align: center; font-size: 120px; line-height: 1em; color: #fff; height: 1em; min-width: 1em; max-width: 3em; background: #000000; overflow: hidden; } .roll-number { /* position: absolute; */ /* top: 0; */ width: 100%; } .roll-enter-active, .roll-leave-active { transition: all .3s; position: absolute; top: 0; } .roll-leave-to { top: -1em; } .roll-enter-active { top: 1em; } .roll-enter-to { top: 0; } </style>
使用vue
的transition
組件,來實(shí)現(xiàn)一個(gè)數(shù)字滾動(dòng)效果,其實(shí)不僅可以是數(shù)字滾動(dòng),還可以是文字、段落滾動(dòng),代碼片段使用了定位做的,還可以使用transform
,只是一種思路,不限制方案。
布局
沒有別人寫的東西炫酷,我都不知道怎么寫內(nèi)容了,布局沒啥好講的,我這里會(huì)有一個(gè)容器包裹內(nèi)部滾動(dòng)的數(shù)字,主要是用于隱藏內(nèi)部滾動(dòng)的數(shù)字超出的部分,代碼如下:
<div class="roll-container"> <transition name="roll"> <div class="roll-number" :key="count">{{ count }}</div> </transition> </div>
樣式如下:
.roll-container { position: relative; text-align: center; font-size: 120px; line-height: 1em; color: #fff; height: 1em; min-width: 1em; max-width: 3em; background: #000000; overflow: hidden; } .roll-number { width: 100%; }
這里的細(xì)節(jié)就是transition
組件是用于元素顯隱狀態(tài)切換使用的,一般用于v-if
、v-show
,還有transition-group
也是一樣的,不過transition-group
是用于多個(gè)元素上的,可以作用在列表上,對(duì)于列表的數(shù)據(jù)新增、刪除可以觸發(fā)過渡效果。
而我這里使用key
,key
發(fā)生改變可以強(qiáng)制元素的更新,可以完整的觸發(fā)組件的生命周期,就達(dá)到了元素銷毀和創(chuàng)建的整個(gè)過程,也可以觸發(fā)過渡,key
的作用老生常談了,可以網(wǎng)上去查查資料,用得好可以有很多巧妙的作用。
動(dòng)畫
動(dòng)畫是使用vue
的transition
組件的css class
過渡方式,官網(wǎng)上的文檔過渡的生命周期描述的很清楚,我就不搬運(yùn)了,vue transiton組件
過渡css代碼:
/* 動(dòng)畫激活時(shí)給予初始狀態(tài),這個(gè)基礎(chǔ)狀態(tài)用于定義后續(xù)過渡動(dòng)作的起點(diǎn) 這里統(tǒng)一定義了組件創(chuàng)建和組件銷毀的兩個(gè)起點(diǎn),主要是賦予 transition 使其有一個(gè)過渡 */ .roll-enter-active, .roll-leave-active { transition: all .3s; position: absolute; top: 0; } /* 組件銷毀,過渡的終點(diǎn) 最開始的起點(diǎn)是原位,離開的時(shí)候滾到上面去 */ .roll-leave-to { top: -1em; } /* 組件創(chuàng)建,過渡的起點(diǎn) 創(chuàng)建的時(shí)候是重下往上進(jìn)入,所以元素最開始是在下面 */ .roll-enter-active { top: 1em; } /* 過渡的時(shí)候回到起點(diǎn),達(dá)到重下往上滾動(dòng) */ .roll-enter-to { top: 0; }
代碼就這么一丟丟,只要理解了過渡的生命周期,就可以控制各種效果,我這里這個(gè)應(yīng)該是入門級(jí)代碼,這里的細(xì)節(jié)就是需要定義一個(gè)過渡的起點(diǎn),因?yàn)槭褂玫氖嵌ㄎ?,如果不設(shè)置起點(diǎn)是沒有過渡效果的,如果是用變換(transform
)可以不用設(shè)置起點(diǎn),為什么這個(gè)就和css
相關(guān)了,不在這次的談?wù)摲秶畠?nèi)。
邏輯控制
邏輯控制主要是要?jiǎng)赢媹?zhí)行完成之后才能再次修改變量,否則就會(huì)有重疊,閃動(dòng)等,造成動(dòng)畫不連貫,我這里動(dòng)畫執(zhí)行時(shí)間是300毫秒
,所以也就是300毫秒
只能修改一次狀態(tài)。
const count = ref(0); // 緩存第一次狀態(tài)修改的時(shí)間 let click_time = Date.now(); function addCount() { // 300ms 只能執(zhí)行一次 if (Date.now() - click_time < 300) return; // 重置狀態(tài)修改的時(shí)間 click_time = Date.now(); count.value += 1; }
這個(gè)就是一個(gè)很簡單的邏輯控制,這里是通過點(diǎn)擊來修改的,這里也可以通過定時(shí)器去處理。
總結(jié)
以前要做一個(gè)數(shù)字滾動(dòng)需要弄一個(gè)插件,插件代碼也多,通過js進(jìn)行控制處理,一般都是把0-9
的數(shù)字放一排,然后滾動(dòng),滾動(dòng)完成把頭部的數(shù)字放到尾部,而使用transition
組件只要這么一丟丟代碼就可以完成相同的功能,如果在加上vue3
新出的css
變量綁定,還可以做到過渡動(dòng)畫執(zhí)行時(shí)間的動(dòng)態(tài)控制。
以上就是Vue transition組件簡單實(shí)現(xiàn)數(shù)字滾動(dòng)的詳細(xì)內(nèi)容,更多關(guān)于Vue transition數(shù)字滾動(dòng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Vue項(xiàng)目如何在js文件里獲取路由參數(shù)及路由跳轉(zhuǎn)
日常業(yè)務(wù)中路由跳轉(zhuǎn)的同時(shí)傳遞參數(shù)是比較常見的,下面這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目如何在js文件里獲取路由參數(shù)及路由跳轉(zhuǎn)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01vue3在router中使用store報(bào)錯(cuò)的完美解決方案
這篇文章主要介紹了vue3在router中使用store報(bào)錯(cuò)解決方案,就是需要在實(shí)例化一下,因?yàn)樵诰幾grouter的時(shí)候pinia還未被實(shí)例化,文中補(bǔ)充介紹了vue3中router和store詳細(xì)使用教程方法,感興趣的朋友一起看看吧2023-11-11Vue filter格式化時(shí)間戳?xí)r間成標(biāo)準(zhǔn)日期格式的方法
今天小編就為大家分享一篇Vue filter格式化時(shí)間戳?xí)r間成標(biāo)準(zhǔn)日期格式的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09vue element-ui el-tooltip組件失效問題及解決
這篇文章主要介紹了vue element-ui el-tooltip組件失效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10解決webpack+Vue引入iView找不到字體文件的問題
今天小編就為大家分享一篇解決webpack+Vue引入iView找不到字體文件的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-09-09vue 登錄滑動(dòng)驗(yàn)證實(shí)現(xiàn)代碼
這篇文章主要介紹了vue 登錄滑動(dòng)驗(yàn)證實(shí)現(xiàn)代碼,代碼簡單易懂,非常不錯(cuò),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2018-08-08Vue項(xiàng)目中引入字體文件的幾種方法總結(jié)
在 Vue 項(xiàng)目中引入自定義字體文件,可以通過多種方式實(shí)現(xiàn),這取決于你的項(xiàng)目結(jié)構(gòu)、構(gòu)建工具以及字體文件的來源,本文將詳細(xì)介紹如何通過不同方法引入本地字體文件以及從外部引入字體,需要的朋友可以參考下2024-10-10