From c5e5aadfc5e5b87f92a3eaed074db8fce5e33513 Mon Sep 17 00:00:00 2001 From: syuilo <Syuilotan@yahoo.co.jp> Date: Sat, 8 Feb 2020 14:31:51 +0900 Subject: [PATCH] :art: --- src/client/components/ui/container.vue | 51 ++++++++++++++++++++++++-- 1 file changed, 47 insertions(+), 4 deletions(-) diff --git a/src/client/components/ui/container.vue b/src/client/components/ui/container.vue index 19820a307..66f55102b 100644 --- a/src/client/components/ui/container.vue +++ b/src/client/components/ui/container.vue @@ -8,9 +8,18 @@ <template v-else><fa :icon="faAngleDown"/></template> </button> </header> - <div v-show="showBody"> - <slot></slot> - </div> + <transition name="container-toggle" + @before-enter="beforeEnter" + @enter="enter" + @after-enter="afterEnter" + @before-leave="beforeLeave" + @leave="leave" + @after-leave="afterLeave" + > + <div v-show="showBody"> + <slot></slot> + </div> + </transition> </div> </template> @@ -51,12 +60,45 @@ export default Vue.extend({ toggleContent(show: boolean) { if (!this.bodyTogglable) return; this.showBody = show; - } + }, + + beforeEnter(el) { + el.style.height = '0'; + }, + enter(el) { + setTimeout(() => { + el.style.height = el.scrollHeight + 'px'; + }, 10); // HACKY: Vueのバグか知らないけどこうしないと動作しない + }, + afterEnter(el) { + el.style.height = 'auto'; + }, + beforeLeave(el) { + el.style.height = el.scrollHeight + 'px'; + }, + leave(el) { + setTimeout(() => { + el.style.height = '0'; + }, 10); // HACKY: Vueのバグか知らないけどこうしないと動作しない + }, + afterLeave(el) { + el.style.height = 'auto'; + }, } }); </script> <style lang="scss" scoped> +.container-toggle-enter-active, .container-toggle-leave-active { + transition: opacity 0.5s, height 0.5s !important; +} +.container-toggle-enter { + opacity: 0; +} +.container-toggle-leave-to { + opacity: 0; +} + .ukygtjoj { position: relative; overflow: hidden; @@ -72,6 +114,7 @@ export default Vue.extend({ > header { position: relative; + box-shadow: 0 1px 0 0 var(--divider); > .title { margin: 0;