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

打印 上一主题 下一主题

主题 898|帖子 898|积分 2694

在数据可视化大屏中会有滚动表格的需求,不使用插件自己封装重复使用!!!!
很久不见!话不多说,直接上代码!!!!!!!!!!

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

scrollTop为元素滚动条滚动隔断
  1. roll(t) {
  2.             var box1 = document.getElementById("box1");
  3.             var box2 = document.getElementById("box2");
  4.             var table = document.getElementById("table");
  5.             table.scrollTop = 0; // 开始无滚动时设为0 滚动距离
  6.             // 当内容小于父元素不实现滚动
  7.             if (box1.scrollHeight >= table.scrollHeight) {
  8.                 box2.innerHTML = box1.innerHTML;
  9.             }
  10.             this.timer = setInterval(this.rollStart, t); // 设置定时器,参数t用在这为间隔时间(单位毫秒),参数t越小,滚动速度越快
  11.             // 鼠标移入div时暂停滚动
  12.             table.onmouseover = () => {
  13.                 clearInterval(this.timer);
  14.             }
  15.             // 鼠标移出div后继续滚动
  16.             table.onmouseout = () => {
  17.                 this.timer = setInterval(this.rollStart, t);
  18.             }
  19.         },
  20.         rollStart() {
  21.             // 上面声明的DOM对象为局部对象需要再次声明
  22.             var box1 = document.getElementById("box1");
  23.             var table = document.getElementById("table");
  24.             // 正常滚动不断给scrollTop的值+1,当滚动高度大于列表内容高度时恢复为0,scrollTop滚动条滚动的距离
  25.             if (table.scrollTop >= box1.scrollHeight) {
  26.                 table.scrollTop = 0;
  27.             } else {
  28.                 table.scrollTop += 1;
  29.             }
  30.         }
复制代码

 二、效果展示


三、完备代码实现

  1. <template>
  2.     <div>
  3.         <div class="cont">
  4.             <div class="title-cont">
  5.                 <div class="title" v-for="item in titleList">
  6.                     {{ item.title }}
  7.                 </div>
  8.             </div>
  9.             <div class="table" id="table">
  10.                 <div id="box1">
  11.                     <div class="content" v-for="item in tableData">
  12.                         <div class="item">{{ item.name }}</div>
  13.                         <div class="item">{{ item.phone }}</div>
  14.                         <div class="item">{{ item.age }}</div>
  15.                     </div>
  16.                 </div>
  17.                 <div id="box2"></div>
  18.             </div>
  19.         </div>
  20.     </div>
  21. </template>
  22. <script>
  23. export default {
  24.     data() {
  25.         return {
  26.             titleList: [
  27.                 {
  28.                     title: '姓名'
  29.                 },
  30.                 {
  31.                     title: '电话'
  32.                 },
  33.                 {
  34.                     title: '年龄'
  35.                 }
  36.             ],
  37.             tableData: [
  38.                 {
  39.                     name: '张三',
  40.                     phone: '1515151',
  41.                     age: '23'
  42.                 },
  43.                 {
  44.                     name: '李四',
  45.                     phone: '1515151',
  46.                     age: '23'
  47.                 },
  48.                 {
  49.                     name: '王五',
  50.                     phone: '1515151',
  51.                     age: '23'
  52.                 },
  53.                 {
  54.                     name: '赵六',
  55.                     phone: '1515151',
  56.                     age: '23'
  57.                 },
  58.                 {
  59.                     name: '田七',
  60.                     phone: '1515151',
  61.                     age: '23'
  62.                 },
  63.                 {
  64.                     name: '田八',
  65.                     phone: '1515151',
  66.                     age: '23'
  67.                 },
  68.                 {
  69.                     name: '张三丰',
  70.                     phone: '1515151',
  71.                     age: '23'
  72.                 },
  73.                 {
  74.                     name: '张无忌',
  75.                     phone: '1515151',
  76.                     age: '23'
  77.                 }
  78.             ],
  79.             timer: null,
  80.         }
  81.     },
  82.     mounted() {
  83.         this.$nextTick(() => {
  84.             this.roll(20);
  85.         })
  86.     },
  87.     methods: {
  88.         roll(t) {
  89.             var box1 = document.getElementById("box1");
  90.             var box2 = document.getElementById("box2");
  91.             var table = document.getElementById("table");
  92.             table.scrollTop = 0; // 开始无滚动时设为0 滚动距离
  93.             if (box1.scrollHeight >= table.scrollHeight) {
  94.                 box2.innerHTML = box1.innerHTML;
  95.             }
  96.             this.timer = setInterval(this.rollStart, t); // 设置定时器,参数t用在这为间隔时间(单位毫秒),参数t越小,滚动速度越快
  97.             // 鼠标移入div时暂停滚动
  98.             table.onmouseover = () => {
  99.                 clearInterval(this.timer);
  100.             }
  101.             // 鼠标移出div后继续滚动
  102.             table.onmouseout = () => {
  103.                 this.timer = setInterval(this.rollStart, t);
  104.             }
  105.         },
  106.         rollStart() {
  107.             // 上面声明的DOM对象为局部对象需要再次声明
  108.             var box1 = document.getElementById("box1");
  109.             var table = document.getElementById("table");
  110.             // 正常滚动不断给scrollTop的值+1,当滚动高度大于列表内容高度时恢复为0,scrollTop滚动条滚动的距离
  111.             if (table.scrollTop >= box1.scrollHeight) {
  112.                 table.scrollTop = 0;
  113.             } else {
  114.                 table.scrollTop += 1;
  115.             }
  116.         }
  117.     }
  118. }
  119. </script>
  120. <style lang="scss" scoped>
  121. .cont {
  122.     width: 50vw;
  123.     height: 50vh;
  124.     margin: 0 auto;
  125.     .table {
  126.         margin: 0 auto;
  127.         width: 300px;
  128.         height: 200px;
  129.         border: 1px solid #ddd;
  130.         overflow: hidden;
  131.         .content {
  132.             width: 100%;
  133.             height: 40px;
  134.             display: flex;
  135.             align-items: center;
  136.             justify-content: center;
  137.             .item {
  138.                 width: 100px;
  139.                 height: 40px;
  140.                 text-align: center;
  141.                 line-height: 40px;
  142.             }
  143.         }
  144.     }
  145.     .title-cont {
  146.         display: flex;
  147.         align-items: center;
  148.         justify-content: center;
  149.         .title {
  150.             width: 100px;
  151.             height: 40px;
  152.             text-align: center;
  153.             line-height: 40px;
  154.             border: 1px solid #333;
  155.             &:not(&:first-of-type) {
  156.                 border-left: none;
  157.             }
  158.         }
  159.     }
  160. }
  161. </style>
复制代码



免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

圆咕噜咕噜

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表