You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
140 lines
3.5 KiB
140 lines
3.5 KiB
<script setup>
|
|
import { ref, onMounted, reactive, computed, nextTick } from 'vue'
|
|
|
|
// 变量
|
|
const allData = ref([])
|
|
const tableData = ref([])
|
|
const elTableHeight = ref('')
|
|
const theadHeight = ref('')
|
|
const contentHeight = ref(0)
|
|
const showRowCount = ref(0)
|
|
const falseBox = ref(null)
|
|
const scollBoxHeight = ref(0)
|
|
const scrollTopRowCount = ref(0)
|
|
|
|
// 方法
|
|
onMounted(async function () {
|
|
allData.value = []
|
|
for (let i = 0; i < 10000; i++) {
|
|
allData.value.push({
|
|
name: '张三' + i,
|
|
age: 20 + i,
|
|
address: '北京市海淀区' + i,
|
|
salary: 50000 + i,
|
|
date: '2022-01-01'
|
|
})
|
|
}
|
|
scollBoxHeight.value = 45 * allData.value.length + 45 //多加一行,要不然滚动到底差一行
|
|
nextTick(() => {
|
|
elTableHeight.value = document.querySelector(
|
|
'.table-box .el-table'
|
|
).offsetHeight
|
|
theadHeight.value = document.querySelector(
|
|
'.table-box .el-table__header-wrapper'
|
|
).offsetHeight
|
|
console.log('elTableHeight', elTableHeight.value)
|
|
console.log('theadHeight', theadHeight.value)
|
|
contentHeight.value = elTableHeight.value - theadHeight.value
|
|
console.log('contentHeight', contentHeight.value)
|
|
showRowCount.value = Math.floor(contentHeight.value / 45)
|
|
console.log('showRowCount', showRowCount.value)
|
|
// 获取默认显示的前 <showRowCount> 条
|
|
tableData.value = JSON.parse(JSON.stringify(allData.value)).splice(
|
|
0,
|
|
showRowCount.value
|
|
)
|
|
})
|
|
falseBox.value = document.querySelector('.false-box')
|
|
falseBox.value.addEventListener('scroll', function (e) {
|
|
scrollTopRowCount.value = Math.ceil(e.target.scrollTop / 45)
|
|
// 获取从索引<scrollTopRowCount> 开始 <showRowCount> 条
|
|
tableData.value = JSON.parse(JSON.stringify(allData.value)).splice(
|
|
scrollTopRowCount.value,
|
|
showRowCount.value
|
|
)
|
|
})
|
|
})
|
|
</script>
|
|
|
|
<template>
|
|
<div
|
|
class="box"
|
|
style="width: 1000px; height: 500px; overflow: hidden; position: relative"
|
|
>
|
|
<!-- false-box这是一个用来显示滚动条的方法 -->
|
|
<div
|
|
class="false-box"
|
|
style="
|
|
width: 100%;
|
|
height: 100%;
|
|
position: absolute;
|
|
top: 0%;
|
|
left: 0%;
|
|
overflow: auto;
|
|
"
|
|
>
|
|
<div class="scroll-box" :style="{ height: scollBoxHeight + 'px' }">
|
|
<!-- scroll-box是用来撑起盒子的方法 -->
|
|
</div>
|
|
</div>
|
|
<div class="table-box">
|
|
<el-table class="el-table" :data="allData" style="width: 100%">
|
|
<el-table-column prop="name" label="姓名" width="180">
|
|
</el-table-column>
|
|
<el-table-column prop="age" label="年龄" width="180"> </el-table-column>
|
|
<el-table-column prop="address" label="地址"> </el-table-column>
|
|
<el-table-column prop="salary" label="薪资" width="180">
|
|
</el-table-column>
|
|
<el-table-column prop="date" label="日期" width="180">
|
|
</el-table-column>
|
|
</el-table>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
|
|
<style scoped>
|
|
.box {
|
|
width: 1000px;
|
|
height: 500px;
|
|
overflow: hidden;
|
|
position: relative;
|
|
}
|
|
|
|
.false-box {
|
|
width: 100%;
|
|
height: 100%;
|
|
position: absolute;
|
|
top: 0%;
|
|
left: 0%;
|
|
overflow: auto;
|
|
}
|
|
|
|
.scroll-box {
|
|
width: 100%;
|
|
height: 1000px;
|
|
position: absolute;
|
|
top: 0%;
|
|
left: 0%;
|
|
}
|
|
|
|
.table-box {
|
|
width: calc(100% - 20px);
|
|
height: 100%;
|
|
position: absolute;
|
|
top: 0%;
|
|
left: 0%;
|
|
}
|
|
|
|
:deep(.el-table) {
|
|
width: 100%;
|
|
height: 100%;
|
|
}
|
|
|
|
.el-table .el-table__row {
|
|
height: 45px;
|
|
}
|
|
|
|
.el-table .el-table__row td {
|
|
padding: 0px;
|
|
}
|
|
</style>
|