2020-01-29 20:37:25 +01:00
|
|
|
<template>
|
2020-02-06 11:11:14 +01:00
|
|
|
<transition-group v-if="$store.state.device.animation"
|
2020-01-29 20:37:25 +01:00
|
|
|
name="staggered-fade"
|
|
|
|
tag="div"
|
|
|
|
:css="false"
|
|
|
|
@before-enter="beforeEnter"
|
|
|
|
@enter="enter"
|
|
|
|
@leave="leave"
|
|
|
|
mode="out-in"
|
|
|
|
appear
|
|
|
|
>
|
|
|
|
<slot></slot>
|
|
|
|
</transition-group>
|
2020-02-06 11:11:14 +01:00
|
|
|
<div v-else>
|
|
|
|
<slot></slot>
|
|
|
|
</div>
|
2020-01-29 20:37:25 +01:00
|
|
|
</template>
|
|
|
|
|
|
|
|
<script lang="ts">
|
|
|
|
import Vue from 'vue';
|
|
|
|
|
|
|
|
export default Vue.extend({
|
|
|
|
props: {
|
|
|
|
delay: {
|
|
|
|
type: Number,
|
|
|
|
required: false,
|
|
|
|
default: 40
|
|
|
|
},
|
|
|
|
direction: {
|
|
|
|
type: String,
|
|
|
|
required: false,
|
|
|
|
default: 'down'
|
2020-02-06 06:23:01 +01:00
|
|
|
},
|
|
|
|
reversed: {
|
|
|
|
type: Boolean,
|
|
|
|
required: false,
|
|
|
|
default: false
|
2020-01-29 20:37:25 +01:00
|
|
|
}
|
|
|
|
},
|
2020-02-06 09:02:32 +01:00
|
|
|
i: 0,
|
2020-01-29 20:37:25 +01:00
|
|
|
methods: {
|
|
|
|
beforeEnter(el) {
|
2020-02-11 16:38:29 +01:00
|
|
|
if (document.hidden) return;
|
|
|
|
|
2020-01-29 20:37:25 +01:00
|
|
|
el.style.opacity = 0;
|
|
|
|
el.style.transform = this.direction === 'down' ? 'translateY(-64px)' : 'translateY(64px)';
|
2020-02-11 16:38:29 +01:00
|
|
|
const delay = this.delay * this.$options.i;
|
2020-02-06 09:02:32 +01:00
|
|
|
el.style.transition = [getComputedStyle(el).transition, `transform 0.7s cubic-bezier(0.23, 1, 0.32, 1) ${delay}ms`, `opacity 0.7s cubic-bezier(0.23, 1, 0.32, 1) ${delay}ms`].filter(x => x != '').join(',');
|
|
|
|
this.$options.i++;
|
2020-02-11 16:38:29 +01:00
|
|
|
|
2020-01-29 20:37:25 +01:00
|
|
|
setTimeout(() => {
|
2020-02-11 19:31:20 +01:00
|
|
|
el.style.transition = null;
|
|
|
|
el.style.transform = null;
|
|
|
|
el.style.opacity = null;
|
2020-02-11 16:38:29 +01:00
|
|
|
this.$options.i--;
|
|
|
|
}, delay + 710);
|
|
|
|
},
|
|
|
|
enter(el) {
|
|
|
|
if (document.hidden) {
|
|
|
|
el.style.opacity = 1;
|
|
|
|
el.style.transform = 'translateY(0px)';
|
|
|
|
return;
|
|
|
|
};
|
|
|
|
|
|
|
|
setTimeout(() => { // 必要
|
2020-01-29 20:37:25 +01:00
|
|
|
el.style.opacity = 1;
|
|
|
|
el.style.transform = 'translateY(0px)';
|
2020-02-06 09:02:32 +01:00
|
|
|
});
|
2020-01-29 20:37:25 +01:00
|
|
|
},
|
2020-02-06 09:02:32 +01:00
|
|
|
leave(el) {
|
2020-02-06 06:55:27 +01:00
|
|
|
el.style.opacity = 0;
|
|
|
|
el.style.transform = this.direction === 'down' ? 'translateY(64px)' : 'translateY(-64px)';
|
2020-01-29 20:37:25 +01:00
|
|
|
},
|
|
|
|
focus() {
|
|
|
|
this.$slots.default[0].elm.focus();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
});
|
|
|
|
</script>
|
|
|
|
|
|
|
|
<style lang="scss">
|
|
|
|
.staggered-fade-move {
|
|
|
|
transition: transform 0.7s !important;
|
|
|
|
}
|
|
|
|
</style>
|