vue封装一个loading的效果

效果视频

1702365951578

//封装成一个组件


<template>
  <view class="mask" :class="mask == 'true' || mask == true ? 'mask-show' : ''" @click="Mclose" v-if="show"
    @touchmove.stop.prevent="preventTouchMove">
    <view class="loading">
      <view class="squareXS"></view>
      <view class="squareXL"></view>
    </view>
    <!-- 加载动画结束 -->
    <view class="title">{{text}}</view>
  </view>
  <!-- 遮罩层-->
</template>

<script scoped="true">
  export default {
    name: "PageLoading",
    props: {
      text: String,
      mask: Boolean | String,
      click: Boolean | String,
    },
    data() {
      return {
        show: false
      };
    },
    methods: {
      preventTouchMove() {
        console.log('stop user scroll it!');
        return;
      },
      Mclose() {
        if (this.click == 'false' || this.click == false) {
          this.show = false
        }
      },
      open() {
        this.show = true
      },
      close() {
       this.show = false
      }
    }
  };
</script>

<style>
  .mask {
    /* pointer-events: none; */
    position: fixed;
    z-index: 99999;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
    height: 100vh;
    width: 100vw;
    /*    display: flex;
    flex-direction: column;
    justify-content: center;
    align-items: center;
    flex-wrap: wrap; */
  }

  .mask.mask-show {
    background-color: #fff;
  }

  .title {
    position: absolute;
    top: 60%;
    left: 50%;
    color: #23BAE8;
    margin: 0 0 0 -80rpx;
    font-size: 28rpx;
  }

  /* loading加载动画的css */
  .loading {
    position: absolute;
    top: 50%;
    left: 50%;
    height: 240rpx;
    width: 160rpx;
    margin: -120rpx 0 0 -80rpx;
  }

  .loading:after {
    content: "";
    position: absolute;
    bottom: -5rpx;
    left: -5%;
    width: 110%;
    height: 10rpx;
    border-radius: 100%;
    background: #ececec;
    z-index: -1;
    animation: shadow 1.8s linear infinite;
  }

  .squareXS {
    position: absolute;
    bottom: 30rpx;
    left: 68rpx;
    width: 24rpx;
    height: 24rpx;
    border-radius: 2rpx;
    transform: scale(1.5, 0.5) rotate(0);
    background: #23BAE8;
    animation: squareXS 1.8s linear infinite;
  }

  .squareXL {
    position: absolute;
    bottom: -20rpx;
    left: 44rpx;
    width: 72rpx;
    height: 72rpx;
    border-radius: 2rpx;
    transform: scale(2, 0.5) rotate(0);
    background: #23BAE8;
    animation: squareXL 1.8s linear infinite;
  }

  @-moz-keyframes squareXS {
    0% {
      transform: scale(1.5, 0.5) rotate(0);
    }

    10% {
      transform: scale(1, 1) rotate(0);
    }

    42% {
      transform: scale(1, 1) rotate(-180deg);
      bottom: 250rpx;
    }

    74% {
      transform: scale(1, 1) rotate(-360deg);
    }

    75% {
      transform: scale(1, 1) rotate(-360deg);
      bottom: 74rpx;
    }

    95% {
      transform: scale(1.5, 0.5) rotate(-360deg);
      bottom: 23rpx;
    }

    100% {
      transform: scale(1.5, 0.5) rotate(-360deg);
      bottom: 14rpx;
    }
  }

  @-webkit-keyframes squareXS {
    0% {
      transform: scale(1.5, 0.5) rotate(0);
    }

    10% {
      transform: scale(1, 1) rotate(0);
    }

    42% {
      transform: scale(1, 1) rotate(-180deg);
      bottom: 250rpx;
    }

    74% {
      transform: scale(1, 1) rotate(-360deg);
    }

    75% {
      transform: scale(1, 1) rotate(-360deg);
      bottom: 74rpx;
    }

    95% {
      transform: scale(1.5, 0.5) rotate(-360deg);
      bottom: 23rpx;
    }

    100% {
      transform: scale(1.5, 0.5) rotate(-360deg);
      bottom: 14rpx;
    }
  }

  @-o-keyframes squareXS {
    0% {
      transform: scale(1.5, 0.5) rotate(0);
    }

    10% {
      transform: scale(1, 1) rotate(0);
    }

    42% {
      transform: scale(1, 1) rotate(-180deg);
      bottom: 250rpx;
    }

    74% {
      transform: scale(1, 1) rotate(-360deg);
    }

    75% {
      transform: scale(1, 1) rotate(-360deg);
      bottom: 74rpx;
    }

    95% {
      transform: scale(1.5, 0.5) rotate(-360deg);
      bottom: 23rpx;
    }

    100% {
      transform: scale(1.5, 0.5) rotate(-360deg);
      bottom: 14rpx;
    }
  }

  @keyframes squareXS {
    0% {
      transform: scale(1.5, 0.5) rotate(0);
    }

    10% {
      transform: scale(1, 1) rotate(0);
    }

    42% {
      transform: scale(1, 1) rotate(-180deg);
      bottom: 250rpx;
    }

    74% {
      transform: scale(1, 1) rotate(-360deg);
    }

    75% {
      transform: scale(1, 1) rotate(-360deg);
      bottom: 74rpx;
    }

    95% {
      transform: scale(1.5, 0.5) rotate(-360deg);
      bottom: 23rpx;
    }

    100% {
      transform: scale(1.5, 0.5) rotate(-360deg);
      bottom: 14rpx;
    }
  }

  @-moz-keyframes squareXL {
    0% {
      transform: scale(2, 0.5) rotate(0);
    }

    10% {
      transform: scale(1, 1) rotate(0);
    }

    42% {
      transform: scale(1, 1) rotate(90deg);
      bottom: 120rpx;
    }

    74% {
      transform: scale(1, 1) rotate(180deg);
    }

    75% {
      transform: scale(1, 1) rotate(180deg);
      bottom: 0;
    }

    95% {
      transform: scale(2, 0.5) rotate(180deg);
      bottom: -20rpx;
    }

    100% {
      transform: scale(2, 0.5) rotate(180deg);
    }
  }

  @-webkit-keyframes squareXL {
    0% {
      transform: scale(2, 0.5) rotate(0);
    }

    10% {
      transform: scale(1, 1) rotate(0);
    }

    42% {
      transform: scale(1, 1) rotate(90deg);
      bottom: 120rpx;
    }

    74% {
      transform: scale(1, 1) rotate(180deg);
    }

    75% {
      transform: scale(1, 1) rotate(180deg);
      bottom: 0;
    }

    95% {
      transform: scale(2, 0.5) rotate(180deg);
      bottom: -20rpx;
    }

    100% {
      transform: scale(2, 0.5) rotate(180deg);
    }
  }

  @-o-keyframes squareXL {
    0% {
      transform: scale(2, 0.5) rotate(0);
    }

    10% {
      transform: scale(1, 1) rotate(0);
    }

    42% {
      transform: scale(1, 1) rotate(90deg);
      bottom: 120rpx;
    }

    74% {
      transform: scale(1, 1) rotate(180deg);
    }

    75% {
      transform: scale(1, 1) rotate(180deg);
      bottom: 0;
    }

    95% {
      transform: scale(2, 0.5) rotate(180deg);
      bottom: -20rpx;
    }

    100% {
      transform: scale(2, 0.5) rotate(180deg);
    }
  }

  @keyframes squareXL {
    0% {
      transform: scale(2, 0.5) rotate(0);
    }

    10% {
      transform: scale(1, 1) rotate(0);
    }

    42% {
      transform: scale(1, 1) rotate(90deg);
      bottom: 120rpx;
    }

    74% {
      transform: scale(1, 1) rotate(180deg);
    }

    75% {
      transform: scale(1, 1) rotate(180deg);
      bottom: 0;
    }

    95% {
      transform: scale(2, 0.5) rotate(180deg);
      bottom: -20rpx;
    }

    100% {
      transform: scale(2, 0.5) rotate(180deg);
    }
  }

  @-moz-keyframes shadow {
    40% {
      transform: scale(0.5, 0.8);
    }
  }

  @-webkit-keyframes shadow {
    40% {
      transform: scale(0.5, 0.8);
    }
  }

  @-o-keyframes shadow {
    40% {
      transform: scale(0.5, 0.8);
    }
  }

  @keyframes shadow {
    40% {
      transform: scale(0.5, 0.8);
    }
  }
</style>
//页面中使用


<template>
    <PageLoading mask text="努力加载中……" ref="loadingRef"></PageLoading>
</template>

<script>
import PageLoading from '@/components/PageLoading/index.vue';
export default {
		components: {
			PageLoading,
		},
		data() {

        },
        onLoad() {
			uni.$on('loginNavToHome', () => {
				this.$refs.loadingRef.open();//打开组件
                this.$refs.loadingRef.close();//关闭组件
			})
		},
}
</script>

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值