|
3 | 3 |
|
4 | 4 | export let threshold = 0;
|
5 | 5 | export let horizontal = false;
|
6 |
| - export let elementScroll; |
| 6 | + export let elementScroll = null; |
7 | 7 | export let hasMore = true;
|
| 8 | + export let reverse = false; |
8 | 9 |
|
9 | 10 | const dispatch = createEventDispatcher();
|
10 | 11 | let isLoadMore = false;
|
11 | 12 | let component;
|
| 13 | + let beforeScrollHeight; |
| 14 | + let beforeScrollTop; |
12 | 15 |
|
13 |
| - $: { |
14 |
| - if (component || elementScroll) { |
15 |
| - const element = elementScroll ? elementScroll : component.parentNode; |
| 16 | + $: if (component || elementScroll) { |
| 17 | + const element = elementScroll ? elementScroll : component.parentNode; |
16 | 18 |
|
17 |
| - element.addEventListener("scroll", onScroll); |
18 |
| - element.addEventListener("resize", onScroll); |
| 19 | + if (reverse) { |
| 20 | + element.scrollTop = element.scrollHeight; |
19 | 21 | }
|
| 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; |
20 | 32 | }
|
21 | 33 |
|
22 | 34 | const onScroll = e => {
|
23 |
| - const element = e.target; |
| 35 | + if (!hasMore) return; |
24 | 36 |
|
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 | + } |
28 | 46 |
|
29 | 47 | if (offset <= threshold) {
|
30 | 48 | if (!isLoadMore && hasMore) {
|
31 | 49 | dispatch("loadMore");
|
| 50 | + beforeScrollHeight = e.target.scrollHeight; |
| 51 | + beforeScrollTop = e.target.scrollTop; |
32 | 52 | }
|
| 53 | +
|
33 | 54 | isLoadMore = true;
|
34 | 55 | } else {
|
35 | 56 | isLoadMore = false;
|
|
0 commit comments