css3动画+js实现实时数据滚动

效果图:

在这里插入图片描述

实现步骤

1.实现单条数据在显示区滚动

在这里插入图片描述

<div class="scrollScreen">
    <div class="box">
      <div class="Line">
        <div class="cell">2016-05-02</div>
        <div class="cell">王小虎</div>
        <div class="cell">上海市普陀区金沙江路 1518 弄</div>
      </div>
    </div>
  </div>
<style lang="less"> //去掉scoped,否则会导致用js添加的元素使用css样式失效
.scrollScreen {
  width: 400px; //可视区宽400px;高120px
  height: 120px;
  background: #f6cece;
  padding: 0 20px;
}
.box {
  position: relative; 
}
.Line {
  position: absolute;
  display: flex;
  color: #fff;
  justify-content: space-between;
  line-height: 30px;
  top: 200px; //单条数据顶部相较于可视区顶部距离200px
  animation: transform 5s linear; //设置5s匀速动画
  .cell {
    margin: 0 5px;
  }
}
@keyframes transform {
  from {
    top: 200px; //单条数据通可视区底部到
  }
  to {
    top: -30px;
  }
}
</style>
2.用js实现多条数据代替单条数据

在这里插入图片描述

 mounted() {
    setInterval(() => {
      this.appendNode();//0.5秒创建一条数据显示
    }, 500); 
    setTimeout(()=>{
      this.removeNode()
    },5000)//5秒后第一条数据跑完,等待5秒后开始删除数据
 },
  methods: {
    appendNode() {
      var box = document.getElementsByClassName("box")[0];
      var line = document.createElement("div");
      line.className = "Line";
      for(let i = 0;i<3;i++){
        var cell = document.createElement("div")
        cell.className = "cell";
        cell.innerText = 'test'
        line.appendChild(cell)
      }
      box.appendChild(line);
    }
    removeNode(){
      setInterval(() => {
        var box = document.getElementsByClassName("box")[0];
        var line = document.getElementsByClassName("Line")[0];
        box.removeChild(line)
      }, 500); //每隔0.5s删除第一个div
    }
  }
3.实现数据动态加载
data() {
    return {
      list: [
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄"
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄"
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄"
        },
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄"
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄"
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄"
        }
      ]
    };
  },
  mounted() {
    setInterval(() => {
      this.appendNode();//0.5秒取出一条数据;3秒取完6条
    }, 500); 
    setTimeout(()=>{
      this.removeNode()
    },5000)//5秒后第一条数据跑完,等待5秒后开始删除数据
    setInterval(()=>{
      this.list = [{
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄"
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄"
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄"
        },
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄"
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄"
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄"
        }]
    },3000)//3秒请求新的数据并赋值(如果请求时间缓慢,可以先请求,暂存数据再赋值)
  },
  methods: {
    appendNode() {
      var box = document.getElementsByClassName("box")[0];
      var line = document.createElement("div");
      line.className = "Line";
      let data = this.list.shift() //取出第一条数据
      let keyList = Object.keys(data) //获取属性列表
      for(let i = 0;i<3;i++){
        var cell = document.createElement("div")
        cell.className = "cell";
        cell.innerText =data[keyList[i]] //取出单条数据对应的属性值 
        line.appendChild(cell)
      }
      box.appendChild(line);
    },
    removeNode(){
      setInterval(() => {
        var box = document.getElementsByClassName("box")[0];
        var line = document.getElementsByClassName("Line")[0];
        box.removeChild(line)
      }, 500); 
    }
  }

完整代码

<template>
  <div class="scrollScreen">
    <div class="box">
    </div>
  </div>
</template>
<script>
export default {
  name: "scrollScreen",
  props: {},
  data() {
    return {
      list: [
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄"
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄"
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄"
        },
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄"
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄"
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄"
        }
      ]
    };
  },
  mounted() {
    setInterval(() => {
      this.appendNode();//0.5秒取出一条数据;3秒取完6条
    }, 500); 
    setTimeout(()=>{
      this.removeNode()
    },5000)//5秒后第一条数据跑完,等待5秒后开始删除数据
    setInterval(()=>{
      this.list = [{
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄"
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄"
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 弄"
        },
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 弄"
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄"
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 弄"
        }]
    },3000)//3秒请求新的数据(如果请求时间缓慢,可以先请求,暂存数据再赋值)
  },
  methods: {
    appendNode() {
      var box = document.getElementsByClassName("box")[0];
      var line = document.createElement("div");
      line.className = "Line";
      let data = this.list.shift()
      let keyList = Object.keys(data)
      for(let i = 0;i<3;i++){
        var cell = document.createElement("div")
        cell.className = "cell";
        cell.innerText =data[keyList[i]]
        line.appendChild(cell)
      }
      box.appendChild(line);
    },
    removeNode(){
      setInterval(() => {
        var box = document.getElementsByClassName("box")[0];
        var line = document.getElementsByClassName("Line")[0];
        box.removeChild(line)
      }, 500); 
    }
  }
};
</script>
<style lang="less"> //去掉scoped,否则会导致用js添加的元素使用css样式失效
.scrollScreen {
  width: 400px; //可视区宽400px;高120px
  height: 120px;
  background: #f6cece;
  padding: 0 20px;
}
.box {
  position: relative; 
}
.Line {
  position: absolute;
  display: flex;
  color: #fff;
  justify-content: space-between;
  line-height: 30px;
  top: 200px; //单条数据顶部相较于可视区顶部距离200px
  animation: transform 5s linear; //设置5s匀速动画
  .cell {
    margin: 0 5px;
  }
}
@keyframes transform {
  from {
    top: 200px; //单条数据通可视区底部到
  }
  to {
    top: -30px;
  }
}
</style>

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现数据的自动无缝滚动垂直可以使用Vue.js和TypeScript来完成。以下是一个简单的实现方式: 1. 在Vue组件中,使用v-for指令渲染数据列表,并将列表存储在组件的data属性中。 2. 使用CSS实现滚动效果,例如设置容器元素的overflow属性为hidden,列表元素的高度为固定值,使用transform属性来实现滚动。 3. 使用Vue的生命周期钩子函数mounted,当组件挂载到DOM后,使用setInterval函数定时更新数据列表,并在更新后通过动画效果实现无缝滚动。 以下是示例代码: ```html <template> <div class="scroll-container"> <ul ref="list" class="scroll-list"> <li v-for="(item, index) in dataList" :key="index">{{ item }}</li> </ul> </div> </template> <script lang="ts"> import { defineComponent, ref, onMounted, onUnmounted } from 'vue'; export default defineComponent({ name: 'AutoScroll', setup() { const dataList = ref(['数据1', '数据2', '数据3', '数据4', '数据5']); const listHeight = 40; // 列表项高度 const interval = 2000; // 更新数据间隔时间 let timer: ReturnType<typeof setInterval> | null = null; // 更新数据列表 const updateDataList = () => { dataList.value.push(dataList.value.shift()); }; // 开始滚动 const startScroll = () => { timer = setInterval(() => { updateDataList(); }, interval); }; // 停止滚动 const stopScroll = () => { if (timer) { clearInterval(timer); timer = null; } }; // 组件挂载后开始滚动 onMounted(() => { startScroll(); }); // 组件卸载前停止滚动 onUnmounted(() => { stopScroll(); }); return { dataList, listHeight, }; }, }); </script> <style scoped> .scroll-container { position: relative; height: 200px; overflow: hidden; } .scroll-list { position: absolute; top: 0; left: 0; margin: 0; padding: 0; list-style: none; animation: scrollAnimation 5s linear infinite; } .scroll-list li { height: 40px; line-height: 40px; } @keyframes scrollAnimation { 0% { transform: translateY(0); } 100% { transform: translateY(-200px); } } </style> ``` 在上述代码中,我们使用了Vue的setup函数来定义组件的逻辑。在setup函数中,我们使用了ref函数来创建响应式数据dataList,表示数据列表。我们还定义了列表项的高度listHeight和更新数据间隔时间interval。在updateDataList函数中,我们通过数组的push和shift方法实现数据列表的更新。在startScroll函数中,我们使用setInterval函数来定时调用updateDataList函数,实现数据的自动更新。在onMounted钩子函数中,我们调用startScroll函数,实现组件的自动滚动。在onUnmounted钩子函数中,我们调用stopScroll函数,停止组件的自动滚动。最后,我们通过CSS动画实现了列表的无缝滚动效果
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值