/**
* @file time-tooltip.js
*/
從 '../../component' 導入組件;
import * as Dom from '../../utils/dom.js';
從 '../../utils/format-time.js' 導入格式時間;
從 '../../utils/fn.js' 導入 * 作為 Fn;
/**
* 時間工具提示在進度條上方顯示時間。
*
* @extends 組件
*/
類 TimeTooltip 擴展組件 {
/**
* 創建此類的一個實例。
*
* @param {Player} 播放器
* 此類應附加到的 {@link Player}。
*
* @param {對象} [選項]
* 播放器選項的鍵/值存儲。
*/
構造函數(播放器,選項){
超級(播放器,選項);
this.update = Fn.throttle(Fn.bind(this, this.update), Fn.UPDATE_REFRESH_INTERVAL);
}
/**
* 創建時間工具提示 DOM 元素
*
* @return {元素}
* 創建的元素。
*/
創建El() {
返回 super.createEl('div', {
className: 'vjs-time-tooltip'
},{
'aria-hidden': 'true'
});
}
/**
* 更新時間工具提示相對於 `SeekBar` 的位置。
*
* @param {Object} seekBarRect
* {@link SeekBar} 元素的 `ClientRect`。
*
* @param {number} seekBarPoint
* 0到1之間的數字,代表水平參考點
* 從 {@link SeekBar} 的左邊緣
*/
更新(seekBarRect,seekBarPoint,內容){
const tooltipRect = Dom.findPosition(this.el_);
const playerRect = Dom.getBoundingClientRect(this.player_.el());
const seekBarPointPx = seekBarRect.width * seekBarPoint;
// 如果 rect 不可用則什麼都不做
// 例如,如果播放器不在 DOM 中進行測試
如果(!playerRect ||!tooltipRect){
返回;
}
// 這是邊界內可用的 `seekBarPoint` 左邊的空間
// 玩家的。我們計算玩家左邊緣之間的任何間隙
// 和 `SeekBar` 的左邊緣並添加像素數
// `SeekBar` 在點擊 `seekBarPoint` 之前
const spaceLeftOfPoint = (seekBarRect.left - playerRect.left) + seekBarPointPx;
// 這是邊界內可用的 `seekBarPoint` 的空間右邊
// 玩家的。我們從 `seekBarPoint` 計算像素數
// 到 `SeekBar` 的右邊緣並添加到它之間的任何間隙
// `SeekBar` 和播放器的右邊緣。
const spaceRightOfPoint = (seekBarRect.width - seekBarPointPx) +
(playerRect.right - seekBarRect.right);
// 這是工具提示需要拉動的像素數
// 更靠右,使其在 `seekBarPoint` 上居中。
讓 pullTooltipBy = tooltipRect.width / 2;
// 根據需要調整 `pullTooltipBy` 向左或向右的距離
// 上面空間計算的結果。
如果 (spaceLeftOfPoint < pullTooltipBy) {
pullTooltipBy += pullTooltipBy - spaceLeftOfPoint;
} else if (spaceRightOfPoint < pullTooltipBy) {
pullTooltipBy = spaceRightOfPoint;
}
// 由於基於小數/比率的計算的不精確性和變化
// 舍入行為,有些情況下間距調整關閉
// 一兩個像素。這為這些計算增加了保險。
如果(pullTooltipBy < 0){
pullTooltipBy = 0;
} else if (pullTooltipBy > tooltipRect.width) {
pullTooltipBy = tooltipRect.width;
}
// 防止0.4px以內的小寬度波動
// 改變下面的值。
// 這確實有助於防止播放
// 抖動的進度時間工具提示
pullTooltipBy = Math.round(pullTooltipBy);
this.el_.style.right = `-${pullTooltipBy}px`;
這個。寫(內容);
}
/**
* 將時間寫入工具提示 DOM 元素。
*
* @param {string} 內容
* 工具提示的格式化時間。
*/
寫(內容){
Dom.textContent(this.el_, content);
}
/**
* 更新時間工具提示相對於 `SeekBar` 的位置。
*
* @param {Object} seekBarRect
* {@link SeekBar} 元素的 `ClientRect`。
*
* @param {number} seekBarPoint
* 0到1之間的數字,代表水平參考點
* 從 {@link SeekBar} 的左邊緣
*
* @param {number} 時間
* tooltip 更新時間,直播時不使用
*
* @param {函數} cb
* 將在請求動畫幀期間調用的函數
* 對於需要在默認情況下執行額外動畫的工具提示
*/
更新時間(seekBarRect,seekBarPoint,時間,cb){
this.requestNamedAnimationFrame('TimeTooltip#updateTime', () => {
讓內容;
const duration = this.player_.duration();
如果 (this.player_.liveTracker && this.player_.liveTracker.isLive()) {
const liveWindow = this.player_.liveTracker.liveWindow();
const secondsBehind = liveWindow - (seekBarPoint * liveWindow);
content = (secondsBehind < 1 ? '' : '-') + formatTime(secondsBehind, liveWindow);
}其他{
內容=格式時間(時間,持續時間);
}
this.update(seekBarRect, seekBarPoint, content);
如果(cb){
cb();
}
});
}
}
Component.registerComponent('TimeTooltip', TimeTooltip);
導出默認時間工具提示;