Skip to content

Instantly share code, notes, and snippets.

@dochner
Created January 1, 2023 20:47
Show Gist options
  • Save dochner/7d025a015b159891ab953835b7ad1022 to your computer and use it in GitHub Desktop.
Save dochner/7d025a015b159891ab953835b7ad1022 to your computer and use it in GitHub Desktop.
vue-expand-transition-component
<script setup>
const beforeEnter = (element) => {
requestAnimationFrame(() => {
if (!element.style.height) {
element.style.height = '0px';
}
element.style.display = null;
});
}
const enter = (element) => {
requestAnimationFrame(() => {
requestAnimationFrame(() => {
element.style.height = `${element.scrollHeight}px`;
});
});
}
const afterEnter = (element) => {
element.style.height = null;
}
const beforeLeave = (element) => {
requestAnimationFrame(() => {
if (!element.style.height) {
element.style.height = `${element.offsetHeight}px`;
}
});
}
const leave = (element) => {
requestAnimationFrame(() => {
requestAnimationFrame(() => {
element.style.height = '0px';
});
});
}
const afterLeave = (element) => {
element.style.height = null;
}
</script>
<template>
<transition
enter-active-class="enter-active"
leave-active-class="leave-active"
@before-enter="beforeEnter"
@enter="enter"
@after-enter="afterEnter"
@before-leave="beforeLeave"
@leave="leave"
@after-leave="afterLeave"
>
<slot />
</transition>
</template>
<style scoped>
.enter-active,
.leave-active {
overflow: hidden;
transition: height .5s linear;
}
</style>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment