JSFiddle - React, Tailwind, and code Playground
HTML
<div id="root" class="container">
</div>
CSS
.container {
height: 300px;
width: 80%;
border: 1px solid black;
overflow-y: scroll;
}
.item {
width: 50px;
height: 50px;
background-color: #d3d3d8;
margin: 10px;
float: left;
}
JavaScript
function getContent(offset, num) {
let arr = [];
for(var i = offset; i<offset+num;i++) {
arr.push(i);
}
return new Promise((resolve) => {
setTimeout(() => {
resolve(arr);
}, Math.random() * 5000);
});
}
const chunkSize = 50;
let loadedIndex = 0;
let loading = false;
let container = document.getElementById("root");
const addElements = () => {
if (container.scrollHeight === (container.clientHeight + container.scrollTop) && !loading) {
loading = true;
getContent(loadedIndex, chunkSize).then((loaded) => {
loading = false;
const elements = loaded.map((item) => {
const element = document.createElement('div');
element.className = 'item';
element.textContent = item;
return element;
});
container.append(...elements)
loadedIndex += chunkSize;
/* loadedContent = [...loadedContent, elements] */
/* console.log(loadedContent) */
});
// console.log(loadedContent);
// loadedIndex+=1;
}
}
addElements();
container.addEventListener('scroll', () => {
addElements();
});