Fixed #346 - Improve Galleria animation on FullScreen mode

pull/347/head
mertsincan 2020-06-18 15:53:49 +03:00
parent c48a8653e7
commit 8c7aa7e916
1 changed files with 67 additions and 17 deletions

View File

@ -1,6 +1,8 @@
<template> <template>
<div v-if="fullScreen && visible" ref="mask" :class="maskContentClass"> <div v-if="fullScreen && (maskVisible || visible)" ref="mask" :class="maskContentClass">
<GalleriaContent v-bind="$props" @maskHide="maskHide" :templates="$scopedSlots" @activeItemChange="onActiveItemChange" /> <transition name="p-galleria" @enter="onEnter" @before-leave="onBeforeLeave" @after-leave="onAfterLeave" @appear="onAppear">
<GalleriaContent v-if="visible" v-bind="$props" @maskHide="maskHide" :templates="$scopedSlots" @activeItemChange="onActiveItemChange" />
</transition>
</div> </div>
<GalleriaContent v-else-if="!fullScreen" v-bind="$props" :templates="$scopedSlots" @activeItemChange="onActiveItemChange" /> <GalleriaContent v-else-if="!fullScreen" v-bind="$props" :templates="$scopedSlots" @activeItemChange="onActiveItemChange" />
@ -110,20 +112,16 @@ export default {
default: null default: null
} }
}, },
data() {
return {
maskVisible: this.visible
}
},
updated() { updated() {
this.removeStylesFromMask(); this.removeStylesFromMask();
if (this.fullScreen) { if (this.fullScreen && this.visible && !this.maskVisible) {
if (this.visible) { this.maskVisible = true;
DomHandler.addClass(document.body, 'p-overflow-hidden');
if (this.$refs.mask) {
this.$refs.mask.style.zIndex = String(this.baseZIndex + DomHandler.generateZIndex());
}
}
else {
DomHandler.removeClass(document.body, 'p-overflow-hidden');
}
} }
}, },
mounted() { mounted() {
@ -135,6 +133,26 @@ export default {
} }
}, },
methods: { methods: {
onEnter() {
this.$refs.mask.style.zIndex = String(this.baseZIndex + DomHandler.generateZIndex());
DomHandler.addClass(document.body, 'p-overflow-hidden');
},
onBeforeLeave() {
DomHandler.addClass(this.$refs.mask, 'p-galleria-mask-leave');
},
onAfterLeave() {
this.maskVisible = false;
DomHandler.removeClass(document.body, 'p-overflow-hidden');
},
onAppear() {
if (this.visible) {
this.onEnter();
setTimeout(() => {
DomHandler.addClass(this.$refs.mask, 'p-component-overlay');
}, 1);
}
},
onActiveItemChange(index) { onActiveItemChange(index) {
if (this.activeIndex !== index) { if (this.activeIndex !== index) {
this.$emit('update:activeIndex', index); this.$emit('update:activeIndex', index);
@ -154,14 +172,14 @@ export default {
this.galleriaClasses = this.$vnode.data.class || this.$vnode.data.staticClass; this.galleriaClasses = this.$vnode.data.class || this.$vnode.data.staticClass;
if (this.galleriaClasses) { if (this.galleriaClasses) {
this.$refs.mask.classList = 'p-galleria-mask p-component-overlay' + (this.visible && ' p-galleria-visible'); this.$refs.mask.classList = 'p-galleria-mask' + (this.visible && ' p-galleria-visible');
} }
} }
} }
}, },
computed: { computed: {
maskContentClass() { maskContentClass() {
return ['p-galleria-mask p-component-overlay', { return ['p-galleria-mask', {
'p-galleria-visible': this.visible 'p-galleria-visible': this.visible
}, this.maskClass]; }, this.maskClass];
} }
@ -285,10 +303,13 @@ export default {
justify-content: center; justify-content: center;
cursor: pointer; cursor: pointer;
opacity: .5; opacity: .5;
}
.p-galleria-thumbnail-item:hover {
opacity: 1;
transition: opacity .3s; transition: opacity .3s;
} }
.p-galleria-thumbnail-item:hover,
.p-galleria-thumbnail-item-current { .p-galleria-thumbnail-item-current {
opacity: 1; opacity: 1;
} }
@ -395,10 +416,16 @@ export default {
/* FullScreen */ /* FullScreen */
.p-galleria-mask { .p-galleria-mask {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
position: fixed; background-color: transparent;
transition-property: background-color;
} }
.p-galleria-close { .p-galleria-close {
@ -416,6 +443,29 @@ export default {
margin-top: -.5rem; margin-top: -.5rem;
} }
/* Animation */
.p-galleria-enter-active {
transition: all 150ms cubic-bezier(0, 0, 0.2, 1);
}
.p-galleria-leave-active {
transition: all 150ms cubic-bezier(0.4, 0.0, 0.2, 1);
}
.p-galleria-enter,
.p-galleria-leave-to {
opacity: 0;
transform: scale(0.7);
}
.p-galleria-enter-active .p-galleria-item-nav {
opacity: 0;
}
.p-galleria-mask.p-galleria-mask-leave {
background-color: transparent;
}
/* Keyboard Support */ /* Keyboard Support */
.p-items-hidden .p-galleria-thumbnail-item { .p-items-hidden .p-galleria-thumbnail-item {
visibility: hidden; visibility: hidden;