Open gitbreaker222 opened 4 years ago
attempting to create a "scrollTo" method, that scrolls an element by index at start
, if list borders not hit. Problems so far:
viewport.scrollTo
as of "infinite loop" detection (even if its a for loop with a limit of 99 iterations)
itemHeight
does not control the actual row style, so the height has to be manually synced by user with correct calculation of box-height / border-width / padding / margin / box-sizing => to px value
itemHeight
, instead just mind for a fixed height in CSS and let average_height
take care of getting the rows computed pixel heightrefresh
is missing a check, if new list length is shorter than current scroll start
scrollTo(list.length - 1)
handle_scroll
has this part, that should stabilize scrolling up: // prevent jumping if we scrolled up into unknown territory
but this block somehow causes the position to be 0
solved problems to this point:
tested in firefox
update: after almost giving up fixing the remaining issue (adjust scroll position when filter list) I finally solved it! The demo has been updated and next I'd like to do a PR with clean code
So @Rich-Harris maybe now is a good time to get your attention :) My proposal:
<VirtualList {items} bind:scrollToIndex}></VirtualList>
Any thoughts before I start coding?
Here is a webm of the demo :angel: https://windtanz.windcloud.de/index.php/s/d43AbLtXw9mimj9
Very nice. Thanks! Apparently your _scrollTo3
solves my problem!! 👍
https://github.com/sveltejs/svelte-virtual-list/issues/50
great work! REPL: https://svelte.dev/repl/1c36db7c1e7e4ef2bfb04874321412e5?version=3.20.1 should be merged.
I am preparing a pull request. Fork, cleanup, testing is done. One issue remains in logs:
"<VirtualList> was created with unknown prop 'scrollToIndex'"
How to properly expose a function / "method" so it can be called from outside? I played with bind: let: use:
but don't get it :/
update:
bam got it - the consumer of scrollToIndex
. Outside I've initialized a same named variable to bind to ... with a noop function
<script>
export let scrollToIndex = () => {} // this should be "undefined"
</script>
<div class="List">
<VirtualList {items}
bind:start
bind:end
bind:scrollToIndex
let:item
>
<ListItem {item}/>
</VirtualList>
</div>
initializing with explicit undefined
is correct https://stackoverflow.com/a/58574086/3313410 - thx @Rich-Harris
updating demo and opening PR shortly :eyes:
:information_source: published fork https://www.npmjs.com/package/svelte-virtual-list-ce
This is a summary of issues around similar use-cases:
15 lazy loading: [bug, resolved?] adding more items keeps scroll position and increases scroll length below
28 scroll to song: bring an item (by index) into view
30 filtering list: [bug] removing more items than current scroll position assumes causes "empty" viewport
32 messenger: autoscroll to bottom if new items loades
I hope the use-case-namings are helpful - all these issues have in common, that we expect certain behaviours from the scroll position. To prevent solving one issue while re-creating another, I suggest to work towards one PR that solves them together :bullettrain_side: :handshake:
REPL: https://svelte.dev/repl/1c36db7c1e7e4ef2bfb04874321412e5?version=3.20.1
comparable vanilla implementations: