效果视频
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>