Skip to content

Commit 1d70eff

Browse files
committed
fix: 修复异常的黑色遮罩 #429
1 parent 0113889 commit 1d70eff

File tree

5 files changed

+64
-24
lines changed

5 files changed

+64
-24
lines changed

src/components/HorizontalScrollView.vue

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ function handleMouseScroll(event: WheelEvent) {
8282

8383
<style lang="scss" scoped>
8484
.scroll-mask {
85-
mask-image: linear-gradient(to right, transparent 0%, black 40px calc(100% - 40px), transparent 100%);
86-
-webkit-mask-image: linear-gradient(to right, transparent 0%, black 40px calc(100% - 40px), transparent 100%);
85+
mask-image: linear-gradient(to right, transparent 0, black 40px, black calc(100% - 40px), transparent 100%);
86+
-webkit-mask-image: linear-gradient(to right, transparent 0, black 40px, black calc(100% - 40px), transparent 100%);
8787
}
8888
</style>

src/components/Settings/Settings.vue

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -210,11 +210,11 @@ function setCurrentTitle() {
210210
<!-- Mask -->
211211
<div
212212
pos="absolute top-0 left-0" w-inherit h-inherit pointer-events-none
213-
style="
214-
mask-image: linear-gradient(to bottom, black 0, transparent 100%);
215-
-webkit-mask-image: linear-gradient(to bottom, black 0, transparent 100%);
216-
backdrop-filter: blur(6px);
217-
"
213+
:style="{
214+
maskImage: settings.enableFrostedGlass ? 'linear-gradient(to bottom, black 0, transparent 100%)' : 'none',
215+
WebkitMaskImage: settings.enableFrostedGlass ? 'linear-gradient(to bottom, black 0, transparent 100%)' : 'none',
216+
backdropFilter: 'blur(6px)',
217+
}"
218218
z--1 rounded-inherit
219219
/>
220220
<div text="3xl" fw-bold>
@@ -237,10 +237,10 @@ function setCurrentTitle() {
237237
</header>
238238
<OverlayScrollbarsComponent
239239
ref="scrollbarRef"
240-
style="
241-
mask-image: linear-gradient(to bottom, transparent 0%, black 80px 30%);
242-
-webkit-mask-image: linear-gradient(to bottom, transparent 0%, black 80px 30%);
243-
"
240+
:style="{
241+
maskImage: settings.enableFrostedGlass ? 'linear-gradient(to bottom, transparent 0%, black 80px 30%)' : 'none',
242+
WebkitMaskImage: settings.enableFrostedGlass ? 'linear-gradient(to bottom, transparent 0%, black 80px 30%)' : 'none',
243+
}"
244244
element="div" defer
245245
h-inherit
246246
:options="{

src/components/TopBar/TopBar.vue

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -119,6 +119,9 @@ const scrollTop = ref<number>(0)
119119
const oldScrollTop = ref<number>(0)
120120
const SCROLL_THRESHOLD = 10 // 滚动阈值,只有滚动超过这个值才触发顶栏显示/隐藏
121121
122+
// 保存overlay scroll的handler引用,用于正确移除监听器
123+
let overlayScrollHandler: ((scrollTop: number) => void) | null = null
124+
122125
function handleScroll(arg?: number | Event): void {
123126
// 优先使用传入的 scrollTop 值,避免重复 DOM 读取
124127
if (typeof arg === 'number') {
@@ -234,7 +237,8 @@ function setupScrollListeners() {
234237
toggleTopBarVisible(true)
235238
}
236239
237-
emitter.off(OVERLAY_SCROLL_BAR_SCROLL)
240+
// 清理之前的监听器
241+
cleanupScrollListeners()
238242
239243
// 在视频页面根据配置决定是否设置滚动监听
240244
if (isVideoOrBangumiPage()) {
@@ -247,9 +251,11 @@ function setupScrollListeners() {
247251
248252
// 设置滚动监听
249253
if (isHomePage() && !settings.value.useOriginalBilibiliHomepage) {
250-
emitter.on(OVERLAY_SCROLL_BAR_SCROLL, (payloadScrollTop) => {
254+
// 创建并保存handler引用
255+
overlayScrollHandler = (payloadScrollTop: number) => {
251256
handleScroll(payloadScrollTop)
252-
})
257+
}
258+
emitter.on(OVERLAY_SCROLL_BAR_SCROLL, overlayScrollHandler)
253259
}
254260
else {
255261
window.addEventListener('scroll', handleScroll)
@@ -258,7 +264,11 @@ function setupScrollListeners() {
258264
259265
function cleanupScrollListeners() {
260266
window.removeEventListener('scroll', handleScroll)
261-
emitter.off(OVERLAY_SCROLL_BAR_SCROLL)
267+
// 只移除我们自己的handler,不影响其他组件(如VideoCardGrid)的监听器
268+
if (overlayScrollHandler) {
269+
emitter.off(OVERLAY_SCROLL_BAR_SCROLL, overlayScrollHandler)
270+
overlayScrollHandler = null
271+
}
262272
}
263273
264274
function updateConflictingHeaderVisibility() {

src/composables/useGlobalScrollState.ts

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,23 @@
11
/**
22
* 全局滚动状态管理(单例模式)
33
* 所有组件共享同一个滚动检测,避免重复监听
4+
* 支持 window scroll 和 OverlayScrollbars
45
*/
56

67
import { onBeforeUnmount, onMounted, readonly, ref } from 'vue'
78

9+
import { OVERLAY_SCROLL_STATE_CHANGE } from '~/constants/globalEvents'
10+
import emitter from '~/utils/mitt'
11+
812
// 全局状态(单例)
913
const isScrolling = ref(false)
1014
let scrollTimeout: ReturnType<typeof setTimeout> | null = null
1115
let listenerCount = 0
12-
let isListenerAttached = false
16+
let isWindowListenerAttached = false
17+
let isOverlayListenerAttached = false
1318

14-
// 滚动处理函数(单例)
15-
function handleScroll() {
19+
// Window滚动处理函数(单例)
20+
function handleWindowScroll() {
1621
isScrolling.value = true
1722

1823
if (scrollTimeout) {
@@ -24,14 +29,30 @@ function handleScroll() {
2429
}, 150)
2530
}
2631

32+
// OverlayScrollbars滚动状态处理函数(单例)
33+
function handleOverlayScrollState(scrolling: boolean) {
34+
isScrolling.value = scrolling
35+
36+
// 如果滚动结束,清理可能存在的 timeout
37+
if (!scrolling && scrollTimeout) {
38+
clearTimeout(scrollTimeout)
39+
scrollTimeout = null
40+
}
41+
}
42+
2743
// 添加监听器(引用计数)
2844
function addScrollListener() {
2945
listenerCount++
3046

3147
// 只在第一次添加时绑定事件
32-
if (!isListenerAttached) {
33-
window.addEventListener('scroll', handleScroll, { passive: true })
34-
isListenerAttached = true
48+
if (!isWindowListenerAttached) {
49+
window.addEventListener('scroll', handleWindowScroll, { passive: true })
50+
isWindowListenerAttached = true
51+
}
52+
53+
if (!isOverlayListenerAttached) {
54+
emitter.on(OVERLAY_SCROLL_STATE_CHANGE, handleOverlayScrollState)
55+
isOverlayListenerAttached = true
3556
}
3657
}
3758

@@ -40,9 +61,17 @@ function removeScrollListener() {
4061
listenerCount--
4162

4263
// 当所有组件都卸载时,移除事件监听
43-
if (listenerCount <= 0 && isListenerAttached) {
44-
window.removeEventListener('scroll', handleScroll)
45-
isListenerAttached = false
64+
if (listenerCount <= 0) {
65+
if (isWindowListenerAttached) {
66+
window.removeEventListener('scroll', handleWindowScroll)
67+
isWindowListenerAttached = false
68+
}
69+
70+
if (isOverlayListenerAttached) {
71+
emitter.off(OVERLAY_SCROLL_STATE_CHANGE, handleOverlayScrollState)
72+
isOverlayListenerAttached = false
73+
}
74+
4675
listenerCount = 0
4776

4877
if (scrollTimeout) {

src/constants/globalEvents.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
export const TOP_BAR_VISIBILITY_CHANGE = 'topBarVisibilityChange'
22
export const OVERLAY_SCROLL_BAR_SCROLL = 'overlayScrollBarScroll'
3+
export const OVERLAY_SCROLL_STATE_CHANGE = 'overlayScrollStateChange'
34
export const BEWLY_MOUNTED = 'bewlyMounted'
45
export const DRAWER_VIDEO_ENTER_PAGE_FULL = 'drawerVideoEnterPageFull'
56
export const DRAWER_VIDEO_EXIT_PAGE_FULL = 'drawerVideoExitPageFull'

0 commit comments

Comments
 (0)