React實(shí)現(xiàn)翻頁(yè)時(shí)鐘的代碼示例
1. 布局、樣式、翻頁(yè)動(dòng)畫(huà)
翻頁(yè)時(shí)鐘把數(shù)字分為上下兩部分,翻頁(yè)效果的實(shí)現(xiàn)需要通過(guò)設(shè)置 position 把所有的數(shù)組放在同一個(gè)位置疊加起來(lái)。
翻頁(yè)時(shí)鐘的動(dòng)畫(huà)是當(dāng)前顯示時(shí)間的 up 部分向下翻轉(zhuǎn)至于屏幕垂直的位置,在這個(gè)位置需要顯示的下一個(gè)時(shí)間的 down 部分向下翻轉(zhuǎn),這樣就實(shí)現(xiàn)了翻頁(yè)時(shí)鐘的完整動(dòng)畫(huà)。
HTML 結(jié)構(gòu)如下所示:
<div class="container">
<ul class="flip">
<li>
<div class="up">
<div class="content">0</div>
</div>
<div class="down">
<div class="content">0</div>
</div>
</li>
<li>
<div class="up">
<div class="content">1</div>
</div>
<div class="down">
<div class="content">1</div>
</div>
</li>
</ul>
</div>CSS 樣式
.container {
height: 90px;
}
.container .flip {
position: relative;
float: left;
width: 60px;
height: 100%;
margin: 0 5px;
}
.flip li {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
font-size: 80px;
text-align: center;
line-height: 90px;
font-weight: bold;
border-radius: 6px;
perspective: 200px;
transform-style: preserve-3d;
}
.flip li:first-child {
z-index: 2;
}
// 設(shè)置class為up和down的高度為父元素容器的一半高度
.flip li > div {
position: absolute;
left: 0;
height: 50%;
width: 100%;
overflow: hidden;
}
.flip .up {
/* 改變選中軸的位置 使翻轉(zhuǎn)軸位于up、down部分的中間*/
transform-origin: 0 100%;
top: 0;
border-radius: 4px;
}
.flip .down {
/* 改變選中軸的位置 使翻轉(zhuǎn)軸位于up、down部分的中間 */
transform-origin: 0 0;
bottom: 0;
border-radius: 4px;
}
.flip .content {
position: absolute;
width: 100%;
border-radius: 6px;
color: #ccc;
background-color: #333;
text-shadow: 0 1px 2px #000;
}
.flip .up .content {
top: 0;
}
.flip .down .content {
bottom: 0;
}
// 設(shè)置翻頁(yè)折痕
.flip .up::after {
content: "";
position: absolute;
top: 43px;
left: 0;
width: 100%;
height: 4px;
background-color: rgba(0, 0, 0, 0.4);
}實(shí)現(xiàn)的3D效果如下:

2. 使用 JS 使動(dòng)畫(huà)持續(xù)翻頁(yè)
完整的翻頁(yè)時(shí)鐘為 00:00:00,需要翻頁(yè)的有 6 個(gè)部分,可以先把翻頁(yè)部分提取出單獨(dú)的組件。
1、準(zhǔn)備數(shù)據(jù)
因?yàn)樾枰獣r(shí)分秒各個(gè)翻頁(yè)部分顯示的數(shù)字范圍不同,所以這里先把數(shù)據(jù)準(zhǔn)備好。

2、封裝翻頁(yè)組件
組件接收兩個(gè)參數(shù):1、當(dāng)前翻頁(yè)類(lèi)型(時(shí)、分、秒); 2、當(dāng)前類(lèi)型時(shí)間。
index 與當(dāng)前類(lèi)型時(shí)間相同時(shí),當(dāng)前元素的 class 為 active,上一個(gè)元素的 class 為 before;如果當(dāng)前元素為第一個(gè)元素,最后一個(gè)元素的class為before。

3、各個(gè)翻頁(yè)組件間的聯(lián)動(dòng)
這里還需要定義一個(gè)對(duì)象,用于翻頁(yè)組件間的聯(lián)動(dòng)關(guān)系的對(duì)應(yīng)。

秒鐘的個(gè)位轉(zhuǎn)完一周后,秒鐘的十位需要進(jìn)行一次翻頁(yè),以此類(lèi)推,直到時(shí)鐘的十位進(jìn)行翻轉(zhuǎn)。實(shí)現(xiàn)方式如下:

源碼地址
https://stackblitz.com/edit/vitejs-vite-ehlf3y?file=src%2FTimeCard.tsx
到此這篇關(guān)于React實(shí)現(xiàn)翻頁(yè)時(shí)鐘的代碼示例的文章就介紹到這了,更多相關(guān)React翻頁(yè)時(shí)鐘內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
一文教你如何避免React中常見(jiàn)的8個(gè)錯(cuò)誤
這篇文章主要來(lái)和大家一起分享在?React?開(kāi)發(fā)中常見(jiàn)的一些錯(cuò)誤,以及如何避免這些錯(cuò)誤,理解這些問(wèn)題背后的細(xì)節(jié),防止犯下類(lèi)似的錯(cuò)誤,需要的可以參考下2023-12-12
React?Native中原生實(shí)現(xiàn)動(dòng)態(tài)導(dǎo)入的示例詳解
在React?Native社區(qū)中,原生動(dòng)態(tài)導(dǎo)入一直是期待已久的功能,在這篇文章中,我們將比較靜態(tài)和動(dòng)態(tài)導(dǎo)入,學(xué)習(xí)如何原生地處理動(dòng)態(tài)導(dǎo)入,以及有效實(shí)施的最佳實(shí)踐,希望對(duì)大家有所幫助2024-02-02
解決React報(bào)錯(cuò)The?tag?is?unrecognized?in?this?browser
這篇文章主要為大家介紹了解決React報(bào)錯(cuò)The?tag?is?unrecognized?in?this?browser示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12
React實(shí)現(xiàn)路由鑒權(quán)的實(shí)例詳解
React應(yīng)用中的路由鑒權(quán)是確保用戶(hù)僅能訪(fǎng)問(wèn)其授權(quán)頁(yè)面的方式,用于已登錄或具有訪(fǎng)問(wèn)特定頁(yè)面所需的權(quán)限,這篇文章就來(lái)記錄下React實(shí)現(xiàn)路由鑒權(quán)的流程,需要的朋友可以參考下2024-07-07
React實(shí)現(xiàn)多標(biāo)簽在有限空間內(nèi)展示
在業(yè)務(wù)中,需要在一個(gè)卡片組件中展示多個(gè)標(biāo)簽,標(biāo)簽組件高度相同,寬度和出現(xiàn)順序不同,要求標(biāo)簽只能在有限的空間內(nèi)展示,所以本文給大家介紹了React實(shí)現(xiàn)多標(biāo)簽在有限空間內(nèi)展示,需要的朋友可以參考下2023-12-12
react+zarm實(shí)現(xiàn)底部導(dǎo)航欄的示例代碼
本文主要介紹了react?+?zarm?實(shí)現(xiàn)底部導(dǎo)航欄的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05

