Skip to content

Commit 5faeeae

Browse files
committed
improve scroll cancel chrome-based browsers
1 parent 426a006 commit 5faeeae

File tree

5 files changed

+14
-12
lines changed

5 files changed

+14
-12
lines changed

.eslintignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,4 @@
11
demo
2-
tests
2+
tests
3+
content
4+
content-app

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ pnpm-debug.log*
1111
node_modules
1212
dist
1313

14+
content
1415
content-app
1516
demo/dist
1617
*.tgz

src/useActive.ts

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,10 +124,6 @@ export function useActive(
124124
function _setActive(prevY: number, { isCancel } = { isCancel: false }) {
125125
const nextY = isWindow.value ? window.scrollY : (root.value as HTMLElement).scrollTop;
126126

127-
if (nextY === prevY) {
128-
return;
129-
}
130-
131127
if (nextY < prevY) {
132128
onScrollUp();
133129
} else {

src/useScroll.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { watch, onMounted, ref, computed, type Ref, type ComputedRef } from 'vue';
2-
import { isSSR, useMediaRef } from './utils';
2+
import { isChrome, isSSR, useMediaRef } from './utils';
33

44
type UseListenersOptions = {
55
isWindow: ComputedRef<boolean>;
@@ -70,14 +70,15 @@ export function useScroll({ isWindow, root, _setActive, matchMedia }: UseListene
7070
}
7171
}
7272

73-
function resetReady() {
73+
function waitForIdle() {
7474
setReady(20);
7575
}
7676

7777
function onPointerDown(event: PointerEvent) {
7878
const isLink = (event.target as HTMLElement).tagName === 'A';
7979
const hasLink = (event.target as HTMLElement).closest('a');
80-
if (!isLink && !hasLink) {
80+
81+
if (!isChrome && !isLink && !hasLink) {
8182
reScroll();
8283
// ...and force set if canceling scroll
8384
_setActive(clickY.value, { isCancel: true });
@@ -124,19 +125,19 @@ export function useScroll({ isWindow, root, _setActive, matchMedia }: UseListene
124125
const rootEl = isWindow.value ? document : root.value;
125126

126127
if (_isClick && rootEl) {
127-
rootEl.addEventListener('scroll', resetReady, ONCE);
128+
rootEl.addEventListener('scroll', waitForIdle, ONCE);
128129
rootEl.addEventListener('wheel', reScroll, ONCE);
130+
rootEl.addEventListener('touchmove', reScroll, ONCE);
129131
rootEl.addEventListener('keydown', onSpaceBar as EventListener, ONCE);
130-
rootEl.addEventListener('touchmove', reScroll as EventListener, ONCE);
131132
rootEl.addEventListener('pointerdown', onPointerDown as EventListener, ONCE);
132133
}
133134

134135
onCleanup(() => {
135136
if (_isClick && rootEl) {
136-
rootEl.removeEventListener('scroll', resetReady);
137+
rootEl.removeEventListener('scroll', waitForIdle);
137138
rootEl.removeEventListener('wheel', reScroll);
139+
rootEl.removeEventListener('touchmove', reScroll);
138140
rootEl.removeEventListener('keydown', onSpaceBar as EventListener);
139-
rootEl.removeEventListener('touchmove', reScroll as EventListener);
140141
rootEl.removeEventListener('pointerdown', onPointerDown as EventListener);
141142
}
142143
});

src/utils.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ export const isSSR = typeof window === 'undefined';
55
export const FIXED_TO_TOP_OFFSET = 10;
66
export const FIXED_OFFSET = 5;
77

8+
export const isChrome = /Chrome/.test(navigator.userAgent) && /Google Inc/.test(navigator.vendor);
9+
810
// When users set refs, if no media match, set default value
911
export function useMediaRef<T>(matchMedia: Ref<boolean>, defaultValue: T): Ref<T> {
1012
const _customRef = customRef<T>((track, trigger) => {

0 commit comments

Comments
 (0)