中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS怎么實現進度條順滑功能

發布時間:2021-08-02 10:22:23 來源:億速云 閱讀:141 作者:chen 欄目:開發技術

本篇內容主要講解“JS怎么實現進度條順滑功能”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“JS怎么實現進度條順滑功能”吧!

進度條不順滑

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

JS怎么實現進度條順滑功能

常規方案

最終決定還是優化一下這個問題,先來捋一捋我們現有常規方案。

  • 監聽TimeUpdate事件

  • 獲取到當前播放時間,通過總時間計算進度百分比(currentTime / duration * 100)

  • 進度條width屬性設置進度百分比

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

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

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

JS怎么實現進度條順滑功能

核心代碼:

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的動畫屬性來做優化,想要靈活的控制,我選擇使用 transition。transition可以定義動畫執行時長,當我們改變width時,transition就會在規定時間內用動畫的方式改變進度條寬度。首先動畫執行時長一定要固定,并且在上一個執行時長結束之前最好不要再對width做改動,否則會導致沖突,動畫會變得很奇怪。

  • 選擇一個合理的transition執行時間:0.5s

  • 根據當前總時長,求出0.5s在進度條中所屬百分比(100/duration/2)

  • 第一次TimeUpdate事件,就執行width改變,把進度條設置到0.5s的位置:width = 100/duration/2

  • 非第一次TimeUpdate事件,每當currentTime超過上一次進度條位置,就更新當前進度條百分比

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

JS怎么實現進度條順滑功能

  1. 當第一次觸發TimeUpdate事件,0.1336秒的時候(當然這個值隨機的,可能是0.1~0.3之間),我們就設置width到0.5s的位置,這樣進度條就和視頻同步在運動,和真實的進度相差微弱的0.1秒。在動畫執行的0.5s之間,UpdateTime也會有多次觸發,

  2. 當某次UpdateTime的currentTime(0.7123s,這個值也是隨機的)值大于上次執行的0.5s時,這個時候進度條的位置大概也在0.5s周圍,我們再次觸發下一個0.5s動畫,也就是把width設置為1s的進度條位置

  3. 而后下個迭代currentTime>1s,width設置為1.5s,這樣循環下去。

核心代碼:

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圖效果有折損)

JS怎么實現進度條順滑功能

60s版本看起來和普通版差不多?把另一個60s擋住,來回對比,會發現還是有些區別。

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

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

到此,相信大家對“JS怎么實現進度條順滑功能”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

js
AI

漳州市| 肇庆市| 宜城市| 永吉县| 南宁市| 工布江达县| 吐鲁番市| 荆州市| 原阳县| 临湘市| 渭源县| 新晃| 铁力市| 买车| 汉沽区| 板桥市| 兴山县| 东宁县| 思南县| 长沙市| 都江堰市| 册亨县| 鸡西市| 梅州市| 青阳县| 泰顺县| 信阳市| 宝鸡市| 葵青区| 观塘区| 藁城市| 龙海市| 灌阳县| 江达县| 北安市| 达拉特旗| 禹州市| 光山县| 徐汇区| 北辰区| 得荣县|