Skip to content

Commit

Permalink
fix collision with native scroll-behavior
Browse files Browse the repository at this point in the history
  • Loading branch information
Daniel Kurowski committed Jan 30, 2024
1 parent ea2d4c6 commit 1c12698
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 2 deletions.
37 changes: 37 additions & 0 deletions src/scrollers/NativeScrollBehavior.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
type ScrollBehavior = 'auto' | 'smooth' | 'inherit' | 'initial' | 'revert' | 'revert-layer' | 'unset';

class NativeScrollBehavior
{
private originalValue: ScrollBehavior|null = null;

private constructor(
private readonly rootEl: HTMLHtmlElement,
) {}

public static forWindowObject(): NativeScrollBehavior
{
return new this(
document.documentElement as HTMLHtmlElement,
);
}


public remove(): void
{
this.originalValue = window.getComputedStyle(this.rootEl).getPropertyValue('scrollBehavior') as ScrollBehavior;
this.rootEl.style.scrollBehavior = 'unset';
}

public restore(): void
{
if (this.originalValue === null) {
return;
}

this.rootEl.style.scrollBehavior = this.originalValue;
}

}

// export singleton instance
export const nativeScrollBehavior = NativeScrollBehavior.forWindowObject();
7 changes: 6 additions & 1 deletion src/scrollers/scrollToElement.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,16 @@
import * as Velocity from 'velocity-animate';
import {EASE_IN_SKIP_OUT_EASING} from '../easing/bindEasingToVelocity';
import {nativeScrollBehavior} from './NativeScrollBehavior';

export function scrollToElement(element: HTMLElement, onScrollFinishedCallback?: () => void): void
{
nativeScrollBehavior.remove();
Velocity.animate(element, 'scroll', {
duration: 1200, // todo: different depending on offset from page top?
easing: EASE_IN_SKIP_OUT_EASING,
complete: () => onScrollFinishedCallback !== undefined && onScrollFinishedCallback(),
complete: () => {
nativeScrollBehavior.restore();
onScrollFinishedCallback !== undefined && onScrollFinishedCallback();
},
});
}
7 changes: 6 additions & 1 deletion src/scrollers/scrollToOffset.ts
Original file line number Diff line number Diff line change
@@ -1,11 +1,13 @@
import * as Velocity from 'velocity-animate';
import {EASE_IN_SKIP_OUT_EASING} from '../easing/bindEasingToVelocity';
import {nativeScrollBehavior} from "./NativeScrollBehavior";

export function scrollToOffset(
topOffset: number,
onScrollFinishedCallback?: () => void,
): void
{
nativeScrollBehavior.remove();
/**
* Setting `<html>` as the element to scroll to with offset simulates `window.scrollTo()` behavior.
* See last paragraph at http://velocityjs.org/#scroll
Expand All @@ -14,6 +16,9 @@ export function scrollToOffset(
duration: 1200, // todo: different depending on offset from page top?
offset: topOffset,
easing: EASE_IN_SKIP_OUT_EASING,
complete: onScrollFinishedCallback,
complete: () => {
nativeScrollBehavior.restore();
onScrollFinishedCallback !== undefined && onScrollFinishedCallback();
},
});
}

0 comments on commit 1c12698

Please sign in to comment.