封装用于循环播放展示一组内容的组件

<template>
  <div v-if="show" class="command-code" :style="{ color: color }">
    <div class="command-code-box" ref="boxRef" :style="{ width: contentWidth }">
    <span
      ref="contentRef"
      class="command-code-content"
      @mouseenter="cursorEnter"
      @mouseleave="cursorLeave"
    >
      {{ content }}
    </span>
  </div>
  </div>
</template>

<script setup>

const props = defineProps({
  show: {
    type: Boolean,
    default: false
  },
  content: {
    type: String,
    default: '内容'
  },
  delay: { // 动画延迟时间
    type: Number,
    default: 1000
  },
  space: { // 每次移动的距离
    type: Number,
    default: 5
  },
  color: {
    type: String,
    default: '#27CBF3'
  }
});

const boxRef = ref(null);
const contentRef = ref(null);
const boxWidth = ref('');
const contentWidth = ref('');
const timer = ref(null); // 定时器

function textCarousel() {
  nextTick(() => {
    let left = 0;
    if (boxRef.value && contentRef.value) {
      boxWidth.value = boxRef.value?.offsetWidth;
      contentWidth.value = contentRef.value?.offsetWidth;
      if (contentWidth.value > boxWidth.value) { // 内容溢出则滚动展示
        cursorEnter();
        timer.value = setInterval(() => {
          // 一次向左移动的距离
          left -= props.space;
          // 当左移超过这个宽度时,重新设置left
          if (left <= -contentWidth.value) {
            left = 0;
          }
          contentRef.value.style.left = left + "px";
        }, props.delay);
      }
    }

});
}
// 鼠标进入,停止定时器
function cursorEnter() {
  timer.value && clearInterval(timer.value);
}
// 鼠标离开,继续定时器
function cursorLeave() {
  textCarousel();
}

watch(() => props.show, () => {
  if (props.show) {
    textCarousel();
  } else {
    cursorLeave();
  }
});

</script>
<style lang="scss" scoped>
.command-code {
  position: absolute;
  top: 0.4rem;
  left: 6.7rem;
  width: 2.8rem;
  height: 0.54rem;
  padding: 0 0.2rem;
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 0.16rem;
  font-weight: 600;
  color: #27CBF3;
  background: url(@/assets/map_images/code-bg.png) no-repeat 50%;
  background-size: 100% 100%;
}
.command-code-box {
  width: 100%;
  overflow: hidden;
  white-space: nowrap;
  text-align: center;
  .command-code-content {
    position: relative;
  }
}
</style>

 

posted @ 2023-01-30 17:27  YINGYAN  阅读(11)  评论(0编辑  收藏  举报