
<!DOCTYPE html>
<html lang="zh"><head><meta charset="UTF-8" /><title>极简虚拟滚动</title><style>.container {width: 300px;height: 300px;border: 1px solid #ccc;overflow: auto;position: relative;}.placeholder {height: 50000px; }.item {position: absolute;left: 0;top: 0;width: 100%;height: 50px;line-height: 50px;text-align: center;box-sizing: border-box;will-change: transform;}.item:nth-child(odd) {background-color: #00ccff;}.item:nth-child(even) {background-color: #ffcc00;}</style></head><body><div class="container"><div class="placeholder"></div><div class="items-container"></div></div><script>const container = document.querySelector(".container");const itemsContainer = document.querySelector(".items-container");const itemHeight = 50;const visibleCount = Math.ceil(container.clientHeight / itemHeight); const buffer = 2; const totalItems = 1000; function render() {const scrollTop = container.scrollTop;const startIndex = Math.max(0,Math.floor(scrollTop / itemHeight) - buffer);const endIndex = Math.min(totalItems,startIndex + visibleCount + buffer * 2);itemsContainer.innerHTML = "";for (let i = startIndex; i < endIndex; i++) {const item = document.createElement("div");item.className = "item";item.textContent = `Item ${i}`;item.style.transform = `translateY(${i * itemHeight}px)`;itemsContainer.appendChild(item);}}render();container.addEventListener("scroll", () => {requestAnimationFrame(render);});</script></body>
</html>