console
console.log(`虚拟列表是根据滚动容器元素可视区域大小动态渲染原始长数据的某一段数据的技术`)
window.onload = function () {
console.log(``);
let state = {
startOffset: 0,
endOffset: 0,
startIndex: 0,
endIndex: 0,
scrollTop: 0,
visibleData: []
}
let data = new Array(1000).fill(true)
data.map((item, index) => {
data[index] = index
})
var container = document.querySelector('#container')
var list = document.querySelector('#list')
let itemHeight = 80
let bufferSize = 5
let visibleCount = 0
var setPadding = function () {
container.style.paddingTop = state.scrollTop + 'px'
container.style.paddingBottom = state.endOffset + 'px'
}
var updateVisibleData = function () {
state.startIndex = Math.ceil(state.scrollTop / itemHeight)
state.startOffset = state.startIndex * itemHeight
console.log('startIndex:' + state.startIndex)
state.endIndex = state.startIndex + visibleCount
state.endOffset = itemHeight * data.length - state.scrollTop - visibleCount * itemHeight
console.log('endIndex:' + state.endIndex)
console.log(state.startOffset)
console.log(state.endOffset)
console.log('差值:' + (state.endIndex - state.startIndex));
state.visibleData = data.slice(state.startIndex, state.endIndex)
let len = state.visibleData.length
let html = ''
for (let i = 0; i < len; i++) {
html += `<div class="item">
<div>` + state.visibleData[i] + '-' + faker.lorem.words() + `</div>
<div>` + faker.lorem.sentences() + `</div>
</div>`
}
container.innerHTML = html
setTimeout(() => {
setPadding()
}, 0)
}
var initData = function () {
visibleCount = Math.ceil(list.clientHeight / itemHeight) + bufferSize
state.endIndex = state.startIndex + visibleCount
updateVisibleData()
}
initData()
function handleScroll(e) {
console.log('scroll:', e && e.target.scrollTop)
let top = e && e.target.scrollTop || 0
state.scrollTop = top
updateVisibleData()
}
handleScroll()
list.onscroll = function (e) {
handleScroll(e)
}
}
<html>
<head>
<title>虚拟列表--动态数据渲染</title>
</head>
<body>
<div>参考文章:https://github.com/dwqs/blog/issues/70</div>
<div class="list" id="list">
<div id='container' class="container" onscroll="handleScroll()">
123
</div>
</div>
</body>
</html>
html,
body {
margin: 0;
padding: 0;
}
.container {
background: chocolate;
}
.container .item {
padding: 10px;
}
.list {
height: 400px;
overflow: auto;
}