在全屏状态下鼠标在空白处静止不动3秒后自动将其隐藏

pull/930/merge
lyswhut 2022-03-28 18:05:58 +08:00
parent c2fa4e5220
commit 36bef673d3
3 changed files with 69 additions and 2 deletions

View File

@ -8,6 +8,7 @@
- 优化播放详情页背景显示,现在有背景图片的主题可以在播放详情页显示它的图片了
- 在全屏状态下的播放详情页仍会显示退出播放详情页按钮,同时在其旁边添加退出全屏按钮
- 在全屏状态下鼠标在空白处静止不动3秒后自动将其隐藏
### 修复

View File

@ -0,0 +1,55 @@
import { debounce } from '@renderer/utils/index'
let isAutoHide = false
let isLockedPointer = false
let dom = null
let event = null
let isMouseDown = false
const isControl = dom => {
if (!dom || dom === document.body) return false
// console.log(dom)
if (dom.getAttribute('aria-label') || dom.tagName == 'BUTTON') return true
return isControl(dom.parentNode)
}
const startTimeout = debounce(() => {
if (!isAutoHide || isMouseDown || !event) return
if (isControl(document.elementFromPoint(event.clientX, event.clientY))) return
dom.requestPointerLock()
isLockedPointer = true
}, 3000)
const handleMouseMove = (_event) => {
event = _event
startTimeout()
if (!isLockedPointer) return
document.exitPointerLock()
isLockedPointer = false
}
const handleMouseDown = () => {
isMouseDown = true
}
const handleMouseUp = () => {
isMouseDown = false
startTimeout()
}
export const registerAutoHideMounse = _dom => {
startTimeout()
if (isAutoHide || !_dom) return
isAutoHide = true
_dom.addEventListener('mousemove', handleMouseMove)
_dom.addEventListener('mousedown', handleMouseDown)
_dom.addEventListener('mouseup', handleMouseUp)
dom = _dom
}
export const unregisterAutoHideMounse = dom => {
if (!isAutoHide) return
isAutoHide = false
// console.log(dom)
dom?.removeEventListener('mousemove', handleMouseMove)
dom?.removeEventListener('mousedown', handleMouseDown)
dom?.removeEventListener('mouseup', handleMouseUp)
}

View File

@ -1,6 +1,6 @@
<template lang="pug">
transition(enter-active-class="animated lightSpeedIn" leave-active-class="animated slideOutDown" @after-enter="handleAfterEnter" @after-leave="handleAfterLeave")
div(:class="[$style.container, { [$style.fullscreen]: isFullscreen }]" @contextmenu="handleContextMenu" v-if="isShowPlayerDetail")
div(:class="[$style.container, { [$style.fullscreen]: isFullscreen }]" @contextmenu="handleContextMenu" v-if="isShowPlayerDetail" ref="dom_content")
div(:class="$style.bg")
//- div(:class="$style.bg" :style="bgStyle")
//- div(:class="$style.bg2")
@ -57,7 +57,7 @@ transition(enter-active-class="animated lightSpeedIn" leave-active-class="animat
<script>
import { useRefGetter, ref } from '@renderer/utils/vueTools'
import { useRefGetter, ref, watch } from '@renderer/utils/vueTools'
import { isFullscreen } from '@renderer/core/share'
import { base as eventBaseName } from '@renderer/event/names'
import {
@ -72,6 +72,7 @@ import {
import LyricPlayer from './LyricPlayer'
import PlayBar from './PlayBar'
import MusicComment from './components/MusicComment'
import { registerAutoHideMounse, unregisterAutoHideMounse } from './autoHideMounse'
export default {
name: 'CorePlayDetail',
@ -83,6 +84,7 @@ export default {
setup() {
const setting = useRefGetter('setting')
const visibled = ref(false)
const dom_content = ref(null)
let clickTime = 0
@ -103,6 +105,8 @@ export default {
}
const handleAfterEnter = () => {
if (isFullscreen.value) registerAutoHideMounse(dom_content.value)
visibled.value = true
}
@ -110,8 +114,14 @@ export default {
setShowPlayLrcSelectContentLrc(false)
hideComment(false)
visibled.value = false
unregisterAutoHideMounse(dom_content.value)
}
watch(isFullscreen, isFullscreen => {
(isFullscreen ? registerAutoHideMounse : unregisterAutoHideMounse)(dom_content.value)
})
return {
setting,
isShowPlayerDetail,
@ -125,6 +135,7 @@ export default {
handleAfterLeave,
visibled,
isFullscreen,
dom_content,
fullscreenExit() {
window.eventHub.emit(eventBaseName.fullscreenToggle, false)
},