Skip to content

Commit 7661c84

Browse files
committed
#8 - Create property reverse scroll
1 parent b6db773 commit 7661c84

File tree

3 files changed

+34
-15
lines changed

3 files changed

+34
-15
lines changed

README.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ An example of how to use the library
6262
### Another Examples
6363

6464
- Infinite scroll with requests | [Link](https://svelte.dev/repl/4863a658f3584b81bbe3d9f54eb67899) | [Author](https://github.com/kilianso)
65-
- Infinite scroll reverse | [Link](https://svelte.dev/repl/4863a658f3584b81bbe3d9f54eb67899) | [Author](https://github.com/andrelmlins)
65+
- Infinite scroll reverse | [Link](https://svelte.dev/repl/36d00aa55c7c4ff68914ce314f4e1ca4) | [Author](https://github.com/andrelmlins)
6666

6767
## Properties
6868

@@ -75,6 +75,7 @@ Component props:
7575
| hasMore | bool | true | Tells you if there are more items to load |
7676
| loadMore | func | -- | Call with offset |
7777
| horizontal | bool | false | Changing orientation |
78+
| reverse | bool | false | Reveser scroll direction |
7879

7980
## NPM Statistics
8081

src/dev/main.js

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,7 @@
11
import App from "./App.svelte";
22

33
const app = new App({
4-
target: document.body,
5-
props: {
6-
name: "world"
7-
}
4+
target: document.body
85
});
96

107
export default app;

src/lib/InfiniteScroll.svelte

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,33 +3,54 @@
33
44
export let threshold = 0;
55
export let horizontal = false;
6-
export let elementScroll;
6+
export let elementScroll = null;
77
export let hasMore = true;
8+
export let reverse = false;
89
910
const dispatch = createEventDispatcher();
1011
let isLoadMore = false;
1112
let component;
13+
let beforeScrollHeight;
14+
let beforeScrollTop;
1215
13-
$: {
14-
if (component || elementScroll) {
15-
const element = elementScroll ? elementScroll : component.parentNode;
16+
$: if (component || elementScroll) {
17+
const element = elementScroll ? elementScroll : component.parentNode;
1618
17-
element.addEventListener("scroll", onScroll);
18-
element.addEventListener("resize", onScroll);
19+
if (reverse) {
20+
element.scrollTop = element.scrollHeight;
1921
}
22+
23+
element.addEventListener("scroll", onScroll);
24+
element.addEventListener("resize", onScroll);
25+
}
26+
27+
$: if (isLoadMore && reverse) {
28+
const element = elementScroll ? elementScroll : component.parentNode;
29+
30+
element.scrollTop =
31+
element.scrollHeight - beforeScrollHeight + beforeScrollTop;
2032
}
2133
2234
const onScroll = e => {
23-
const element = e.target;
35+
if (!hasMore) return;
2436
25-
const offset = horizontal
26-
? e.target.scrollWidth - e.target.clientWidth - e.target.scrollLeft
27-
: e.target.scrollHeight - e.target.clientHeight - e.target.scrollTop;
37+
let offset = 0;
38+
39+
if (reverse) {
40+
offset = horizontal ? e.target.scrollLeft : e.target.scrollTop;
41+
} else {
42+
offset = horizontal
43+
? e.target.scrollWidth - e.target.clientWidth - e.target.scrollLeft
44+
: e.target.scrollHeight - e.target.clientHeight - e.target.scrollTop;
45+
}
2846
2947
if (offset <= threshold) {
3048
if (!isLoadMore && hasMore) {
3149
dispatch("loadMore");
50+
beforeScrollHeight = e.target.scrollHeight;
51+
beforeScrollTop = e.target.scrollTop;
3252
}
53+
3354
isLoadMore = true;
3455
} else {
3556
isLoadMore = false;

0 commit comments

Comments
 (0)