vue组件系列-走马灯组件

复制代码
<template>
  <div class="sec-alert">
    <div :class="{ animated: isAnimating }">
      <div class="line" v-text="tips[0]"></div>
      <div class="line" v-text="tips[1]"></div>
    </div>
  </div>
</template>
<script>
import { broadcast } from '../utils/data.js';
let timer
export default {
  name: 'Broadcast',
  props: {
  },
  data() {
    return {
      ti: 0,
      tips: [],
      isAnimating: false,
      alerts: broadcast.data || []
    }
  },
  methods:{
    startAnimate() {
      if (timer) clearInterval(timer)
      let _alerts
      if (this.alerts.length === 0){
        _alerts = []
      } else if (this.alerts.length === 1) {
        _alerts = [ this.alerts[0], this.alerts[0] ]
      } else {
        _alerts = this.alerts
      }
      this.ti = 1
      this.tips = _alerts.slice(0, 2)
       //this.ti = 0
      //this.tips = _alerts.slice(this.ti, this.ti + 2)
      timer = setInterval(() => {
        this.isAnimating = true
        setTimeout(() => {
          this.isAnimating = false
          this.$nextTick(() => {
                        //这里是数据随机取法
            let _ridx = Math.floor(Math.random() * _alerts.length);
            this.tips = [_alerts[this.ti], _alerts[_ridx]];
            this.ti = _ridx;
  
                        //数据按顺序取法
                      if (this.ti === _alerts.length - 2) {
                       this.ti = this.ti + 1
                      this.tips = [ _alerts[_alerts.length - 1], _alerts[0] ]
                    } else {
                      this.ti = (this.ti + 1) % _alerts.length
                      this.tips = _alerts.slice(this.ti, this.ti + 2)
                    }
                
          })
        }, 500)
      }, 3000);
    }
  },
  mounted() {
    this.startAnimate()
  },
  watch: {
    alerts() {
      if (this.alerts && this.alerts.length) {
        this.startAnimate()
      }
    }
  },
  destroyed() {
    if (timer) {
      clearInterval(timer)
      timer = null
    }
  }
}
</script>
<style lang="postcss">

  .sec-alert {
    width:95%; 
    margin:0 auto;
    height: 61px;
    border-radius: 6px;
    background: url('../assets/images/hongbao_scroll_icon.jpg') no-repeat 20px center #db2031;
    overflow: hidden;
    padding-left: 73px;
    .line{
      line-height:61px;
      font-family: PingFangSC;
      font-size: 26px;
      letter-spacing: 0.52px;
      color: #f9d587;
    }
    .animated {
      transform: translateY(-50%);
      transition: transform .4s linear;
    } 
  }
</style>            
复制代码

 

posted @   创业男生  阅读(3456)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
历史上的今天:
2013-01-17 DataTable批量插入数据库四种方式比较
点击右上角即可分享
微信分享提示