vue中自定义的DotLoading组件

样式预览:

在这里插入图片描述

注意点

注意参数loading需要在使用该组件的地方,正确传入;
<template>
	<DotLoading
		:loading='loading'
	>
	</DotLoading>
</template>
<script>
	export default {
		data() {
		    return {
		    	loading: true,
			}
		}
	}
</script>

源代码

<template>
  <div class="loading-wrapper" v-if="loading">
    <div
      class="loading-dot"
      v-for="(dot, index) in dots"
      :key="index"
      :class="{ active: index === currentIndex }"
    ></div>
  </div>
</template>

<script>
export default {
  name: 'DotLoading',
  props: {
    // 控制loading状态的开关
    loading: {
      type: Boolean,
      default: () => false,
    }
  },
  data() {
    return {
      currentIndex: 0, // 当前变色的点的索引
      dots: [
        { color: "#f00", scale: 2 },
        { color: "#f00", scale: 2 },
        { color: "#f00", scale: 2 },
      ],
      animationDuration: 500, // 动画持续时间(毫秒)
      animationInterval: null, // 动画定时器
    };
  },
  mounted() {
    this.startLoadingAnimation();
  },
  beforeDestroy() {
    this.stopLoadingAnimation();
  },
  methods: {
    startLoadingAnimation() {
      if (this.loading) {
        this.animationInterval = setInterval(() => {
          this.currentIndex = (this.currentIndex + 1) % 3;
          this.updateDots();
        }, this.animationDuration);
      }
    },
    stopLoadingAnimation() {
      if (this.animationInterval) {
        clearInterval(this.animationInterval);
        this.animationInterval = null;
      }
      // 重置dots状态(可选)
      this.dots = this.dots.map((dot) => ({ ...dot, scale: 1, color: "#fff" }));
      this.currentIndex = 0;
    },
    updateDots() {
      // 更新dots数组中的颜色和大小
      this.dots = this.dots.map((dot, index) => {
        let color = "#ccc"; // 默认颜色
        let scale = 1; // 默认大小
        if (index === this.currentIndex) {
          color = "#4d71ff"; // 当前点的颜色
          scale = 1.5; // 当前点的大小
        } else if (index === (this.currentIndex + 2) % 3) {
          // 上一个变大的点稍微变小,模拟回弹效果(可选)
          scale = 1.2;
        }
        return { ...dot, color, scale };
      });
    },
  },
};
</script>

<style scoped>
.loading-wrapper {
  height: 32px;
  display: flex;
  justify-content: center;
  align-items: center;
}

.loading-dot {
  width: 3px;
  height: 3px;
  margin-right: 5px;
  border-radius: 50%;
  background-color: #ccc;
  transition: background-color 0.5s, transform 0.5s;
}

.loading-dot.active {
  background-color: #4d71ff;
  transform: scale(2);
}
</style>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值