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

JS實現(xiàn)進度條順滑版詳細方案

 更新時間:2021年08月02日 08:36:54   作者:子慕大詩人  
最近在小程序里,做了一個類似微博刷視頻的需求,其中有一部分功能需要實現(xiàn)自定義進度條,在做完第一版之后發(fā)現(xiàn)進度條不順滑,而后想查查網(wǎng)上看有沒有什么好的方案,但最終沒找到合適的。下面給大家分享JS進度條順滑版實現(xiàn)代碼,需要的朋友參考下吧

進度條不順滑

相信大多前端同學都自己寫過音頻、視頻播放器,實現(xiàn)并不復雜。最近在小程序里,做了一個類似微博刷視頻的需求。其中有一部分功能需要實現(xiàn)自定義進度條,在做完第一版之后發(fā)現(xiàn)進度條不順滑,而后想查查網(wǎng)上看有沒有什么好的方案,但最終沒找到合適的。于是想看看微信小程序里的“微博”進度條如何,結(jié)果也是很生硬的動畫,下面放了一個GIF,大家也可以自己搜索微信小程序的微博,找個視頻看看效果。

常規(guī)方案

最終決定還是優(yōu)化一下這個問題,先來捋一捋我們現(xiàn)有常規(guī)方案。

  • 監(jiān)聽TimeUpdate事件
  • 獲取到當前播放時間,通過總時間計算進度百分比(currentTime / duration * 100)
  • 進度條width屬性設置進度百分比

現(xiàn)有的方案是依賴事件獲取當前播放時間,而這個事件大概在100~350毫秒觸發(fā)一次,下面是我記錄的小程序的事件對象隊列。

[
    {"detail":{"currentTime":0.10509,"duration":5.83}},
    {"detail":{"currentTime":0.364527,"duration":5.83}},
    {"detail":{"currentTime":0.613648,"duration":5.83}},
]

目前的問題在于,每次獲取到事件,就會更新進度條,沒有過度動畫效果,非常的生硬,下面是一個5s總時長的進度條變化過程:

核心代碼:

const onProgress = (e, $dom) => {
    const updateFunc = (percent) => {
        $dom.style.width = percent+'%'
    }
    let percent = ((e.detail.currentTime / e.detail.duration) * 100).toFixed(1)
    updateFunc(percent)
}

transition

我們能很快想到用CSS的動畫屬性來做優(yōu)化,想要靈活的控制,我選擇使用 transition。transition可以定義動畫執(zhí)行時長,當我們改變width時,transition就會在規(guī)定時間內(nèi)用動畫的方式改變進度條寬度。首先動畫執(zhí)行時長一定要固定,并且在上一個執(zhí)行時長結(jié)束之前最好不要再對width做改動,否則會導致沖突,動畫會變得很奇怪。

  • 選擇一個合理的transition執(zhí)行時間:0.5s
  • 根據(jù)當前總時長,求出0.5s在進度條中所屬百分比(100/duration/2)
  • 第一次TimeUpdate事件,就執(zhí)行width改變,把進度條設置到0.5s的位置:width = 100/duration/2
  • 非第一次TimeUpdate事件,每當currentTime超過上一次進度條位置,就更新當前進度條百分比

聽起來有點不好理解,我們畫個圖:

  1. 當?shù)谝淮斡|發(fā)TimeUpdate事件,0.1336秒的時候(當然這個值隨機的,可能是0.1~0.3之間),我們就設置width到0.5s的位置,這樣進度條就和視頻同步在運動,和真實的進度相差微弱的0.1秒。在動畫執(zhí)行的0.5s之間,UpdateTime也會有多次觸發(fā),
  2. 當某次UpdateTime的currentTime(0.7123s,這個值也是隨機的)值大于上次執(zhí)行的0.5s時,這個時候進度條的位置大概也在0.5s周圍,我們再次觸發(fā)下一個0.5s動畫,也就是把width設置為1s的進度條位置
  3. 而后下個迭代currentTime>1s,width設置為1.5s,這樣循環(huán)下去。

核心代碼:

const playControl = {
  percent: 0,
  time: 0,
  duration: 0,
  first: true
}
const onProgress = (e, $dom) => {
    const updateFunc = (percent) => {
        playControl.percent = percent
        playControl.time = e.detail.currentTime
        $dom.style.width = percent+'%'
    }
    //當前視頻進度第一次更新
    if (playControl.first) {
        playControl.duration = e.detail.duration
        playControl.first = false
        updateFunc(100 / e.detail.duration / 2)
    } else {
        let percent = ((e.detail.currentTime / e.detail.duration) * 100).toFixed(1)
        if (percent - playControl.percent > 0 || e.detail.currentTime >= e.detail.duration) {
            updateFunc(percent)
        }
    }
}

最終效果對比(PS:gif圖效果有折損)

60s版本看起來和普通版差不多?把另一個60s擋住,來回對比,會發(fā)現(xiàn)還是有些區(qū)別。

解釋起來還是有點費勁,還是沒看明白?直接去看github倉庫代碼,代碼可直接運行:https://github.com/zimv/smooth-progress

此方案在部分場景下會有短暫延遲,比如暫停、拖動等,​個人總體覺得利大于弊。

到此這篇關于JS實現(xiàn)進度條順滑版詳細方案的文章就介紹到這了,更多相關JS進度條順滑版 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • countUp.js實現(xiàn)數(shù)字滾動效果

    countUp.js實現(xiàn)數(shù)字滾動效果

    這篇文章主要為大家詳細介紹了countUp.js實現(xiàn)數(shù)字滾動效果,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-10-10
  • 淺談Web Storage API的使用

    淺談Web Storage API的使用

    Web Storage為瀏覽器提供了方便的key value存儲,是一種比cookie更加方便簡潔的存儲方式。也是諸多客戶端存儲方式中非常常見的一種
    2021-06-06
  • CocosCreator實現(xiàn)技能冷卻效果

    CocosCreator實現(xiàn)技能冷卻效果

    這篇文章主要介紹了CocosCreator實現(xiàn)技能冷卻效果,同學們可以跟著教程,親手試一下,代碼都是可以復用的
    2021-04-04
  • Javascript 浮點運算的問題分析與解決方法

    Javascript 浮點運算的問題分析與解決方法

    JavaScript 只有一種數(shù)字類型 Number ,而且在Javascript中所有的數(shù)字都是以IEEE-754標準格式表示的。 浮點數(shù)的精度問題不是JavaScript特有的,因為有些小數(shù)以二進制表示位數(shù)是無窮的
    2013-08-08
  • JavaScript實現(xiàn)樓梯滾動特效(jQuery實現(xiàn))

    JavaScript實現(xiàn)樓梯滾動特效(jQuery實現(xiàn))

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)樓梯滾動特效,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 基于layui輪播圖滿屏是高度自適應的解決方法

    基于layui輪播圖滿屏是高度自適應的解決方法

    今天小編就為大家分享一篇基于layui輪播圖滿屏是高度自適應的解決方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-09-09
  • 淺談JS繼承_寄生式繼承 & 寄生組合式繼承

    淺談JS繼承_寄生式繼承 & 寄生組合式繼承

    下面小編就為大家?guī)硪黄獪\談JS繼承_寄生式繼承 & 寄生組合式繼承。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-08-08
  • ES6 Array常用擴展的應用實例分析

    ES6 Array常用擴展的應用實例分析

    這篇文章主要介紹了ES6 Array常用擴展的應用,結(jié)合實例形式分析各種常見擴展方法針對Array數(shù)組的轉(zhuǎn)換、遍歷、查找、運算等相關操作技巧,需要的朋友可以參考下
    2019-06-06
  • 微信小程序之側(cè)邊欄滑動實現(xiàn)過程解析(附完整源碼)

    微信小程序之側(cè)邊欄滑動實現(xiàn)過程解析(附完整源碼)

    這篇文章主要介紹了微信小程序之側(cè)邊欄滑動實現(xiàn)過程解析(附完整源碼),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-08-08
  • 禁用頁面部分JavaScript方法的具體實現(xiàn)

    禁用頁面部分JavaScript方法的具體實現(xiàn)

    方法重寫,重寫要禁用的方法,并讓它什么也不做,結(jié)果證明真的可行,但并不知道是不是一個科學的方法,我拿出來與大家共同討論一下
    2013-07-07

最新評論

二连浩特市| 时尚| 贵州省| 襄樊市| 固原市| 兰溪市| 延津县| 施甸县| 洱源县| 普兰县| 广河县| 察隅县| 雷山县| 县级市| 日土县| 普安县| 宁乡县| 滨州市| 政和县| 安平县| 大石桥市| 榆树市| 黑龙江省| 中阳县| 大城县| 墨脱县| 县级市| 兴国县| 保德县| 元谋县| 安福县| 龙南县| 天峻县| 保康县| 巴马| 英德市| 苏州市| 莎车县| 新泰市| 丁青县| 仙游县|