use-scroller 1.1.0 → 1.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +100 -58
- package/dist/cjs/hooks/use-scroll.d.ts +10 -6
- package/dist/cjs/hooks/use-scroll.js +38 -48
- package/dist/cjs/hooks/use-window-scroll.d.ts +1 -1
- package/dist/cjs/hooks/use-window-scroll.js +29 -27
- package/dist/cjs/scroller.d.ts +5 -5
- package/dist/cjs/scroller.js +48 -51
- package/dist/cjs/utils.d.ts +17 -4
- package/dist/cjs/utils.js +35 -22
- package/dist/esm/hooks/use-scroll.d.ts +10 -6
- package/dist/esm/hooks/use-scroll.js +40 -50
- package/dist/esm/hooks/use-window-scroll.d.ts +1 -1
- package/dist/esm/hooks/use-window-scroll.js +30 -28
- package/dist/esm/scroller.d.ts +5 -5
- package/dist/esm/scroller.js +46 -49
- package/dist/esm/utils.d.ts +17 -4
- package/dist/esm/utils.js +35 -22
- package/package.json +2 -3
- package/src/hooks/use-scroll.ts +47 -58
- package/src/hooks/use-window-scroll.ts +55 -42
- package/src/scroller.ts +50 -53
- package/src/utils.ts +37 -24
package/README.md
CHANGED
|
@@ -1,22 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-

|
|
3
|
-

|
|
1
|
+
# use-scroller
|
|
4
2
|
|
|
5
|
-
|
|
3
|
+
A lightweight library that enables smooth scrolling for HTML elements using simple React hooks provided by the package. This library offers additional scrolling features and provides several callback functions for customizable scroll operations.
|
|
6
4
|
|
|
7
|
-
|
|
8
|
-
In addition to providing extra scrolling features, this library also return a number of callback that can triger scroll operation depending on the user needs.
|
|
9
|
-
|
|
10
|
-
<p align="middle">
|
|
5
|
+
<div align="center">
|
|
11
6
|
<img src="https://s9.gifyu.com/images/ezgif.com-gif-maker3092e8916a41884d.gif" width="400"/>
|
|
12
7
|
<img src="https://s3.gifyu.com/images/ezgif.com-gif-maker-1c4ee7c66dcd4dd01.gif" width="400"/>
|
|
13
|
-
</
|
|
8
|
+
</div>
|
|
14
9
|
|
|
15
10
|
## Installation
|
|
16
11
|
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
```javascript
|
|
12
|
+
```bash
|
|
20
13
|
#YARN
|
|
21
14
|
yarn add use-scroller
|
|
22
15
|
|
|
@@ -30,23 +23,42 @@ pnpm install use-scroller
|
|
|
30
23
|
|
|
31
24
|
## Usage
|
|
32
25
|
|
|
26
|
+
### Scroll state
|
|
27
|
+
|
|
28
|
+
```typescript
|
|
29
|
+
import { useScroll } from 'use-scroller'
|
|
30
|
+
|
|
31
|
+
export default function ScrollStateExample() {
|
|
32
|
+
const { ref, state } = useScroll<HTMLDivElement>()
|
|
33
|
+
|
|
34
|
+
return (
|
|
35
|
+
<>
|
|
36
|
+
<p>Scroll State:</p>
|
|
37
|
+
<pre>{JSON.stringify(state, null, 2)}</pre>
|
|
38
|
+
<div ref={ref} style={{ height: '200px', overflowY: 'scroll' }}>
|
|
39
|
+
{/* Your content */}
|
|
40
|
+
</div>
|
|
41
|
+
</>
|
|
42
|
+
)
|
|
43
|
+
}
|
|
44
|
+
```
|
|
45
|
+
|
|
33
46
|
### Carousel
|
|
34
47
|
|
|
35
|
-
```
|
|
48
|
+
```typescript
|
|
36
49
|
import { useScroll } from 'use-scroller'
|
|
37
50
|
|
|
38
|
-
export default function
|
|
51
|
+
export default function CarouselExample() {
|
|
39
52
|
const { ref, scrollLeft, scrollRight } = useScroll<HTMLDivElement>()
|
|
53
|
+
|
|
40
54
|
return (
|
|
41
55
|
<>
|
|
42
|
-
<button onClick={() => scrollLeft()} >
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
<
|
|
46
|
-
|
|
47
|
-
</
|
|
48
|
-
|
|
49
|
-
<Box ref={ref} />
|
|
56
|
+
<button onClick={() => scrollLeft()}>Scroll Left</button>
|
|
57
|
+
<button onClick={() => scrollRight()}>Scroll Right</button>
|
|
58
|
+
|
|
59
|
+
<div ref={ref} style={{ width: '400px', overflowX: 'scroll' }}>
|
|
60
|
+
{/* Your carousel content */}
|
|
61
|
+
</div>
|
|
50
62
|
</>
|
|
51
63
|
)
|
|
52
64
|
}
|
|
@@ -54,30 +66,56 @@ export default function Carousel() {
|
|
|
54
66
|
|
|
55
67
|
### Box
|
|
56
68
|
|
|
57
|
-
```
|
|
69
|
+
```typescript
|
|
58
70
|
import { useScroll } from 'use-scroller'
|
|
59
71
|
|
|
60
|
-
export default function
|
|
61
|
-
const { ref, scrollLeft, scrollRight, scrollTop,
|
|
72
|
+
export default function BoxExample() {
|
|
73
|
+
const { ref, scrollLeft, scrollRight, scrollTop, scrollBottom, scrollToCenter } =
|
|
74
|
+
useScroll<HTMLDivElement>()
|
|
75
|
+
|
|
62
76
|
return (
|
|
63
77
|
<>
|
|
64
|
-
<button onClick={() =>
|
|
65
|
-
|
|
66
|
-
</button>
|
|
67
|
-
<button onClick={() =>
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
78
|
+
<button onClick={() => scrollToCenter()}>Scroll to Center</button>
|
|
79
|
+
<button onClick={() => scrollLeft()}>Scroll Left</button>
|
|
80
|
+
<button onClick={() => scrollRight()}>Scroll Right</button>
|
|
81
|
+
<button onClick={() => scrollTop()}>Scroll to Top</button>
|
|
82
|
+
<button onClick={() => scrollBottom()}>Scroll to Bottom</button>
|
|
83
|
+
<div ref={ref} style={{ width: '300px', height: '300px', overflow: 'scroll' }}>
|
|
84
|
+
{/* Your content */}
|
|
85
|
+
</div>
|
|
86
|
+
</>
|
|
87
|
+
)
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
### Scroll to target
|
|
92
|
+
|
|
93
|
+
```typescript
|
|
94
|
+
import { useWindowScroll } from 'use-scroller'
|
|
95
|
+
|
|
96
|
+
export default function ScrollToTargetExample() {
|
|
97
|
+
const { scrollToTarget } = useWindowScroll()
|
|
98
|
+
const ref1 = useRef(null)
|
|
99
|
+
const ref2 = useRef(null)
|
|
100
|
+
const ref3 = useRef(null)
|
|
101
|
+
|
|
102
|
+
return (
|
|
103
|
+
<>
|
|
104
|
+
<button onClick={() => scrollToTarget(ref1)}>Scroll to Target 1</button>
|
|
105
|
+
<button onClick={() => scrollToTarget(ref2)}>Scroll to Target 2</button>
|
|
106
|
+
<button onClick={() => scrollToTarget(ref3)}>Scroll to Target 3</button>
|
|
107
|
+
|
|
108
|
+
<div>
|
|
109
|
+
<div ref={ref1} style={{ height: '400px', backgroundColor: 'lightcoral' }}>
|
|
110
|
+
Target 1
|
|
111
|
+
</div>
|
|
112
|
+
<div ref={ref2} style={{ height: '400px', backgroundColor: 'lightseagreen' }}>
|
|
113
|
+
Target 2
|
|
114
|
+
</div>
|
|
115
|
+
<div ref={ref3} style={{ height: '400px', backgroundColor: 'lightsalmon' }}>
|
|
116
|
+
Target 3
|
|
117
|
+
</div>
|
|
118
|
+
</div>
|
|
81
119
|
</>
|
|
82
120
|
)
|
|
83
121
|
}
|
|
@@ -85,24 +123,28 @@ export default function ScrollBox() {
|
|
|
85
123
|
|
|
86
124
|
## API Documentation
|
|
87
125
|
|
|
88
|
-
|
|
126
|
+
### Available Hooks
|
|
127
|
+
|
|
128
|
+
#### `useScroll`
|
|
129
|
+
|
|
130
|
+
This hook is designed to handle element scroll events, enabling smooth scrolling for specified HTML elements.
|
|
131
|
+
|
|
132
|
+
##### Options
|
|
133
|
+
|
|
134
|
+
- `direction` (Type: `horizontal` or `vertical`, Default: `vertical`): Specifies the desired scroll direction. You can set it to `horizontal` or `vertical` based on your needs.
|
|
135
|
+
|
|
136
|
+
- `duration` (Type: `number`, Default: `300`): Sets the animation duration for scrolling. Adjust this value to control the speed of the scroll animation.
|
|
137
|
+
|
|
138
|
+
- `easingOption` (Type: `EasingOptions`, Default: `ease-in-out`): Determines the type of animation to use for scrolling. You can choose from various easing options such as `ease-in`, `ease-out`, `ease-in-out`, etc., to customize the scroll animation's behavior.
|
|
139
|
+
|
|
140
|
+
#### `useWindowScroll`
|
|
89
141
|
|
|
90
|
-
|
|
91
|
-
| ----------------- | ----------------------------- |
|
|
92
|
-
| `useScroll` | Handles element scroll events |
|
|
93
|
-
| `useWindowScroll` | Handles window scroll events |
|
|
142
|
+
This hook is tailored to handle window scroll events, making it easy to manage scrolling operations within the entire window.
|
|
94
143
|
|
|
95
|
-
|
|
144
|
+
##### Options
|
|
96
145
|
|
|
97
|
-
|
|
98
|
-
| -------------- | ------------------------ | ------------------------------------ |
|
|
99
|
-
| `direction` | `horizontal or vertical` | Set the desired scroll direction |
|
|
100
|
-
| `duration` | `number` | Set the animation duration to scroll |
|
|
101
|
-
| `easingOption` | `EasingOptions` | Set the type of animation to scroll |
|
|
146
|
+
- `duration` (Type: `number`, Default: `300`): Specifies the animation duration for scrolling operations. Adjust this value to control the speed of the scroll animation.
|
|
102
147
|
|
|
103
|
-
|
|
148
|
+
- `easingOption` (Type: `EasingOptions`, Default: `ease-in-out`): Defines the type of animation to use for scrolling within the window. You can choose from various easing options to customize the scroll animation's behavior.
|
|
104
149
|
|
|
105
|
-
|
|
106
|
-
| -------------- | --------------- | ------------------------------------ |
|
|
107
|
-
| `duration` | `number` | Set the animation duration to scroll |
|
|
108
|
-
| `easingOption` | `EasingOptions` | Set the type of animation to scroll |
|
|
150
|
+
Feel free to update and expand this documentation further based on your library's features and usage patterns.
|
|
@@ -10,11 +10,15 @@ export declare function useScroll<T extends HTMLElement>(props?: Partial<ScrollO
|
|
|
10
10
|
isScrolledRight: boolean;
|
|
11
11
|
isScrolledTop: boolean;
|
|
12
12
|
isScrolledBottom: boolean;
|
|
13
|
+
maxScrollLeft: number;
|
|
14
|
+
maxScrollTop: number;
|
|
15
|
+
scrollPercentageX: number;
|
|
16
|
+
scrollPercentageY: number;
|
|
13
17
|
};
|
|
14
|
-
scrollLeft: (offset?: number) => void;
|
|
15
|
-
scrollRight: (offset?: number) => void;
|
|
16
|
-
scrollBottom: (offset?: number) => void;
|
|
17
|
-
scrollTop: (offset?: number) => void;
|
|
18
|
-
scrollCenter: () => void;
|
|
19
|
-
|
|
18
|
+
scrollLeft: ((offset?: number | undefined) => void) | undefined;
|
|
19
|
+
scrollRight: ((offset?: number | undefined) => void) | undefined;
|
|
20
|
+
scrollBottom: ((offset?: number | undefined) => void) | undefined;
|
|
21
|
+
scrollTop: ((offset?: number | undefined) => void) | undefined;
|
|
22
|
+
scrollCenter: (() => void) | undefined;
|
|
23
|
+
scrollTo: ((to: number) => void) | undefined;
|
|
20
24
|
};
|
|
@@ -16,75 +16,65 @@ var react_1 = require("react");
|
|
|
16
16
|
var scroller_1 = require("../scroller");
|
|
17
17
|
var utils_1 = require("../utils");
|
|
18
18
|
var use_iso_morphic_effect_1 = require("./use-iso-morphic-effect");
|
|
19
|
+
var initialState = {
|
|
20
|
+
left: 0,
|
|
21
|
+
top: 0,
|
|
22
|
+
isScrollable: false,
|
|
23
|
+
isScrolledLeft: true,
|
|
24
|
+
isScrolledRight: false,
|
|
25
|
+
isScrolledTop: true,
|
|
26
|
+
isScrolledBottom: false,
|
|
27
|
+
maxScrollLeft: 0,
|
|
28
|
+
maxScrollTop: 0,
|
|
29
|
+
scrollPercentageX: 0,
|
|
30
|
+
scrollPercentageY: 0, // Percentage of vertical scroll covered
|
|
31
|
+
};
|
|
19
32
|
function useScroll(props) {
|
|
33
|
+
var _a, _b, _c, _d, _e, _f;
|
|
20
34
|
var ref = (0, react_1.useRef)(null);
|
|
21
|
-
var _a = (0, react_1.useState)(function () { return ({
|
|
22
|
-
left: 0,
|
|
23
|
-
top: 0,
|
|
24
|
-
isScrollable: false,
|
|
25
|
-
isScrolledLeft: false,
|
|
26
|
-
isScrolledRight: false,
|
|
27
|
-
isScrolledTop: false,
|
|
28
|
-
isScrolledBottom: false,
|
|
29
|
-
}); }), state = _a[0], setState = _a[1];
|
|
30
35
|
var scrollOpt = __assign(__assign({}, utils_1.defaultScrollOptions), props);
|
|
31
|
-
var
|
|
32
|
-
|
|
33
|
-
var scrollContainer = (0, scroller_1.scroller)({ container: container, options: scrollOpt });
|
|
34
|
-
scrollContainer.scrollTo(from, to);
|
|
35
|
-
}, []);
|
|
36
|
-
var scrollCenter = (0, react_1.useCallback)(function () {
|
|
37
|
-
var container = (0, utils_1.getElement)(ref);
|
|
38
|
-
var scrollContainer = (0, scroller_1.scroller)({ container: container, options: scrollOpt });
|
|
39
|
-
scrollContainer.scrollToCenter();
|
|
40
|
-
}, []);
|
|
41
|
-
var scrollTop = (0, react_1.useCallback)(function (offset) {
|
|
42
|
-
var container = (0, utils_1.getElement)(ref);
|
|
43
|
-
var scrollContainer = (0, scroller_1.scroller)({ container: container, options: scrollOpt });
|
|
44
|
-
scrollContainer.scrollToTop(offset);
|
|
45
|
-
}, []);
|
|
46
|
-
var scrollBottom = (0, react_1.useCallback)(function (offset) {
|
|
47
|
-
var container = (0, utils_1.getElement)(ref);
|
|
48
|
-
var scrollContainer = (0, scroller_1.scroller)({ container: container, options: scrollOpt });
|
|
49
|
-
scrollContainer.scrollToBottom(offset);
|
|
50
|
-
}, []);
|
|
51
|
-
var scrollRight = (0, react_1.useCallback)(function (offset) {
|
|
52
|
-
var container = (0, utils_1.getElement)(ref);
|
|
53
|
-
var scrollContainer = (0, scroller_1.scroller)({ container: container, options: scrollOpt });
|
|
54
|
-
scrollContainer.scrollToRight(offset);
|
|
55
|
-
}, []);
|
|
56
|
-
var scrollLeft = (0, react_1.useCallback)(function (offset) {
|
|
57
|
-
var container = (0, utils_1.getElement)(ref);
|
|
58
|
-
var scrollContainer = (0, scroller_1.scroller)({ container: container, options: scrollOpt });
|
|
59
|
-
scrollContainer.scrollToLeft(offset);
|
|
60
|
-
}, []);
|
|
36
|
+
var scrollerRef = (0, react_1.useRef)(null);
|
|
37
|
+
var _g = (0, react_1.useState)(function () { return initialState; }), state = _g[0], setState = _g[1];
|
|
61
38
|
(0, use_iso_morphic_effect_1.useIsoMorphicEffect)(function () {
|
|
62
39
|
var scrollContainer = ref.current;
|
|
63
40
|
if (!scrollContainer)
|
|
64
41
|
return;
|
|
42
|
+
// Create the scroller instance only once inside the effect
|
|
43
|
+
if (!scrollerRef.current) {
|
|
44
|
+
var container = (0, utils_1.getElement)(ref);
|
|
45
|
+
scrollerRef.current = (0, scroller_1.createScroller)(container, scrollOpt);
|
|
46
|
+
}
|
|
65
47
|
var scrollWidth = scrollContainer.scrollWidth, clientWidth = scrollContainer.clientWidth, clientHeight = scrollContainer.clientHeight, scrollHeight = scrollContainer.scrollHeight;
|
|
66
48
|
var isScrollable = clientWidth !== scrollWidth || clientHeight !== scrollHeight;
|
|
67
49
|
setState(function (prev) { return (__assign(__assign({}, prev), { isScrollable: isScrollable })); });
|
|
68
50
|
var handleScroll = function () {
|
|
69
51
|
if (scrollContainer) {
|
|
70
|
-
var
|
|
71
|
-
var
|
|
52
|
+
var scrollLeft = scrollContainer.scrollLeft, scrollTop = scrollContainer.scrollTop;
|
|
53
|
+
var isAtLeftBoundary = scrollLeft === 0;
|
|
54
|
+
var isAtRightBoundary = scrollLeft >= scrollWidth - clientWidth;
|
|
55
|
+
var isAtTopBoundary = scrollTop === 0;
|
|
56
|
+
var isAtBottomBoundary = scrollTop >= scrollHeight - clientHeight;
|
|
57
|
+
var scrollState = __assign(__assign({}, state), { isScrolledLeft: isAtLeftBoundary, isScrolledRight: isAtRightBoundary, isScrolledTop: isAtTopBoundary, isScrolledBottom: isAtBottomBoundary, left: scrollLeft, top: scrollTop, maxScrollLeft: scrollWidth - clientWidth, maxScrollTop: scrollHeight - clientHeight, scrollPercentageX: isAtLeftBoundary
|
|
58
|
+
? 0
|
|
59
|
+
: (scrollLeft / (scrollWidth - clientWidth)) * 100, scrollPercentageY: isAtTopBoundary
|
|
60
|
+
? 0
|
|
61
|
+
: (scrollTop / (scrollHeight - clientHeight)) * 100 });
|
|
72
62
|
setState(scrollState);
|
|
73
63
|
}
|
|
74
64
|
};
|
|
75
65
|
handleScroll();
|
|
76
66
|
scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.addEventListener('scroll', handleScroll);
|
|
77
67
|
return function () { return scrollContainer === null || scrollContainer === void 0 ? void 0 : scrollContainer.removeEventListener('scroll', handleScroll); };
|
|
78
|
-
}, []);
|
|
68
|
+
}, [state]);
|
|
79
69
|
return {
|
|
80
70
|
ref: ref,
|
|
81
71
|
state: state,
|
|
82
|
-
scrollLeft:
|
|
83
|
-
scrollRight:
|
|
84
|
-
scrollBottom:
|
|
85
|
-
scrollTop:
|
|
86
|
-
scrollCenter:
|
|
87
|
-
|
|
72
|
+
scrollLeft: (_a = scrollerRef.current) === null || _a === void 0 ? void 0 : _a.scrollToLeft,
|
|
73
|
+
scrollRight: (_b = scrollerRef.current) === null || _b === void 0 ? void 0 : _b.scrollToRight,
|
|
74
|
+
scrollBottom: (_c = scrollerRef.current) === null || _c === void 0 ? void 0 : _c.scrollToBottom,
|
|
75
|
+
scrollTop: (_d = scrollerRef.current) === null || _d === void 0 ? void 0 : _d.scrollToTop,
|
|
76
|
+
scrollCenter: (_e = scrollerRef.current) === null || _e === void 0 ? void 0 : _e.scrollToCenter,
|
|
77
|
+
scrollTo: (_f = scrollerRef.current) === null || _f === void 0 ? void 0 : _f.scrollTo,
|
|
88
78
|
};
|
|
89
79
|
}
|
|
90
80
|
exports.useScroll = useScroll;
|
|
@@ -9,5 +9,5 @@ export declare function useWindowScroll(props?: Partial<Omit<ScrollOptions, 'dir
|
|
|
9
9
|
scrollTop: (offset?: number | undefined) => void;
|
|
10
10
|
scrollBottom: (offset?: number | undefined) => void;
|
|
11
11
|
scrollToTarget: (currentTarget: HTMLElement) => void;
|
|
12
|
-
|
|
12
|
+
scrollTo: (position: number) => void;
|
|
13
13
|
};
|
|
@@ -23,38 +23,40 @@ function useWindowScroll(props) {
|
|
|
23
23
|
isScrolledTop: false,
|
|
24
24
|
isScrolledBottom: false,
|
|
25
25
|
}); }), state = _a[0], setState = _a[1];
|
|
26
|
-
var
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
var
|
|
32
|
-
|
|
33
|
-
|
|
26
|
+
var container = window;
|
|
27
|
+
var scrollOptions = __assign(__assign({}, utils_1.defaultScrollOptions), props);
|
|
28
|
+
var scrollContainer = (0, scroller_1.createScroller)(container, scrollOptions);
|
|
29
|
+
var handleScroll = (0, react_1.useCallback)(function () {
|
|
30
|
+
var _a = (0, utils_1.resolveScrollValues)(container), scrollLeft = _a.scrollLeft, scrollTop = _a.scrollTop, clientHeight = _a.clientHeight, scrollHeight = _a.scrollHeight;
|
|
31
|
+
var isAtTopBoundary = scrollTop === 0;
|
|
32
|
+
var isAtBottomBoundary = scrollTop >= scrollHeight - clientHeight;
|
|
33
|
+
var scrollState = {
|
|
34
|
+
left: scrollLeft,
|
|
35
|
+
top: scrollTop,
|
|
36
|
+
isScrolledTop: isAtTopBoundary,
|
|
37
|
+
isScrolledBottom: isAtBottomBoundary,
|
|
38
|
+
};
|
|
39
|
+
setState(scrollState);
|
|
40
|
+
}, [container]);
|
|
41
|
+
(0, use_iso_morphic_effect_1.useIsoMorphicEffect)(function () {
|
|
42
|
+
handleScroll();
|
|
43
|
+
container.addEventListener('scroll', handleScroll);
|
|
44
|
+
return function () {
|
|
45
|
+
container.removeEventListener('scroll', handleScroll);
|
|
46
|
+
};
|
|
47
|
+
}, [handleScroll]);
|
|
48
|
+
var scrollTo = (0, react_1.useCallback)(function (position) {
|
|
49
|
+
scrollContainer.scrollTo(position);
|
|
50
|
+
}, [scrollContainer]);
|
|
34
51
|
var scrollToTarget = (0, react_1.useCallback)(function (currentTarget) {
|
|
35
|
-
var scrollContainer = (0, scroller_1.scroller)(scrollArgs);
|
|
36
52
|
scrollContainer.scrollToTarget(currentTarget);
|
|
37
|
-
}, []);
|
|
53
|
+
}, [scrollContainer]);
|
|
38
54
|
var scrollTop = (0, react_1.useCallback)(function (offset) {
|
|
39
|
-
var scrollContainer = (0, scroller_1.scroller)(scrollArgs);
|
|
40
55
|
scrollContainer.scrollToTop(offset);
|
|
41
|
-
}, []);
|
|
56
|
+
}, [scrollContainer]);
|
|
42
57
|
var scrollBottom = (0, react_1.useCallback)(function (offset) {
|
|
43
|
-
var scrollContainer = (0, scroller_1.scroller)(scrollArgs);
|
|
44
58
|
scrollContainer.scrollToBottom(offset);
|
|
45
|
-
}, []);
|
|
46
|
-
|
|
47
|
-
var handleScroll = function () {
|
|
48
|
-
if (window) {
|
|
49
|
-
var _a = (0, utils_1.resolveScrollValues)(window), scrollLeft = _a.scrollLeft, scrollTop_1 = _a.scrollTop, scrollHeight = _a.scrollHeight, clientHeight = _a.clientHeight;
|
|
50
|
-
var scrollState = __assign(__assign({}, state), { isScrolledTop: scrollTop_1 === 0, isScrolledBottom: scrollTop_1 >= scrollHeight - clientHeight, left: scrollLeft, top: scrollTop_1 });
|
|
51
|
-
setState(scrollState);
|
|
52
|
-
}
|
|
53
|
-
};
|
|
54
|
-
handleScroll();
|
|
55
|
-
window === null || window === void 0 ? void 0 : window.addEventListener('scroll', handleScroll);
|
|
56
|
-
return function () { return window === null || window === void 0 ? void 0 : window.removeEventListener('scroll', handleScroll); };
|
|
57
|
-
}, []);
|
|
58
|
-
return { state: state, scrollTop: scrollTop, scrollBottom: scrollBottom, scrollToTarget: scrollToTarget, scroll: scroll };
|
|
59
|
+
}, [scrollContainer]);
|
|
60
|
+
return { state: state, scrollTop: scrollTop, scrollBottom: scrollBottom, scrollToTarget: scrollToTarget, scrollTo: scrollTo };
|
|
59
61
|
}
|
|
60
62
|
exports.useWindowScroll = useWindowScroll;
|
package/dist/cjs/scroller.d.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import {
|
|
2
|
-
export declare function
|
|
1
|
+
import { ScrollOptions } from './types';
|
|
2
|
+
export declare function createScroller(container: HTMLElement | Window, options?: ScrollOptions): {
|
|
3
|
+
scrollTo: (to: number) => void;
|
|
4
|
+
scrollToCenter: () => void;
|
|
5
|
+
scrollToTarget: (target: HTMLElement, offset?: number) => void;
|
|
3
6
|
scrollToLeft: (offset?: number) => void;
|
|
4
7
|
scrollToRight: (offset?: number) => void;
|
|
5
8
|
scrollToTop: (offset?: number) => void;
|
|
6
9
|
scrollToBottom: (offset?: number) => void;
|
|
7
|
-
scrollToTarget: (target: HTMLElement) => void;
|
|
8
|
-
scrollToCenter: () => void;
|
|
9
|
-
scrollTo: (from: number, to: number, layout?: 'horizontal' | 'vertical') => void;
|
|
10
10
|
};
|
package/dist/cjs/scroller.js
CHANGED
|
@@ -1,42 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.
|
|
3
|
+
exports.createScroller = void 0;
|
|
4
4
|
var utils_1 = require("./utils");
|
|
5
|
-
function
|
|
6
|
-
|
|
5
|
+
function createScroller(container, options) {
|
|
6
|
+
if (options === void 0) { options = utils_1.defaultScrollOptions; }
|
|
7
7
|
(0, utils_1.validateElement)(container);
|
|
8
8
|
var duration = options.duration, easingOption = options.easingOption, direction = options.direction;
|
|
9
|
-
var
|
|
10
|
-
|
|
11
|
-
* Scroll the Element or Window to the given
|
|
12
|
-
* position.
|
|
13
|
-
*
|
|
14
|
-
* @param {number} from the current scroll position.
|
|
15
|
-
* @param {number} to the new position to scroll.
|
|
16
|
-
* @param {string} layout the scroll direction.
|
|
17
|
-
*/
|
|
18
|
-
function scrollTo(from, to, layout) {
|
|
9
|
+
var _a = (0, utils_1.resolveScrollValues)(container), scrollLeft = _a.scrollLeft, scrollTop = _a.scrollTop, clientWidth = _a.clientWidth, clientHeight = _a.clientHeight, scrollWidth = _a.scrollWidth, scrollHeight = _a.scrollHeight;
|
|
10
|
+
function scroll(from, to, layout) {
|
|
19
11
|
if (layout === void 0) { layout = direction; }
|
|
20
12
|
var startTime = null;
|
|
21
13
|
var requestId = 0;
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
startTime = currentTime;
|
|
25
|
-
var time = Math.min((currentTime - startTime) / duration, 1);
|
|
14
|
+
var distance = Math.abs(to - from);
|
|
15
|
+
function calculateCurrentPosition(timeFraction) {
|
|
26
16
|
var easingFunc = (0, utils_1.getEasing)(easingOption);
|
|
27
|
-
|
|
17
|
+
return easingFunc(timeFraction) * distance + from;
|
|
18
|
+
}
|
|
19
|
+
function updateScrollPosition(currentPosition) {
|
|
28
20
|
container.scrollTo({
|
|
29
|
-
left: layout === 'horizontal' ?
|
|
30
|
-
top: layout === 'vertical' ?
|
|
21
|
+
left: layout === 'horizontal' ? currentPosition : undefined,
|
|
22
|
+
top: layout === 'vertical' ? currentPosition : undefined,
|
|
31
23
|
});
|
|
32
|
-
|
|
33
|
-
|
|
24
|
+
}
|
|
25
|
+
function animateScroll(currentTime) {
|
|
26
|
+
if (!startTime)
|
|
27
|
+
startTime = currentTime;
|
|
28
|
+
var elapsedTime = currentTime - startTime;
|
|
29
|
+
var timeFraction = elapsedTime / duration;
|
|
30
|
+
var currentPosition = calculateCurrentPosition(timeFraction);
|
|
31
|
+
updateScrollPosition(currentPosition);
|
|
32
|
+
if (timeFraction < 1) {
|
|
33
|
+
requestId = requestAnimationFrame(animateScroll);
|
|
34
34
|
}
|
|
35
35
|
else {
|
|
36
36
|
cancelAnimationFrame(requestId);
|
|
37
37
|
}
|
|
38
38
|
}
|
|
39
|
-
requestId = requestAnimationFrame(
|
|
39
|
+
requestId = requestAnimationFrame(animateScroll);
|
|
40
|
+
}
|
|
41
|
+
function scrollTo(to) {
|
|
42
|
+
var from = direction === 'vertical' ? scrollTop : scrollLeft;
|
|
43
|
+
scroll(from, to);
|
|
40
44
|
}
|
|
41
45
|
function scrollToCenter() {
|
|
42
46
|
var from = 0;
|
|
@@ -51,47 +55,40 @@ function scroller(_a) {
|
|
|
51
55
|
from = scrollLeft;
|
|
52
56
|
to = scrollXCenterPosition;
|
|
53
57
|
}
|
|
54
|
-
|
|
58
|
+
scroll(from, to, direction);
|
|
55
59
|
}
|
|
56
|
-
function scrollToTarget(target) {
|
|
60
|
+
function scrollToTarget(target, offset) {
|
|
61
|
+
if (offset === void 0) { offset = 0; }
|
|
57
62
|
(0, utils_1.validateElement)(target);
|
|
58
63
|
var offsetTop = target.offsetTop, offsetLeft = target.offsetLeft;
|
|
59
64
|
var from = 0;
|
|
60
65
|
var to = 0;
|
|
61
66
|
if (direction === 'vertical') {
|
|
62
67
|
from = scrollTop;
|
|
63
|
-
to = offsetTop;
|
|
68
|
+
to = offsetTop - offset;
|
|
64
69
|
}
|
|
65
70
|
if (direction === 'horizontal') {
|
|
66
71
|
from = scrollLeft;
|
|
67
|
-
to = offsetLeft;
|
|
72
|
+
to = offsetLeft - offset;
|
|
68
73
|
}
|
|
69
|
-
|
|
74
|
+
scroll(from, to, direction);
|
|
70
75
|
}
|
|
71
|
-
var scrollToLeft = function (offset) {
|
|
72
|
-
var scrollPosition = offset || scrollLeft - clientWidth;
|
|
73
|
-
scrollTo(scrollLeft, scrollPosition, 'horizontal');
|
|
74
|
-
};
|
|
75
|
-
var scrollToRight = function (offset) {
|
|
76
|
-
var scrollPosition = offset || scrollLeft + clientWidth;
|
|
77
|
-
scrollTo(scrollLeft, scrollPosition, 'horizontal');
|
|
78
|
-
};
|
|
79
|
-
var scrollToTop = function (offset) {
|
|
80
|
-
var scrollPosition = offset || scrollTop - clientHeight;
|
|
81
|
-
scrollTo(scrollTop, scrollPosition, 'vertical');
|
|
82
|
-
};
|
|
83
|
-
var scrollToBottom = function (offset) {
|
|
84
|
-
var scrollPosition = offset || scrollTop + clientHeight;
|
|
85
|
-
scrollTo(scrollTop, scrollPosition, 'vertical');
|
|
86
|
-
};
|
|
87
76
|
return {
|
|
88
|
-
scrollToLeft: scrollToLeft,
|
|
89
|
-
scrollToRight: scrollToRight,
|
|
90
|
-
scrollToTop: scrollToTop,
|
|
91
|
-
scrollToBottom: scrollToBottom,
|
|
92
|
-
scrollToTarget: scrollToTarget,
|
|
93
|
-
scrollToCenter: scrollToCenter,
|
|
94
77
|
scrollTo: scrollTo,
|
|
78
|
+
scrollToCenter: scrollToCenter,
|
|
79
|
+
scrollToTarget: scrollToTarget,
|
|
80
|
+
scrollToLeft: function (offset) {
|
|
81
|
+
scroll(scrollLeft, offset || scrollLeft - clientWidth, 'horizontal');
|
|
82
|
+
},
|
|
83
|
+
scrollToRight: function (offset) {
|
|
84
|
+
scroll(scrollLeft, offset || scrollLeft + clientWidth, 'horizontal');
|
|
85
|
+
},
|
|
86
|
+
scrollToTop: function (offset) {
|
|
87
|
+
scroll(scrollTop, offset || scrollTop - clientHeight, 'vertical');
|
|
88
|
+
},
|
|
89
|
+
scrollToBottom: function (offset) {
|
|
90
|
+
scroll(scrollTop, offset || scrollTop + clientHeight, 'vertical');
|
|
91
|
+
},
|
|
95
92
|
};
|
|
96
93
|
}
|
|
97
|
-
exports.
|
|
94
|
+
exports.createScroller = createScroller;
|
package/dist/cjs/utils.d.ts
CHANGED
|
@@ -3,8 +3,9 @@ import { EasingFunction, EasingFunctions, EasingOptions, ScrollOptions } from '.
|
|
|
3
3
|
export declare const isServer: boolean;
|
|
4
4
|
export declare const defaultScrollOptions: ScrollOptions;
|
|
5
5
|
/**
|
|
6
|
-
* Resolves scroll values based on the type of
|
|
7
|
-
* @param {HTMLElement | Window} element
|
|
6
|
+
* Resolves scroll values based on the type of element.
|
|
7
|
+
* @param {HTMLElement | Window} element - The element to retrieve scroll values from.
|
|
8
|
+
* @returns {object} - An object containing scroll-related properties.
|
|
8
9
|
*/
|
|
9
10
|
export declare const resolveScrollValues: (element: HTMLElement | Window) => {
|
|
10
11
|
scrollLeft: number;
|
|
@@ -13,12 +14,24 @@ export declare const resolveScrollValues: (element: HTMLElement | Window) => {
|
|
|
13
14
|
clientWidth: number;
|
|
14
15
|
clientHeight: number;
|
|
15
16
|
scrollHeight: number;
|
|
17
|
+
scrollLeftMax: number;
|
|
18
|
+
scrollTopMax: number;
|
|
16
19
|
};
|
|
17
20
|
/**
|
|
18
|
-
* Validate if element passed to the function is valid.
|
|
19
|
-
* @param {HTMLElement | Window} element
|
|
21
|
+
* Validate if the element passed to the function is valid.
|
|
22
|
+
* @param {HTMLElement | Window} element - The element to validate.
|
|
20
23
|
*/
|
|
21
24
|
export declare function validateElement(element?: HTMLElement | Window): void;
|
|
25
|
+
/**
|
|
26
|
+
* Get the DOM element from a React ref object.
|
|
27
|
+
* @param {RefObject<HTMLElement>} ref - The React ref object.
|
|
28
|
+
* @returns {HTMLElement} - The DOM element.
|
|
29
|
+
*/
|
|
22
30
|
export declare const getElement: (ref: RefObject<HTMLElement>) => HTMLElement;
|
|
23
31
|
export declare const easingMap: EasingFunctions;
|
|
32
|
+
/**
|
|
33
|
+
* Get an easing function based on the provided easing option or the default option.
|
|
34
|
+
* @param {EasingOptions} easing - The easing option.
|
|
35
|
+
* @returns {EasingFunction} - The easing function.
|
|
36
|
+
*/
|
|
24
37
|
export declare const getEasing: (easing?: EasingOptions) => EasingFunction;
|