花瓣效果如下,当然是一直转动的

目录结构
src目录下新增directive目录,用来存放自定义指令

新建loading目录,里面存放如下文件index.js loadingComponent 文件夹

loadingComponent 里面存放如下文件 index.js loadingComponent .vue(加载组件)

loadingComponent .vue
<template>
<div class="LoadingComponent" v-show="visible">
<div class="modal"></div>
<div class="out">
<div class="fade-in">
<div class="container">
<div class="one common"></div>
<div class="two common"></div>
<div class="three common"></div>
<div class="four common"></div>
<div class="five common"></div>
<div class="six common"></div>
<div class="seven common"></div>
<div class="eight common"></div>
</div>
</div>
</div>
</div>
</template>
<script>
export default {
name: 'LoadingComponent',
props: {},
data() {
return {
visible: false, // 仅用于废水、废气台账
};
},
mounted() {
},
methods: {},
};
</script>
<style scoped lang="less">
.LoadingComponent {
width: 100%;
height: 100%;
z-index: 11111111111111111111;
position: absolute;
top: 0px;
// .modal {
// width: 100%;
// height: 100%;
// position: absolute;
// top: 0px;
// background-color: white;
// opacity: 0.5;
// }
.container {
width: 40vw;
height: 40vw;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
overflow: hidden;
}
.common {
height: 5vw;
max-height: 100%;
overflow: auto;
width: 2vw;
margin: auto;
max-width: 100%;
position: absolute;
background-color: ;
border-radius: 0vw 10vw 0vw 10vw;
box-shadow: inset 0vw 0vw 0vw 0.1vw #ebc5e6, 0vw 0vw 1.5vw 0vw #e6cee2;
}
.one {
transform: rotate(45deg);
left: 0;
right: 0;
top: 0;
bottom: 7.5vw;
}
.two {
transform: rotate(90deg);
left: 5.5vw;
right: 0;
top: 0;
bottom: 5.5vw;
}
.three {
transform: rotate(135deg);
left: 7.5vw;
right: 0;
top: 0;
bottom: 0;
}
.four {
transform: rotate(180deg);
left: 5.5vw;
right: 0;
top: 5.5vw;
bottom: 0;
}
.five {
transform: rotate(225deg);
left: 0;
right: 0;
top: 7.5vw;
bottom: 0;
}
.six {
transform: rotate(270deg);
left: 0;
right: 5.5vw;
top: 5.5vw;
bottom: 0;
}
.seven {
transform: rotate(315deg);
left: 0;
right: 7.5vw;
top: 0;
bottom: 0;
}
.eight {
transform: rotate(360deg);
left: 0;
right: 5.5vw;
top: 0;
bottom: 5.5vw;
}
.bar {
width: 12vw;
height: 0.25vw;
position: absolute;
left: 0;
right: 0;
top: 16vw;
bottom: 0;
margin: auto;
overflow: hidden;
background: #e645d0;
}
.progress {
width: 12vw;
height: 0.5vw;
position: absolute;
left: 0;
right: 0;
top: 0;
bottom: 0;
margin: auto;
overflow: hidden;
background: #17e1e6;
}
.one {
animation: one 1s ease infinite;
-moz-animation: one 1s ease infinite;
/* Firefox */
-webkit-animation: one 1s ease infinite;
/* Safari and Chrome */
-o-animation: one 1s ease infinite;
/* Opera */
}
@keyframes one {
0%,
100% {
}
50% {
background: ;
box-shadow: inset 0vw 0vw 0vw 0.1vw #17e1e6,
0vw 0vw 1.5vw 0vw #17e1e6;
}
}
.two {
animation: two 1s 0.125s ease infinite;
-moz-animation: two 1s 0.125s ease infinite;
/* Firefox */
-webkit-animation: two 1s 0.125s ease infinite;
/* Safari and Chrome */
-o-animation: two 1s 0.125s ease infinite;
/* Opera */
}
@keyframes two {
0%,
100% {
}
50% {
background: ;
box-shadow: inset 0vw 0vw 0vw 0.1vw #17e1e6,
0vw 0vw 1.5vw 0vw #17e1e6;
}
}
.three {
animation: three 1s 0.25s ease infinite;
-moz-animation: three 1s 0.25s ease infinite;
/* Firefox */
-webkit-animation: three 1s 0.25s ease infinite;
/* Safari and Chrome */
-o-animation: three 1s 0.25s ease infinite;
/* Opera */
}
@keyframes three {
0%,
100% {
}
50% {
background: ;
box-shadow: inset 0vw 0vw 0vw 0.1vw #17e1e6,
0vw 0vw 1.5vw 0vw #17e1e6;
}
}
.four {
animation: four 1s 0.375s ease infinite;
-moz-animation: four 1s 0.375s ease infinite;
/* Firefox */
-webkit-animation: four 1s 0.375s ease infinite;
/* Safari and Chrome */
-o-animation: four 1s 0.375s ease infinite;
/* Opera */
}
@keyframes four {
0%,
100% {
}
50% {
background: ;
box-shadow: inset 0vw 0vw 0vw 0.1vw #17e1e6,
0vw 0vw 1.5vw 0vw #17e1e6;
}
}
.five {
animation: five 1s 0.5s ease infinite;
-moz-animation: five 1s 0.5s ease infinite;
/* Firefox */
-webkit-animation: five 1s 0.5s ease infinite;
/* Safari and Chrome */
-o-animation: five 1s 0.5s ease infinite;
/* Opera */
}
@keyframes five {
0%,
100% {
}
50% {
background: ;
box-shadow: inset 0vw 0vw 0vw 0.1vw #17e1e6,
0vw 0vw 1.5vw 0vw #17e1e6;
}
}
.six {
animation: six 1s 0.625s ease infinite;
-moz-animation: six 1s 0.625s ease infinite;
/* Firefox */
-webkit-animation: six 1s 0.625s ease infinite;
/* Safari and Chrome */
-o-animation: six 1s 0.625s ease infinite;
/* Opera */
}
@keyframes six {
0%,
100% {
}
50% {
background: ;
box-shadow: inset 0vw 0vw 0vw 0.1vw #17e1e6,
0vw 0vw 1.5vw 0vw #17e1e6;
}
}
.seven {
animation: seven 1s 0.75s ease infinite;
-moz-animation: seven 1s 0.75s ease infinite;
/* Firefox */
-webkit-animation: seven 1s 0.75s ease infinite;
/* Safari and Chrome */
-o-animation: seven 1s 0.75s ease infinite;
/* Opera */
}
@keyframes seven {
0%,
100% {
}
50% {
background: ;
box-shadow: inset 0vw 0vw 0vw 0.1vw #17e1e6,
0vw 0vw 1.5vw 0vw #17e1e6;
}
}
.eight {
animation: eight 1s 0.875s ease infinite;
-moz-animation: eight 1s 0.875s ease infinite;
/* Firefox */
-webkit-animation: eight 1s 0.875s ease infinite;
/* Safari and Chrome */
-o-animation: eight 1s 0.875s ease infinite;
/* Opera */
}
@keyframes eight {
0%,
100% {
}
50% {
background: ;
box-shadow: inset 0vw 0vw 0vw 0.1vw #17e1e6,
0vw 0vw 1.5vw 0vw #17e1e6;
}
}
.container {
animation: container 5s linear infinite;
-moz-animation: container 5s linear infinite;
/* Firefox */
-webkit-animation: container 5s linear infinite;
/* Safari and Chrome */
-o-animation: container 5s linear infinite;
/* Opera */
}
@keyframes container {
from {
transform: rotate(0deg);
}
to {
transform: rotate(-360deg);
}
}
.progress {
animation: progress 15s ease;
-moz-animation: progress 15s ease;
/* Firefox */
-webkit-animation: progress 15s ease;
/* Safari and Chrome */
-o-animation: progress 15s ease;
/* Opera */
}
@keyframes progress {
0% {
left: -24vw;
}
10% {
left: -20vw;
}
30% {
left: -16vw;
}
50% {
left: -12vw;
}
65% {
left: -10vw;
}
80% {
left: -4vw;
}
100% {
left: 0;
}
}
.fade-in {
animation: fade-in 2s ease;
-moz-animation: fade-in 2s ease;
/* Firefox */
-webkit-animation: fade-in 2s ease;
/* Safari and Chrome */
-o-animation: fade-in 2s ease;
/* Opera */
}
@keyframes fade-in {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.out {
animation: out 2s 15s ease;
-moz-animation: out 2s 15s ease;
/* Firefox */
-webkit-animation: out 2s 15s ease;
/* Safari and Chrome */
-o-animation: out 2s 15s ease;
/* Opera */
}
@keyframes out {
from {
opacity: 1;
}
to {
opacity: 0;
}
}
}
</style>
loadingComponent/index.js
import Vue from 'vue' import Loading from './LoadingComponent.vue' const Mask = Vue.extend(Loading) const toggleLoading = (el, binding) => { if (binding.value) { Vue.nextTick(() => { // 控制loading组件显示 el.instance.visible = true // 插入到目标元素 insertDom(el, el,) }) } else { el.instance.visible = false } } const insertDom = (parent, el) => { parent.appendChild(el.mask) } export default { bind: function (el, binding, vnode) { const mask = new Mask({ el: document.createElement('div'), data () {} }) el.instance = mask el.mask = mask.$el el.maskStyle = {} binding.value && toggleLoading(el, binding) }, update: function (el, binding) { if (binding.oldValue !== binding.value) { toggleLoading(el, binding) } }, unbind: function (el, binding) { el.instance && el.instance.$destroy() } }
import Vue from 'vue'; import Loading from './loadingComponent' export default { install(Vue) { Vue.directive('myLoading', Loading) } }
以上操作完成后再main.js里面引入
main.js
import DirectiveLoading from '@/directive/loading' //权限控制指令 Vue.use( DirectiveLoading )
页面上的使用v-myLoading

效果如下:

具体的模板自己修改为喜欢的样式即可。
今ならできます。
浙公网安备 33010602011771号