Skip to content

Commit e858972

Browse files
committed
fix(types): allow string or element
1 parent 81a4148 commit e858972

File tree

3 files changed

+60
-73
lines changed

3 files changed

+60
-73
lines changed

src/global.interface.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ export interface ScrollToElementOptions {
1111
onDone?: any;
1212
container?: any;
1313
onAborting?: any;
14-
element?: HTMLElement;
14+
element?: HTMLElement | string;
1515
}
1616

1717
export interface ScrollToElementPosition {

src/helpers/helper.ts

+21-16
Original file line numberDiff line numberDiff line change
@@ -1,50 +1,55 @@
1-
import { ScrollToElementOptions, ScrollToElementPosition } from '../global.interface';
1+
import { ScrollToElementOptions, ScrollToElementPosition } from './../global.interface';
22

3-
export const $ = (selector: HTMLElement): HTMLElement => {
3+
export const $ = (selector: HTMLElement | string): HTMLElement => {
44
if (typeof selector === 'string') {
55
return document.querySelector(selector);
66
}
77
return selector;
88
};
99

10-
export const extend = (...args: ScrollToElementOptions[]): ScrollToElementOptions =>
11-
Object.assign({}, ...args);
10+
export const extend = (...args: ScrollToElementOptions[]): ScrollToElementOptions => Object.assign({}, ...args);
1211

1312
export const cumulativeOffset = (element: HTMLElement | any): ScrollToElementPosition => {
13+
let el = element;
1414
let top = 0;
1515
let left = 0;
1616

1717
do {
18-
top += element.offsetTop || 0;
19-
left += element.offsetLeft || 0;
20-
element = element.offsetParent;
21-
} while (element);
18+
top += el.offsetTop || 0;
19+
left += el.offsetLeft || 0;
20+
el = el.offsetParent;
21+
} while (el);
2222

2323
return {
2424
top,
2525
left
2626
};
2727
};
2828

29-
export const directScroll = (element: HTMLElement | any): boolean =>
30-
element && element !== document && element !== document.body;
29+
export const directScroll = (element: HTMLElement | any): boolean => element && element !== document && element !== document.body;
3130

32-
export const scrollTop = (element: HTMLElement | any, value?: number): number => {
31+
export const scrollTop = (el: HTMLElement | string, value?: number): number => {
32+
const element = $(el);
3333
const inSetter = value !== undefined;
3434
if (directScroll(element)) {
35-
return inSetter ? (element.scrollTop = value) : element.scrollTop;
35+
const result = inSetter ? (element.scrollTop = value) : element.scrollTop;
36+
return result;
3637
}
37-
return inSetter
38+
const res = inSetter
3839
? (document.documentElement.scrollTop = document.body.scrollTop = value)
3940
: window.pageYOffset || document.documentElement.scrollTop || document.body.scrollTop || 0;
41+
return res;
4042
};
4143

42-
export const scrollLeft = (element: HTMLElement, value?: number): number => {
44+
export const scrollLeft = (el: HTMLElement | string, value?: number): number => {
45+
const element = $(el);
4346
const inSetter = value !== undefined;
4447
if (directScroll(element)) {
45-
return inSetter ? (element.scrollLeft = value) : element.scrollLeft;
48+
const res = inSetter ? (element.scrollLeft = value) : element.scrollLeft;
49+
return res;
4650
}
47-
return inSetter
51+
const res = inSetter
4852
? (document.documentElement.scrollLeft = document.body.scrollLeft = value)
4953
: window.pageXOffset || document.documentElement.scrollLeft || document.body.scrollLeft || 0;
54+
return res;
5055
};

src/services/service.ts

+38-56
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { cubicInOut } from 'svelte/easing';
22
import { loop, noop, now } from 'svelte/internal';
33
import { ScrollToElementOptions } from '../global.interface';
4-
import { $, cumulativeOffset, extend, scrollLeft, scrollTop } from '../helpers/helper.js';
4+
import { $, cumulativeOffset, extend, scrollLeft, scrollTop } from '../helpers/helper';
55

66
const defaultOptions: ScrollToElementOptions = {
77
container: 'body',
@@ -17,20 +17,7 @@ const defaultOptions: ScrollToElementOptions = {
1717
};
1818

1919
const scrollToInternal = (options: ScrollToElementOptions): (() => void) => {
20-
const {
21-
duration,
22-
delay,
23-
easing,
24-
x = 0,
25-
y = 0,
26-
scrollX,
27-
scrollY,
28-
onStart,
29-
onDone,
30-
container,
31-
onAborting,
32-
element
33-
} = options;
20+
const { duration, delay, easing, x = 0, y = 0, scrollX, scrollY, onStart, onDone, container, onAborting, element } = options;
3421

3522
let { offset } = options;
3623

@@ -55,9 +42,9 @@ const scrollToInternal = (options: ScrollToElementOptions): (() => void) => {
5542
const startTime = now() + delay;
5643
const endTime = startTime + duration;
5744

58-
function scrollToTopLeft(element: HTMLElement, top: number, left: number): void {
59-
if (scrollX) scrollLeft(element, left);
60-
if (scrollY) scrollTop(element, top);
45+
function scrollToTopLeft(el: HTMLElement | string, top: number, left: number): void {
46+
if (scrollX) scrollLeft(el, left);
47+
if (scrollY) scrollTop(el, top);
6148
}
6249

6350
function start(delayStart: number | boolean): void {
@@ -106,85 +93,80 @@ const scrollToInternal = (options: ScrollToElementOptions): (() => void) => {
10693
return stop;
10794
};
10895

109-
const proceedOptions = (options: ScrollToElementOptions): ScrollToElementOptions => {
110-
const opts = extend({}, defaultOptions, options);
96+
const proceedOptions = (options: ScrollToElementOptions | string): ScrollToElementOptions => {
97+
const opts = extend({}, defaultOptions, options as ScrollToElementOptions);
11198
opts.container = $(opts.container);
11299
opts.element = $(opts.element);
113100
return opts;
114101
};
115102

116103
const scrollContainerHeight = (containerElement: HTMLElement | Document): number => {
117104
if (containerElement && containerElement !== document && containerElement !== document.body) {
118-
return (
119-
(containerElement as HTMLElement).scrollHeight -
120-
(containerElement as HTMLElement).offsetHeight
121-
);
105+
return (containerElement as HTMLElement).scrollHeight - (containerElement as HTMLElement).offsetHeight;
122106
}
123107
const { body } = document;
124108
const html = document.documentElement;
125109

126-
return Math.max(
127-
body.scrollHeight,
128-
body.offsetHeight,
129-
html.clientHeight,
130-
html.scrollHeight,
131-
html.offsetHeight
132-
);
110+
return Math.max(body.scrollHeight, body.offsetHeight, html.clientHeight, html.scrollHeight, html.offsetHeight);
133111
};
134112

135113
const setGlobalOptions = (options: ScrollToElementOptions): void => {
136114
extend(defaultOptions, options || {});
137115
};
138116

139-
const scrollTo = (options: ScrollToElementOptions): (() => void) =>
140-
scrollToInternal(proceedOptions(options));
117+
const scrollTo = (options: ScrollToElementOptions): (() => void) => scrollToInternal(proceedOptions(options));
141118

142119
const scrollToBottom = (options?: ScrollToElementOptions): (() => void) => {
143-
options = proceedOptions(options);
120+
const opts = proceedOptions(options);
144121

145122
return scrollToInternal(
146-
extend(options, {
123+
extend(opts, {
147124
element: null,
148125
y: scrollContainerHeight(options.container)
149126
})
150127
);
151128
};
152129

153130
const scrollToTop = (options?: ScrollToElementOptions): (() => void) => {
154-
options = proceedOptions(options);
131+
const opts = proceedOptions(options);
155132

156133
return scrollToInternal(
157-
extend(options, {
134+
extend(opts, {
158135
element: null,
159136
y: 0
160137
})
161138
);
162139
};
163140

164-
const makeScrollToAction =
165-
(scrollToFunc: Function) => (node: Node, options: ScrollToElementOptions) => {
166-
let current = options;
167-
const handle: EventListenerOrEventListenerObject = (e: Event) => {
168-
e.preventDefault();
169-
scrollToFunc(typeof current === 'string' ? { element: current } : current);
170-
};
171-
node.addEventListener('click', handle);
172-
node.addEventListener('touchstart', handle);
173-
return {
174-
update(options: ScrollToElementOptions): void {
175-
current = options;
176-
},
177-
destroy(): void {
178-
node.removeEventListener('click', handle);
179-
node.removeEventListener('touchstart', handle);
180-
}
181-
};
141+
const makeScrollToAction = (scrollToFunc: Function) => (node: Node, options: ScrollToElementOptions) => {
142+
let current = options;
143+
// eslint-disable-next-line no-undef
144+
const handle: EventListenerOrEventListenerObject = (e: Event) => {
145+
e.preventDefault();
146+
scrollToFunc(typeof current === 'string' ? { element: current } : current);
147+
};
148+
node.addEventListener('click', handle);
149+
node.addEventListener('touchstart', handle);
150+
return {
151+
update(opts: ScrollToElementOptions): void {
152+
current = opts;
153+
},
154+
destroy(): void {
155+
node.removeEventListener('click', handle);
156+
node.removeEventListener('touchstart', handle);
157+
}
182158
};
159+
};
183160

184161
// Actions
185162
export const scrollto = makeScrollToAction(scrollTo);
186163
export const scrolltotop = makeScrollToAction(scrollToTop);
187164
export const scrolltobottom = makeScrollToAction(scrollToBottom);
188165

189166
// Methods
190-
export const animateScroll = { scrollTo, scrollToTop, scrollToBottom, setGlobalOptions };
167+
export const animateScroll = {
168+
scrollTo,
169+
scrollToTop,
170+
scrollToBottom,
171+
setGlobalOptions
172+
};

0 commit comments

Comments
 (0)