console
let list = [];
for (let i = 0; i < 10000; i++) {
let id = Math.random();
(
function () {
list.push({ id })
}
)(id)
}
const containerDom = document.querySelector("#container")
const scrollDom = document.querySelector(".virtual-scroll")
const itemDom = document.querySelector("#item-container")
containerDom.style.cssText = `height: ${list.length * 30}px;`
const render = (initIndex = 0, data = []) => {
const renderData = data.slice(initIndex, initIndex + 10);
const fragment = document.createDocumentFragment();
renderData.forEach((item) => {
const div = document.createElement('div');
div.innerText = item.id
div.style.cssText = "height: 30px"
fragment.appendChild(div)
})
itemDom.replaceChildren(fragment)
}
render(0, list)
scrollDom.addEventListener('scroll', scrollTarget => {
render(Math.ceil(scrollTarget.target.scrollTop / 30), list)
})
<div class="virtual-scroll">
<div id="container">
<div id="item-container"></div>
</div>
</div>
.virtual-scroll {
width: 200px;
height: 300px;
overflow-y: auto;
}
#container {
background-color: skyblue;
}
#container>div {
position: sticky;
top: 0;
}