一、需求
在做前端可视化大屏项目的时候除了使用echarts绘制图表之外还需要很多表格展示数据,现有两个需求:
1、需要将表格内容实现自动滚动的效果;
2、表格是带斑马纹的,并且颜色需要自定义。
以下是我实现该功能的方法,希望对大家有所帮助!!!
二、代码展示
1、表格自动滚动逻辑代码
<template>
<a-table
class="ant-table-striped"
:columns="columns"
:data-source="dataSourse"
ref="gateCloseTable"
:pagination="false"
:scroll="{ y: '14rem' }"
size="small"
:row-class-name="
(record, index) => (index % 2 === 0 ? 'table-striped-1' : null)
"
/>
</template>
<script setup>
import { ref, watch, onUnmounted } from "vue";
const dataSourse = ref([]);//表格数据
const gateCloseTable = ref(null);//获取表格实例
const scrollTimer = ref(null);
const delayTimer = ref(null);
const columns = ref([
{
title: "开始公里标",
dataIndex: "kilometerSignStart",
},
{
title: "结束公里标",
dataIndex: "kilometerSignEnd",
},
{
title: "操纵类别",
dataIndex: "manipulateType",
},
{
title: "操纵结果",
dataIndex: "operationResult",
width: "8.125rem",
},
]);
// 实现自动滚动的逻辑
const autoScrollTable = () => {
//清除之前的定时器
if (scrollTimer.value) {
clearInterval(scrollTimer.value);
}
let status = true;//设置一个标识,控制表格的滚动和不滚动两种状态
let isScrollingToTop = false;//是否滚动到顶部
let table = gateCloseTable.value.$el.querySelector(".ant-table-body");
// 鼠标移入停止滚动
table.addEventListener("mouseover", () => {
status = false;
});
// 鼠标移出恢复滚动
table.addEventListener("mouseout", () => {
status = true;
});
const scrollStep = 1; // 每次滚动的步长
const scrollInterval = 45; // 滚动间隔时间
const scrollAmount = 2; // 每次滚动的距离
scrollTimer.value = setInterval(() => {
if (status) {
table.scrollBy(0, scrollStep);
// 当滚动到底部时修改scrollTop回到顶部
if (
table.scrollHeight - (table.clientHeight + table.scrollTop) <
scrollAmount
) {
if (!isScrollingToTop) {
isScrollingToTop = true;
table.scroll(0, 0);
delayTimer.value = setTimeout(() => {
isScrollingToTop = false;
}, 100);
}
}
}
}, scrollInterval);
};
onUnmounted(() => {
clearInterval(scrollTimer.value);
clearTimeout(delayTimer.value);
scrollTimer.value = null;
delayTimer.value = null;
});
</script>
2、自定义表格斑马纹颜色
<style lang="scss" scoped>
.ant-table-striped :deep(.table-striped-1) td {
background-color: #b8741a;
}
:deep(.ant-table-small) {
font-size: 1rem;
background-color: #154397;
color: #fff;
font-size: 1rem;
cursor: pointer;
}
:deep(.ant-table-small .ant-table-thead > tr > th) {
text-align: center;
background-color: #154397;
color: #fff;
font-size: 1rem;
}
//鼠标划过样式
:deep(
.ant-table .ant-table-tbody > tr:hover:not(.ant-table-expanded-row) > td
) {
background: #4b7902;
}
:deep(.ant-table-tbody > tr > td.ant-table-cell-row-hover) {
background: #4b7902;
}
//隐藏滚动条
:deep(
.ant-table-body::-webkit-scrollbar,
.ant-list.ant-list-sm.ant-list-split.ant-list-bordered.event-list::-webkit-scrollbar
) {
display: none;
}
//表格数据为空时的样式
:deep(.ant-empty-normal) {
color: #fff;
font-size: 1rem;
height: 8.3rem;
}
</style>
三、总结
大家可能对有些方法的使用不是很清楚,我简单做下解释:
1、在写滚动逻辑的时候,用到了xxx.scrollBy()的方法,这个方法是JavaScript中window对象的一种方法,可以在获取某个容器之后,指定像素数目,让其以指定的像素数目滚动窗口的内容。
2、在对表格的样式进行更改的时候,用到了:deep()深度选择器,目的是为了让自定义的样式作用到组件内部中,因为我们在vue项目中采用的是组件化开发,在写css样式的时候都有scoped属性,如果不使用深度选择器,那么样式就没法作用到目标容器上。
以上就是我解决这两个需求的办法,仅供大家参考~~~