前端利用JS实现自定义表格滚动效果

在数据可视化大屏中会有滚动表格的需求,不使用插件自己封装重复使用!!!!

好久不见!话不多说,直接上代码!!!!!!!!!!

一、利用scrollTop、定时器实现滚动效果

scrollTop为元素滚动条滚动距离

roll(t) {
            var box1 = document.getElementById("box1");
            var box2 = document.getElementById("box2");
            var table = document.getElementById("table");
            table.scrollTop = 0; // 开始无滚动时设为0 滚动距离
            // 当内容小于父元素不实现滚动
            if (box1.scrollHeight >= table.scrollHeight) {
                box2.innerHTML = box1.innerHTML;
            }
            this.timer = setInterval(this.rollStart, t); // 设置定时器,参数t用在这为间隔时间(单位毫秒),参数t越小,滚动速度越快
            // 鼠标移入div时暂停滚动
            table.onmouseover = () => {
                clearInterval(this.timer);
            }
            // 鼠标移出div后继续滚动
            table.onmouseout = () => {
                this.timer = setInterval(this.rollStart, t);
            }
        },
        rollStart() {
            // 上面声明的DOM对象为局部对象需要再次声明
            var box1 = document.getElementById("box1");
            var table = document.getElementById("table");
            // 正常滚动不断给scrollTop的值+1,当滚动高度大于列表内容高度时恢复为0,scrollTop滚动条滚动的距离
            if (table.scrollTop >= box1.scrollHeight) {
                table.scrollTop = 0;
            } else {
                table.scrollTop += 1;
            }
        }

 二、效果展示

三、完整代码实现
<template>
    <div>
        <div class="cont">
            <div class="title-cont">
                <div class="title" v-for="item in titleList">
                    {{ item.title }}
                </div>
            </div>
            <div class="table" id="table">
                <div id="box1">
                    <div class="content" v-for="item in tableData">
                        <div class="item">{{ item.name }}</div>
                        <div class="item">{{ item.phone }}</div>
                        <div class="item">{{ item.age }}</div>
                    </div>
                </div>
                <div id="box2"></div>
            </div>
        </div>
    </div>
</template>

<script>
export default {
    data() {
        return {
            titleList: [
                {
                    title: '姓名'
                },
                {
                    title: '电话'
                },
                {
                    title: '年龄'
                }
            ],
            tableData: [
                {
                    name: '张三',
                    phone: '1515151',
                    age: '23'
                },
                {
                    name: '李四',
                    phone: '1515151',
                    age: '23'
                },
                {
                    name: '王五',
                    phone: '1515151',
                    age: '23'
                },
                {
                    name: '赵六',
                    phone: '1515151',
                    age: '23'
                },
                {
                    name: '田七',
                    phone: '1515151',
                    age: '23'
                },
                {
                    name: '田八',
                    phone: '1515151',
                    age: '23'
                },
                {
                    name: '张三丰',
                    phone: '1515151',
                    age: '23'
                },
                {
                    name: '张无忌',
                    phone: '1515151',
                    age: '23'
                }

            ],
            timer: null,
        }
    },
    mounted() {
        this.$nextTick(() => {
            this.roll(20);
        })
    },
    methods: {
        roll(t) {
            var box1 = document.getElementById("box1");
            var box2 = document.getElementById("box2");
            var table = document.getElementById("table");
            table.scrollTop = 0; // 开始无滚动时设为0 滚动距离
            if (box1.scrollHeight >= table.scrollHeight) {
                box2.innerHTML = box1.innerHTML;
            }
            this.timer = setInterval(this.rollStart, t); // 设置定时器,参数t用在这为间隔时间(单位毫秒),参数t越小,滚动速度越快
            // 鼠标移入div时暂停滚动
            table.onmouseover = () => {
                clearInterval(this.timer);
            }
            // 鼠标移出div后继续滚动
            table.onmouseout = () => {
                this.timer = setInterval(this.rollStart, t);
            }
        },
        rollStart() {
            // 上面声明的DOM对象为局部对象需要再次声明
            var box1 = document.getElementById("box1");
            var table = document.getElementById("table");
            // 正常滚动不断给scrollTop的值+1,当滚动高度大于列表内容高度时恢复为0,scrollTop滚动条滚动的距离
            if (table.scrollTop >= box1.scrollHeight) {
                table.scrollTop = 0;
            } else {
                table.scrollTop += 1;
            }
        }
    }
}
</script>

<style lang="scss" scoped>
.cont {
    width: 50vw;
    height: 50vh;
    margin: 0 auto;

    .table {
        margin: 0 auto;
        width: 300px;
        height: 200px;
        border: 1px solid #ddd;
        overflow: hidden;
        .content {
            width: 100%;
            height: 40px;
            display: flex;
            align-items: center;
            justify-content: center;

            .item {
                width: 100px;
                height: 40px;
                text-align: center;
                line-height: 40px;
            }
        }

    }

    .title-cont {
        display: flex;
        align-items: center;
        justify-content: center;

        .title {
            width: 100px;
            height: 40px;
            text-align: center;
            line-height: 40px;
            border: 1px solid #333;

            &:not(&:first-of-type) {
                border-left: none;
            }
        }
    }

}
</style>
  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以将表格放在一个固定高度的容器中,然后使用 CSS 的 overflow 属性来实现滚动。具体的实现步骤如下: 1. 给容器设置固定高度和 overflow-y:auto 属性,这样当内容超出容器高度时,就会自动出现纵向滚动条。 ``` <template> <div class="table-container"> <el-table :data="tableData"> <!-- 表格内容 --> </el-table> </div> </template> <style> .table-container { height: 300px; /* 容器高度 */ overflow-y: auto; /* 纵向滚动条 */ } </style> ``` 2. 如果表格内容宽度超出容器宽度,也需要出现横向滚动条。可以给表格添加一个 class,并设置宽度为表格内容的宽度。 ``` <template> <div class="table-container"> <el-table :data="tableData" class="my-table"> <!-- 表格内容 --> </el-table> </div> </template> <style> .table-container { height: 300px; /* 容器高度 */ overflow-y: auto; /* 纵向滚动条 */ } .my-table { width: auto !important; /* 自适应宽度 */ } .my-table td, .my-table th { white-space: nowrap; /* 防止换行 */ } </style> ``` 3. 最后,可以使用 JavaScript 监听容器滚动事件,当滚动到底部时,自动加载更多数据。 ``` <template> <div class="table-container" ref="container" @scroll="handleScroll"> <el-table :data="tableData" class="my-table"> <!-- 表格内容 --> </el-table> </div> </template> <script> export default { data() { return { tableData: [], // 表格数据 page: 1, // 当前页码 pageSize: 10, // 每页条数 total: 0 // 总条数 }; }, methods: { // 加载更多数据 loadData() { // 发送请求获取数据,然后将数据 push 到 tableData 中 // ... }, // 监听容器滚动事件 handleScroll() { const container = this.$refs.container; // 当滚动到底部时,加载更多数据 if (container.scrollTop + container.clientHeight >= container.scrollHeight) { this.page++; this.loadData(); } } } }; </script> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值