71 |
72 |
73 |
74 |
79 |
--------------------------------------------------------------------------------
/src/routes/mock.js:
--------------------------------------------------------------------------------
1 | const lorem = (
2 | "Что такое Lorem Ipsum?\n" +
3 | "Lorem Ipsum - это текст-\"рыба\", часто используемый в печати и вэб-дизайне. Lorem Ipsum является стандартной \"рыбой\" для текстов на латинице с начала XVI века. В то время некий безымянный печатник создал большую коллекцию размеров и форм шрифтов, используя Lorem Ipsum для распечатки образцов. Lorem Ipsum не только успешно пережил без заметных изменений пять веков, но и перешагнул в электронный дизайн. Его популяризации в новое время послужили публикация листов Letraset с образцами Lorem Ipsum в 60-х годах и, в более недавнее время, программы электронной вёрстки типа Aldus PageMaker, в шаблонах которых используется Lorem Ipsum.\n" +
4 | "\n" +
5 | "Почему он используется?\n" +
6 | "Давно выяснено, что при оценке дизайна и композиции читаемый текст мешает сосредоточиться. Lorem Ipsum используют потому, что тот обеспечивает более или менее стандартное заполнение шаблона, а также реальное распределение букв и пробелов в абзацах, которое не получается при простой дубликации \"Здесь ваш текст.. Здесь ваш текст.. Здесь ваш текст..\" Многие программы электронной вёрстки и редакторы HTML используют Lorem Ipsum в качестве текста по умолчанию, так что поиск по ключевым словам \"lorem ipsum\" сразу показывает, как много веб-страниц всё ещё дожидаются своего настоящего рождения. За прошедшие годы текст Lorem Ipsum получил много версий. Некоторые версии появились по ошибке, некоторые - намеренно (например, юмористические варианты).\n" +
7 | "\n" +
8 | "\n" +
9 | "Откуда он появился?\n" +
10 | "Многие думают, что Lorem Ipsum - взятый с потолка псевдо-латинский набор слов, но это не совсем так. Его корни уходят в один фрагмент классической латыни 45 года н.э., то есть более двух тысячелетий назад. Ричард МакКлинток, профессор латыни из колледжа Hampden-Sydney, штат Вирджиния, взял одно из самых странных слов в Lorem Ipsum, \"consectetur\", и занялся его поисками в классической латинской литературе. В результате он нашёл неоспоримый первоисточник Lorem Ipsum в разделах 1.10.32 и 1.10.33 книги \"de Finibus Bonorum et Malorum\" (\"О пределах добра и зла\"), написанной Цицероном в 45 году н.э. Этот трактат по теории этики был очень популярен в эпоху Возрождения. Первая строка Lorem Ipsum, \"Lorem ipsum dolor sit amet..\", происходит от одной из строк в разделе 1.10.32\n" +
11 | "\n" +
12 | "Классический текст Lorem Ipsum, используемый с XVI века, приведён ниже. Также даны разделы 1.10.32 и 1.10.33 \"de Finibus Bonorum et Malorum\" Цицерона и их английский перевод, сделанный H. Rackham, 1914 год.\n" +
13 | "\n" +
14 | "Где его взять?\n" +
15 | "Есть много вариантов Lorem Ipsum, но большинство из них имеет не всегда приемлемые модификации, например, юмористические вставки или слова, которые даже отдалённо не напоминают латынь. Если вам нужен Lorem Ipsum для серьёзного проекта, вы наверняка не хотите какой-нибудь шутки, скрытой в середине абзаца. Также все другие известные генераторы Lorem Ipsum используют один и тот же текст, который они просто повторяют, пока не достигнут нужный объём. Это делает предлагаемый здесь генератор единственным настоящим Lorem Ipsum генератором. Он использует словарь из более чем 200 латинских слов, а также набор моделей предложений. В результате сгенерированный Lorem Ipsum выглядит правдоподобно, не имеет повторяющихся абзацей или \"невозможных\" слов."
16 | ).split(" ")
17 |
18 | export function randomInteger(min, max) {
19 | let rand = min + Math.random() * (max - min)
20 | return Math.floor(rand)
21 | }
22 |
23 | function* SequenceGenerator() {
24 | let i = 0
25 | while (true) {
26 | yield i++
27 | }
28 | }
29 |
30 | export function createSequenceGenerator() {
31 | const sequenceGenerator = SequenceGenerator()
32 | return () => sequenceGenerator.next().value
33 | }
34 |
35 | export function randomWord() {
36 | return lorem[randomInteger(0, lorem.length)]
37 | }
38 |
39 | export function randomString(min, max) {
40 | let s = []
41 | for (let i = 0; i < randomInteger(min, max); i++) s.push(randomWord())
42 | return s.join(" ")
43 | }
44 |
45 | export function asyncTimeout(time) {
46 | return new Promise(resolve => setTimeout(resolve, time))
47 | }
48 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # svelte-virtual-scroll-list
2 |
3 | > ⚠️ No longer maintained
4 | >
5 | > please reffer to fork https://github.com/ArcticKeaton/svelte-virtual-scroll-list
6 |
7 | [](https://npmjs.com/package/svelte-virtual-scroll-list/)
8 |
9 | Svelte implementation of vue library [vue-virtual-scroll-list](https://github.com/tangbc/vue-virtual-scroll-list)
10 |
11 | Virtualized scrolling for big lists
12 |
13 | ---
14 | **Support dynamic both-directional lists** (see example)
15 |
16 | ---
17 |
18 | Online demo: [https://v1ack.github.io/svelte-virtual-scroll-list/](https://v1ack.github.io/svelte-virtual-scroll-list/)
19 |
20 | [Simple example in Svelte REPL](https://ru.svelte.dev/repl/eae82aab17b04420885851d58de50a2e?version=3.38.2)
21 |
22 | # Getting started
23 |
24 | ## Installing from npm
25 |
26 | `npm i svelte-virtual-scroll-list -D`
27 |
28 | or
29 |
30 | `yarn add svelte-virtual-scroll-list -D`
31 |
32 | ## Using
33 |
34 | ```html
35 |
36 |
41 |
42 |
47 |
48 | This is a header set via slot
49 |
50 |
51 | {data.text}
52 |
53 |
54 | This is a footer set via slot
55 |
56 |
57 |
58 | ```
59 |
60 | More examples available in `example` folder
61 |
62 | # Comparing to other virtualizing components
63 |
64 | | | svelte-virtual-scroll-list | svelte-virtual-list | svelte-tiny-virtual-list |
65 | |---------------------------|----------------------------|---------------------|----------------------------------|
66 | | handle dynamic size data | + | + | - |
67 | | scroll methods (to index) | + | - | + |
68 | | infinity scrolling | two-directional | - | one-directional with another lib |
69 | | initial scroll position | + | - | + |
70 | | sticky items | - | - | + |
71 | | top/bottom slots | + | - | + |
72 | | reached top/bottom events | + | - | - |
73 | | document as a list | + | - | - |
74 |
75 | # API
76 |
77 | ## Props
78 |
79 | | prop | type | default | description |
80 | |-----------------|----------|----------------|--------------------------------------------------------------------|
81 | | data | object[] | `null` | Source for list |
82 | | key | string | `id` | Unique key for getting data from `data` |
83 | | keeps | number | `30` | Count of rendered items |
84 | | estimateSize | number | `estimateSize` | Estimate size of each item, needs for smooth scrollbar |
85 | | isHorizontal | boolean | `false` | Scroll direction |
86 | | pageMode | boolean | `false` | Let virtual list using global document to scroll through the list |
87 | | start | number | `0` | scroll position start index |
88 | | offset | number | `0` | scroll position offset |
89 | | topThreshold | number | `0` | The threshold to emit `top` event, attention to multiple calls. |
90 | | bottomThreshold | number | `0` | The threshold to emit `bottom` event, attention to multiple calls. |
91 |
92 | ## Methods
93 |
94 | Access to methods by component binding
95 |
96 | Binding example
97 |
98 | ```html
99 |
100 |
103 |
104 |
105 |
106 | ```
107 |
108 |
109 |
110 | | method | arguments | description |
111 | |---------------------|------------------------|-----------------------------------------------------------------------------------------------------------------------|
112 | | scrollToBottom | `none` | Scroll list to bottom |
113 | | scrollToIndex | `index: number` | Set scroll position to a designated index |
114 | | scrollToOffset | `offset: number` | Set scroll position to a designated offset |
115 | | getSize | `id: typeof props.key` | Get the designated item size |
116 | | getSizes | `none` | Get the total number of stored (rendered) items |
117 | | getOffset | `none` | Get current scroll offset |
118 | | getClientSize | `none` | Get wrapper element client viewport size (width or height) |
119 | | getScrollSize | `none` | Get all scroll size (scrollHeight or scrollWidth) |
120 | | updatePageModeFront | `none` | When using page mode and virtual list root element offsetTop or offsetLeft change, you need call this method manually |
121 |
122 | ## Events
123 |
124 | | event | description |
125 | |--------|----------------------------|
126 | | scroll | Scroll event |
127 | | top | Top of the list reached |
128 | | bottom | Bottom of the list reached |
129 |
130 | ## Additional
131 |
132 | ### Get index of current rendering items
133 |
134 | ```html
135 |
136 |
142 |