播放器增加快进快退控件
This commit is contained in:
@@ -120,6 +120,28 @@ function PlayPageClient() {
|
|||||||
|
|
||||||
// 网页全屏状态 - 控制导航栏的显示隐藏
|
// 网页全屏状态 - 控制导航栏的显示隐藏
|
||||||
const [isWebFullscreen, setIsWebFullscreen] = useState(false);
|
const [isWebFullscreen, setIsWebFullscreen] = useState(false);
|
||||||
|
// 原生全屏状态
|
||||||
|
const [isNativeFullscreen, setIsNativeFullscreen] = useState(false);
|
||||||
|
|
||||||
|
// 监听浏览器原生全屏事件
|
||||||
|
useEffect(() => {
|
||||||
|
const handleFullscreenChange = () => {
|
||||||
|
const isFullscreen = !!document.fullscreenElement;
|
||||||
|
setIsNativeFullscreen(isFullscreen);
|
||||||
|
};
|
||||||
|
|
||||||
|
document.addEventListener('fullscreenchange', handleFullscreenChange);
|
||||||
|
document.addEventListener('webkitfullscreenchange', handleFullscreenChange);
|
||||||
|
document.addEventListener('mozfullscreenchange', handleFullscreenChange);
|
||||||
|
document.addEventListener('MSFullscreenChange', handleFullscreenChange);
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
document.removeEventListener('fullscreenchange', handleFullscreenChange);
|
||||||
|
document.removeEventListener('webkitfullscreenchange', handleFullscreenChange);
|
||||||
|
document.removeEventListener('mozfullscreenchange', handleFullscreenChange);
|
||||||
|
document.removeEventListener('MSFullscreenChange', handleFullscreenChange);
|
||||||
|
};
|
||||||
|
}, []);
|
||||||
|
|
||||||
// 跳过片头片尾配置
|
// 跳过片头片尾配置
|
||||||
const [skipConfig, setSkipConfig] = useState<{
|
const [skipConfig, setSkipConfig] = useState<{
|
||||||
@@ -4625,6 +4647,73 @@ function PlayPageClient() {
|
|||||||
setIsWebFullscreen(isFullscreen);
|
setIsWebFullscreen(isFullscreen);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// 添加全屏快进快退按钮
|
||||||
|
artPlayerRef.current.layers.add({
|
||||||
|
name: 'seek-buttons',
|
||||||
|
html: `
|
||||||
|
<div class="seek-buttons-container" style="display: none;">
|
||||||
|
<button class="seek-button seek-backward" style="position: fixed; left: 20px; top: 40%; transform: translateY(-50%); width: 48px; height: 48px; background: rgba(0,0,0,0.7); border: none; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; z-index: 9999; transition: opacity 0.2s;">
|
||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M11 18V6l-8.5 6 8.5 6zm.5-6l8.5 6V6l-8.5 6z" fill="white"/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
<button class="seek-button seek-forward" style="position: fixed; right: 20px; top: 40%; transform: translateY(-50%); width: 48px; height: 48px; background: rgba(0,0,0,0.7); border: none; border-radius: 50%; display: flex; align-items: center; justify-content: center; cursor: pointer; z-index: 9999; transition: opacity 0.2s;">
|
||||||
|
<svg width="24" height="24" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M4 18l8.5-6L4 6v12zm9-12v12l8.5-6L13 6z" fill="white"/>
|
||||||
|
</svg>
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
`,
|
||||||
|
mounted: ($el: HTMLElement) => {
|
||||||
|
const container = $el.querySelector('.seek-buttons-container') as HTMLElement;
|
||||||
|
const backwardBtn = $el.querySelector('.seek-backward') as HTMLElement;
|
||||||
|
const forwardBtn = $el.querySelector('.seek-forward') as HTMLElement;
|
||||||
|
|
||||||
|
// 快退5秒
|
||||||
|
backwardBtn.onclick = () => {
|
||||||
|
if (artPlayerRef.current) {
|
||||||
|
artPlayerRef.current.currentTime = Math.max(0, artPlayerRef.current.currentTime - 5);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 快进5秒
|
||||||
|
forwardBtn.onclick = () => {
|
||||||
|
if (artPlayerRef.current) {
|
||||||
|
artPlayerRef.current.currentTime = Math.min(artPlayerRef.current.duration, artPlayerRef.current.currentTime + 5);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// 监听全屏状态变化
|
||||||
|
const updateVisibility = () => {
|
||||||
|
const isFullscreen = artPlayerRef.current?.fullscreen || artPlayerRef.current?.fullscreenWeb || !!document.fullscreenElement;
|
||||||
|
const isMobile = Math.min(window.innerWidth, window.innerHeight) < 768;
|
||||||
|
const controlsVisible = !artPlayerRef.current?.template?.$player?.classList.contains('art-hide-cursor');
|
||||||
|
|
||||||
|
if (container) {
|
||||||
|
const shouldShow = isFullscreen && isMobile && controlsVisible;
|
||||||
|
container.style.display = shouldShow ? 'block' : 'none';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
artPlayerRef.current.on('fullscreen', updateVisibility);
|
||||||
|
artPlayerRef.current.on('fullscreenWeb', updateVisibility);
|
||||||
|
document.addEventListener('fullscreenchange', updateVisibility);
|
||||||
|
window.addEventListener('resize', updateVisibility);
|
||||||
|
|
||||||
|
// 监听鼠标移动和视频事件来检测控件显示/隐藏
|
||||||
|
artPlayerRef.current.on('video:timeupdate', updateVisibility);
|
||||||
|
if (artPlayerRef.current.template?.$player) {
|
||||||
|
const observer = new MutationObserver(updateVisibility);
|
||||||
|
observer.observe(artPlayerRef.current.template.$player, {
|
||||||
|
attributes: true,
|
||||||
|
attributeFilter: ['class']
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
updateVisibility();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
// 监听视频可播放事件,这时恢复播放进度更可靠
|
// 监听视频可播放事件,这时恢复播放进度更可靠
|
||||||
artPlayerRef.current.on('video:canplay', () => {
|
artPlayerRef.current.on('video:canplay', () => {
|
||||||
// 若存在需要恢复的播放进度,则跳转
|
// 若存在需要恢复的播放进度,则跳转
|
||||||
|
|||||||
Reference in New Issue
Block a user