/**
* @file volume-bar.js
*/
從'../../slider/slider.js'導入滑塊;
從 '../../component.js' 導入組件;
import * as Dom from '../../utils/dom.js';
從 '../../utils/clamp.js' 導入箝位;
從 '../../utils/browser.js' 導入 {IS_IOS, IS_ANDROID};
// 必需的孩子
導入“./volume-level.js”;
導入 './mouse-volume-level-display.js';
/**
* 包含音量級別的欄,可以單擊以調整級別
*
* @extends 滑塊
*/
類 VolumeBar 擴展滑塊 {
/**
* 創建此類的一個實例。
*
* @param {Player} 播放器
* 此類應附加到的 `Player`。
*
* @param {對象} [選項]
* 播放器選項的鍵/值存儲。
*/
構造函數(播放器,選項){
超級(播放器,選項);
this.on('slideractive', (e) => this.updateLastVolume_(e));
this.on(player, 'volumechange', (e) => this.updateARIAAttributes(e));
player.ready(() => this.updateARIAAttributes());
}
/**
* 創建 `Component` 的 DOM 元素
*
* @return {元素}
* 創建的元素。
*/
創建El() {
返回 super.createEl('div', {
className: 'vjs-volume-bar vjs-slider-bar'
},{
'aria-label': this.localize('音量級別'),
'aria-live':'禮貌'
});
}
/**
* 在音量條上按下鼠標
*
* @param {EventTarget~Event} 事件
* 導致它運行的 `mousedown` 事件。
*
* @listens mousedown
*/
handleMouseDown(事件){
如果(!Dom.isSingleLeftClick(事件)){
返回;
}
super.handleMouseDown(事件);
}
/**
* 處理 {@link VolumeMenuButton} 上的移動事件。
*
* @param {EventTarget~Event} 事件
* 導致此函數運行的事件。
*
* @listens 鼠標移動
*/
handleMouseMove(事件){
const mouseVolumeLevelDisplay = this.getChild('mouseVolumeLevelDisplay');
如果(mouseVolumeLevelDisplay){
const volumeBarEl = this.el();
const volumeBarRect = Dom.getBoundingClientRect(volumeBarEl);
const vertical = this.vertical();
讓 volumeBarPoint = Dom.getPointerPosition(volumeBarEl, event);
volumeBarPoint = vertical ? volumeBarPoint.y : volumeBarPoint.x;
// 默認皮膚在 `VolumeBar` 的兩側都有一個間隙。這意味著
// 可以在邊界之外觸發此行為
// `音量條`。這確保我們始終留在其中。
volumeBarPoint = clamp(volumeBarPoint, 0, 1);
mouseVolumeLevelDisplay.update(volumeBarRect, volumeBarPoint, vertical);
}
如果(!Dom.isSingleLeftClick(事件)){
返回;
}
this.checkMuted();
this.player_.volume(this.calculateDistance(event));
}
/**
* 如果播放器靜音,請取消靜音。
*/
檢查靜音(){
如果 (this.player_.muted()) {
this.player_.muted(false);
}
}
/**
* 獲取音量百分比
*
* @return {數字}
* 音量百分比為十進制數。
*/
getPercent() {
如果 (this.player_.muted()) {
返回 0;
}
返回 this.player_.volume();
}
/**
* 增加鍵盤用戶的音量
*/
向前一步() {
this.checkMuted();
this.player_.volume(this.player_.volume() + 0.1);
}
/**
* 降低鍵盤用戶的音量
*/
退後() {
this.checkMuted();
this.player_.volume(this.player_.volume() - 0.1);
}
/**
* 更新 ARIA 輔助功能屬性
*
* @param {EventTarget~Event} [事件]
* 導致此函數運行的 `volumechange` 事件。
*
* @listens Player#volumechange
*/
更新 ARIAAttributes(事件){
const ariaValue = this.player_.muted() ?0 : this.volumeAsPercentage_();
this.el_.setAttribute('aria-valuenow', ariaValue);
this.el_.setAttribute('aria-valuetext', ariaValue + '%');
}
/**
* 以百分比形式返回播放器音量的當前值
*
* @私人的
*/
volumeAsPercentage_() {
返回 Math.round(this.player_.volume() * 100);
}
/**
* 當用戶開始拖動 VolumeBar 時,存儲音量並監聽
* 拖動結束。當拖動結束時,如果音量設置為零,
* 將 lastVolume 設置為存儲的音量。
*
* @listens slideractive
* @私人的
*/
updateLastVolume_() {
const volumeBeforeDrag = this.player_.volume();
this.one('sliderinactive', () => {
如果 (this.player_.volume() === 0) {
this.player_.lastVolume_(volumeBeforeDrag);
}
});
}
}
/**
* `VolumeBar` 的默認選項
*
* @type {對象}
* @私人的
*/
VolumeBar.prototype.options_ = {
孩子們: [
'音量級別'
]、
barName: 'volumeLevel'
};
// MouseVolumeLevelDisplay 工具提示不應添加到移動設備上的播放器
如果(!IS_IOS &&!IS_ANDROID){
VolumeBar.prototype.options_.children.splice(0, 0, 'mouseVolumeLevelDisplay');
}
/**
* 當播放器上發生此事件時,調用此 Slider 的更新事件。
*
* @type {字符串}
*/
VolumeBar.prototype.playerEvent = 'volumechange';
Component.registerComponent('VolumeBar', VolumeBar);
導出默認音量條;