最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

React實(shí)現(xiàn)歌詞滾動(dòng)效果(跟隨音樂(lè)播放時(shí)間滾動(dòng))

 更新時(shí)間:2024年02月26日 09:49:25   作者:點(diǎn)點(diǎn)關(guān)注不迷路  
這篇文章主要為大家詳細(xì)介紹了React實(shí)現(xiàn)歌詞滾動(dòng)效果(跟隨音樂(lè)播放使勁按滾動(dòng)),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

首先給audio綁定更新時(shí)間事件

	const updateTime = e => {
		console.log(e.target.currentTime)
		setCurrentTime(e.target.currentTime);
	};
 
 
	<audio
				src={currentSong.url}
				ref={audio}
				onCanPlay={ready}
				onEnded={end}
				onTimeUpdate={updateTime}
			></audio>

當(dāng)歌曲播放時(shí)間改變的時(shí)候會(huì)觸發(fā)updateTime事件,如下所示

歌詞json格式

[
    {
        "time": 2,
        "content": "采樣曲:願(yuàn)い~あの頃のキミへ~",
        "contents": [
            "采樣曲:願(yuàn)い~あの頃のキミへ~"
        ]
    },
    {
        "time": 12,
        "content": "中文填詞:一只然",
        "contents": [
            "中文填詞:一只然"
        ]
    },
    {
        "time": 15,
        "content": "OP(原屬詞曲版權(quán)公司):テレビ?xùn)|京ミュージック 東京電視臺(tái)音樂(lè)",
        "contents": [
            "OP(原屬詞曲版權(quán)公司):テレビ?xùn)|京ミュージック 東京電視臺(tái)音樂(lè)"
        ]
    },
    {
        "time": 19,
        "content": "本作品經(jīng)過(guò)原詞曲作者以及版權(quán)公司授權(quán)",
        "contents": [
            "本作品經(jīng)過(guò)原詞曲作者以及版權(quán)公司授權(quán)"
        ]
    },
    ......
    ]

接下來(lái)就是根據(jù)當(dāng)前的播放時(shí)間顯示歌詞高亮,給歌詞綁定高亮放大樣式

.highlight {
color: $theme-color;
font-weight: $font-weight-bold;
font-size: 16px !important;
}
// 使用Redux的useSelector獲取當(dāng)前播放時(shí)間
const currentTime = useSelector(state => state.musicReducer.currentTime);
 
// 使用React的useMemo優(yōu)化性能,只有當(dāng)currentTime變化時(shí),才會(huì)重新計(jì)算time的值
const time= useMemo(() => {
    return currentTime;
},[currentTime]);
 
// updateTime函數(shù)用于更新當(dāng)前歌詞的索引
const updateTime = e => {
    // 在所有歌詞中找到第一個(gè)時(shí)間大于當(dāng)前播放時(shí)間的歌詞,其前一個(gè)歌詞就是當(dāng)前應(yīng)該顯示的歌詞
    const currentLyricIndex = lyric.findIndex((lyricItem, index) => {
        // 判斷是否是最后一項(xiàng)歌詞,如果是,下一項(xiàng)歌詞的時(shí)間設(shè)為無(wú)窮大
        const isLastItem = index === lyric.length - 1;
        const nextLyricTime = isLastItem ? Infinity : lyric[index + 1].time;
        // 如果當(dāng)前播放時(shí)間在當(dāng)前歌詞和下一條歌詞的時(shí)間之間,說(shuō)明當(dāng)前歌詞應(yīng)該被顯示
        return time >= lyricItem.time && time < nextLyricTime;
    });
    // 更新當(dāng)前歌詞的索引
    setCurrentLyricIndex(currentLyricIndex);
};
 
// 使用React的useEffect在time變化時(shí),調(diào)用updateTime函數(shù),更新當(dāng)前歌詞的索引
useEffect(() => {
    updateTime()
}, [time]);

當(dāng)time發(fā)生變化時(shí),調(diào)用updateTime函數(shù)來(lái)更新當(dāng)前歌詞的索引currentLyricIndex。確保在歌曲播放過(guò)程中,歌詞隨著時(shí)間的推移而更新。

最后,實(shí)現(xiàn)歌詞滾動(dòng)的效果

創(chuàng)建 scrollRef

const scrollRef = useRef();

使用 useRef 創(chuàng)建了一個(gè) scrollRef,用于引用 Scroll 組件的實(shí)例。

使用 useEffect 進(jìn)行歌詞滾動(dòng):

    useEffect(() => {
        // 模擬異步加載歌詞
        // 假設(shè)你要滾動(dòng)到的歌詞元素有一個(gè)特定的類名 ".lyric-item.highlight"
        const selector = '.lyric-item.highlight';
        // 調(diào)用 Scroll 組件的 scrollToElement 方法
        if (scrollRef.current) {
            scrollRef.current.scrollToElement(selector, 500); // 第二個(gè)參數(shù)是滾動(dòng)時(shí)間,可以根據(jù)需要調(diào)整
        }
    }, [currentLyricIndex]);

當(dāng) currentLyricIndex 發(fā)生變化時(shí),useEffect 會(huì)被觸發(fā)。在該效果中,它模擬異步加載歌詞,然后通過(guò) scrollRef.current.scrollToElement 方法滾動(dòng)到指定的歌詞元素,滾動(dòng)時(shí)間為500毫秒。這樣,每次歌詞發(fā)生變化時(shí)都會(huì)滾動(dòng)到當(dāng)前高亮的歌詞位置。

Scroll 組件的 scrollToElement 方法實(shí)現(xiàn):

        scrollToElement(selector, time = 0) {
            if (bScroll) {
                const targetElement = document.querySelector(selector);
                if (targetElement) {
                    const containerHeight = scrollContainerRef.current.clientHeight;
                    const targetHeight = targetElement.clientHeight;
                    const offsetTop = (containerHeight - targetHeight) / 2;
                    bScroll.scrollToElement(targetElement, time, 0, -offsetTop);
                }
            }
        }

這是 Scroll 組件內(nèi)部的 scrollToElement 方法的實(shí)現(xiàn)。首先,通過(guò) document.querySelector(selector) 獲取到目標(biāo)元素(具有指定類名的高亮歌詞元素)。然后,計(jì)算目標(biāo)元素相對(duì)于滾動(dòng)容器的偏移,最后使用 bScroll.scrollToElement 將目標(biāo)元素滾動(dòng)到可視區(qū)域,傳入的參數(shù)包括時(shí)間、水平和垂直的偏移。

以上就是React實(shí)現(xiàn)歌詞滾動(dòng)效果(跟隨音樂(lè)播放時(shí)間滾動(dòng))的詳細(xì)內(nèi)容,更多關(guān)于React歌詞滾動(dòng)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 每天一個(gè)hooks學(xué)習(xí)之useUnmount

    每天一個(gè)hooks學(xué)習(xí)之useUnmount

    這篇文章主要為大家介紹了每天一個(gè)hooks學(xué)習(xí)之useUnmount,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-05-05
  • React Native使用fetch實(shí)現(xiàn)圖片上傳的示例代碼

    React Native使用fetch實(shí)現(xiàn)圖片上傳的示例代碼

    本篇文章主要介紹了React Native使用fetch實(shí)現(xiàn)圖片上傳的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-03-03
  • React.js前端導(dǎo)出Excel的方式

    React.js前端導(dǎo)出Excel的方式

    這篇文章主要為大家介紹了React.js前端導(dǎo)出Excel的方式詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • react父組件更改props子組件無(wú)法刷新原因及解決方法

    react父組件更改props子組件無(wú)法刷新原因及解決方法

    使用過(guò)vue的朋友都知道,vue父組件更改props的值,子組件是會(huì)刷新的,而react就未必,今天通過(guò)一個(gè)例子給大家介紹react父組件更改props子組件無(wú)法刷新原因,需要的朋友可以參考下
    2022-09-09
  • React使用ref方法與場(chǎng)景介紹

    React使用ref方法與場(chǎng)景介紹

    這篇文章主要介紹了React使用ref方法與場(chǎng)景,React支持給任意組件添加特殊屬性。ref屬性接受一個(gè)回調(diào)函數(shù),它在組件被加載或卸載時(shí)會(huì)立即執(zhí)行
    2022-10-10
  • 基于react hooks,zarm組件庫(kù)配置開(kāi)發(fā)h5表單頁(yè)面的實(shí)例代碼

    基于react hooks,zarm組件庫(kù)配置開(kāi)發(fā)h5表單頁(yè)面的實(shí)例代碼

    這篇文章主要介紹了基于react hooks,zarm組件庫(kù)配置開(kāi)發(fā)h5表單頁(yè)面,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-04-04
  • ReactDOM 隱藏特性詳解

    ReactDOM 隱藏特性詳解

    這篇文章主要為大家介紹了ReactDOM 隱藏特性詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • React18新特性startTransition詳解

    React18新特性startTransition詳解

    React18的新特性startTransition主要是為了優(yōu)化用戶體驗(yàn),通過(guò)標(biāo)記低優(yōu)先級(jí)的更新任務(wù),如頁(yè)面重渲染,使它們不會(huì)阻塞高優(yōu)先級(jí)的緊急任務(wù)如用戶輸入響應(yīng),本文介紹React18新特性startTransition,感興趣的朋友跟隨小編一起看看吧
    2024-09-09
  • 基于React.js實(shí)現(xiàn)原生js拖拽效果引發(fā)的思考

    基于React.js實(shí)現(xiàn)原生js拖拽效果引發(fā)的思考

    這篇文章主要為大家詳細(xì)介紹了基于React.js實(shí)現(xiàn)原生js拖拽效果,繼而引發(fā)的一系列思考,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2016-03-03
  • React錯(cuò)誤邊界Error Boundaries

    React錯(cuò)誤邊界Error Boundaries

    錯(cuò)誤邊界是一種React組件,這種組件可以捕獲發(fā)生在其子組件樹(shù)任何位置的JavaScript錯(cuò)誤,并打印這些錯(cuò)誤,同時(shí)展示降級(jí)UI,而并不會(huì)渲染那些發(fā)生崩潰的子組件樹(shù)
    2023-01-01

最新評(píng)論

郁南县| 南城县| 兰州市| 康平县| 弋阳县| 屏山县| 乐山市| 灌阳县| 云霄县| 竹溪县| 哈尔滨市| 蒙城县| 梓潼县| 托克托县| 新绛县| 柳江县| 含山县| 双辽市| 梁河县| 陈巴尔虎旗| 三穗县| 威远县| 浪卡子县| 北碚区| 温宿县| 东至县| 张家界市| 曲周县| 罗田县| 颍上县| 侯马市| 鄱阳县| 蓝山县| 娱乐| 逊克县| 梁山县| 瓮安县| 陵水| 万年县| 文水县| 关岭|