Blame view

src/components/NoticeBar/index.vue 4.75 KB
1 2 3
<!--
 * @Description: 
 * @Autor: renchao
4
 * @LastEditTime: 2023-11-09 16:47:44
5
-->
任超 committed
6
<template>
任超 committed
7 8 9 10 11 12 13
  <transition name="fade">
    <!--主要内容-->
    <div class="noticebar">
      <div style="margin-left:5px"></div>
      <svg-icon icon-class='notice' />
      <div style="margin-right:5px"></div>
      <div ref="back" class="back">
任超 committed
14
        <div ref="text" class="text" @mouseover="mouseOver" @mouseleave="mouseLeave">
任超 committed
15 16 17 18
          <p v-for="(item, index) in noticeList" :key="index">
            <span> {{ item.noticeTitle }}</span>
            <span class="noticePublishTime">{{ item.noticePublishTime }}</span>
            <el-button type="text" @click="handleNotice(item)" style="color:#F56C6C;font-size: 14px;">[点击查看]</el-button>
任超 committed
19 20
          </p>
        </div>
任超 committed
21 22
      </div>
    </div>
任超 committed
23
  </transition>
任超 committed
24 25
</template>
<script>
26 27 28 29 30 31
  export default {
    props: {
      noticeList: {
        type: Array,
        default: []
      }
任超 committed
32
    },
33 34 35 36 37 38 39 40 41 42
    data () {
      return {
        speed: 50, // 速度(单位px/s)
        backWidth: '', // 父级宽度
        backHeight: '', // 父级高度
        wordLength: '', // 文本长度
        state: 1,
        firstAnimationTime: '', // 状态一动画效果
        secondAnimationTime: '', // 状态二动画效果
      };
任超 committed
43
    },
44
    mounted () {
45 46
      this.Listener();
      this.getData()
47
    },
48 49 50 51 52 53 54
    watch: {
      noticeList: {
        handler (newName, oldName) {
          let that = this
          this.Listener();
          setTimeout(res => {
            that.getData();
55
          }, 300);
56 57
        },
        deep: true
任超 committed
58 59
      }
    },
60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88
    methods: {
      /**
       * @description: handleNotice
       * @param {*} item
       * @author: renchao
       */
      handleNotice (item) {
        this.$alertMes(item.noticeTitle, item.noticeContent)
      },
      /**
       * @description: 获取数据
       * @author: renchao
       */
      getData () {
        let style = document.styleSheets[0];
        let text = this.$refs.text;
        let back = this.$refs.back;
        this.backWidth = back.offsetWidth;
        this.backHeight = back.offsetHeight;
        text.style.lineHeight = this.backHeight + 'px';
        this.wordLength = text.offsetWidth;
        this.ComputationTime(); // 计算时间
        style.insertRule(
          `@keyframes firstAnimation {0%   {left:0px;}100%  {left:-${this.wordLength}px;}}`
        );
        style.insertRule(
          `@keyframes secondAnimation {0%   {left:${this.backWidth}px;}100%  {left:-${this.wordLength}px;}}`
        );
        setTimeout(res => {
任超 committed
89
          this.changeState();
90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
        }, 300);
      },
      /**
       * @description: 用速度计算时间(想要保持速度一样,2种状态时间不同需算出)
       * @author: renchao
       */
      ComputationTime () {
        this.firstAnimationTime = this.wordLength / this.speed;
        this.secondAnimationTime =
          (this.wordLength + this.backWidth) / this.speed;
      },
      /**
       * @description: 根据状态切换动画
       * @author: renchao
       */
      changeState () {
        let text = this.$refs.text;
        if (this.state == 1) {
          text.style.animation = `firstAnimation ${this.firstAnimationTime}s linear`;
          this.state = 2;
        } else {
          text.style.animation = `secondAnimation ${this.secondAnimationTime}s linear infinite`;
        }
      },
      /**
       * @description: Listener
       * @author: renchao
       */
      Listener () {
        let text = this.$refs.text;
        text.addEventListener(
          'animationend',
          res => {
            this.changeState();
          },
          false
        )
      },
      /**
       * @description: mouseOver
       * @author: renchao
       */
      mouseOver () {
        let text = this.$refs.text;
        text.style.animationPlayState = 'paused'
      },
      /**
       * @description: mouseLeave
       * @author: renchao
       */
      mouseLeave () {
        let text = this.$refs.text;
        text.style.animationPlayState = ''
      }
任超 committed
144
    }
145
  };
任超 committed
146 147
</script>
<style lang="scss" scoped>
148 149 150 151 152 153
  .noticebar {
    display: flex;
    align-items: center;
    width: 100%;
    height: 28px;
    background: rgba(0, 0, 0, 0.1);
任超 committed
154

155 156 157 158 159
    .icon {
      img {
        height: 100%;
        width: 100%;
      }
任超 committed
160
    }
任超 committed
161

162 163 164 165 166 167 168 169 170 171
    .back {
      overflow: hidden;
      white-space: nowrap;
      margin: 0 auto;
      height: 100%;
      width: 100%;
      cursor: pointer;
      position: relative;
      font-size: 14px;
      color: #fff;
任超 committed
172

173 174 175 176
      .text {
        position: absolute;
        display: inline-block;
        padding: 2px 0;
任超 committed
177
        display: flex;
178 179 180 181 182 183 184 185

        p {
          margin-right: 80px;
          display: flex;
          align-items: center;
          height: 28px;
          line-height: 28px;
        }
任超 committed
186
      }
任超 committed
187 188
    }
  }
yuanbo committed
189
</style>