Blame view

src/components/NoticeBar/index.vue 4.68 KB
1 2 3 4 5
<!--
 * @Description: 
 * @Autor: renchao
 * @LastEditTime: 2023-07-25 16:10:08
-->
任超 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 45 46 47 48 49 50 51 52 53
    watch: {
      noticeList: {
        handler (newName, oldName) {
          let that = this
          this.Listener();
          setTimeout(res => {
            that.getData();
          }, 100);
        },
        deep: true
任超 committed
54 55
      }
    },
56 57 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
    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
85
          this.changeState();
86 87 88 89 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
        }, 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
140
    }
141
  };
任超 committed
142 143
</script>
<style lang="scss" scoped>
144 145 146 147 148 149
  .noticebar {
    display: flex;
    align-items: center;
    width: 100%;
    height: 28px;
    background: rgba(0, 0, 0, 0.1);
任超 committed
150

151 152 153 154 155
    .icon {
      img {
        height: 100%;
        width: 100%;
      }
任超 committed
156
    }
任超 committed
157

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

169 170 171 172
      .text {
        position: absolute;
        display: inline-block;
        padding: 2px 0;
任超 committed
173
        display: flex;
174 175 176 177 178 179 180 181

        p {
          margin-right: 80px;
          display: flex;
          align-items: center;
          height: 28px;
          line-height: 28px;
        }
任超 committed
182
      }
任超 committed
183 184
    }
  }
yuanbo committed
185
</style>