5 changed files with 120 additions and 37 deletions
@ -1,29 +1,16 @@ |
|||
import type { PropType } from 'vue'; |
|||
|
|||
// collapse 展开折叠
|
|||
import { defineComponent } from 'vue'; |
|||
import { getSlot } from '/@/utils/helper/tsxHelper'; |
|||
import { createJavascriptTransition } from './CreateTransition'; |
|||
import ExpandTransitionGenerator from './ExpandTransition'; |
|||
// import { createJavascriptTransition } from './CreateTransition';
|
|||
import ExpandTransition from './ExpandTransition.vue'; |
|||
|
|||
export const ExpandTransition = createJavascriptTransition( |
|||
'expand-transition', |
|||
ExpandTransitionGenerator() |
|||
); |
|||
// export const ExpandTransition = createJavascriptTransition(
|
|||
// 'expand-transition',
|
|||
// ExpandTransitionGenerator()
|
|||
// );
|
|||
export default defineComponent({ |
|||
name: 'CollapseTransition', |
|||
components: { |
|||
ExpandTransition, |
|||
}, |
|||
props: { |
|||
// 是否打开折叠功能
|
|||
enable: { |
|||
type: Boolean as PropType<boolean>, |
|||
default: true, |
|||
}, |
|||
}, |
|||
setup(props, { slots }) { |
|||
return () => |
|||
props.enable ? <ExpandTransition>{() => getSlot(slots)}</ExpandTransition> : getSlot(slots); |
|||
setup(_, { slots }) { |
|||
return () => <ExpandTransition>{() => getSlot(slots)}</ExpandTransition>; |
|||
}, |
|||
}); |
|||
|
|||
@ -0,0 +1,85 @@ |
|||
<template> |
|||
<transition v-on="on"> |
|||
<slot></slot> |
|||
</transition> |
|||
</template> |
|||
<script lang="ts"> |
|||
import { addClass, removeClass } from '/@/utils/domUtils'; |
|||
import { defineComponent } from 'vue'; |
|||
export default defineComponent({ |
|||
name: 'CollapseTransition', |
|||
setup() { |
|||
return { |
|||
on: { |
|||
beforeEnter(el: any) { |
|||
addClass(el, 'collapse-transition'); |
|||
if (!el.dataset) el.dataset = {}; |
|||
|
|||
el.dataset.oldPaddingTop = el.style.paddingTop; |
|||
el.dataset.oldPaddingBottom = el.style.paddingBottom; |
|||
|
|||
el.style.height = '0'; |
|||
el.style.paddingTop = 0; |
|||
el.style.paddingBottom = 0; |
|||
}, |
|||
|
|||
enter(el: any) { |
|||
el.dataset.oldOverflow = el.style.overflow; |
|||
if (el.scrollHeight !== 0) { |
|||
el.style.height = el.scrollHeight + 'px'; |
|||
el.style.paddingTop = el.dataset.oldPaddingTop; |
|||
el.style.paddingBottom = el.dataset.oldPaddingBottom; |
|||
} else { |
|||
el.style.height = ''; |
|||
el.style.paddingTop = el.dataset.oldPaddingTop; |
|||
el.style.paddingBottom = el.dataset.oldPaddingBottom; |
|||
} |
|||
|
|||
el.style.overflow = 'hidden'; |
|||
}, |
|||
|
|||
afterEnter(el: any) { |
|||
// for safari: remove class then reset height is necessary |
|||
removeClass(el, 'collapse-transition'); |
|||
el.style.height = ''; |
|||
el.style.overflow = el.dataset.oldOverflow; |
|||
}, |
|||
|
|||
beforeLeave(el: any) { |
|||
if (!el.dataset) el.dataset = {}; |
|||
el.dataset.oldPaddingTop = el.style.paddingTop; |
|||
el.dataset.oldPaddingBottom = el.style.paddingBottom; |
|||
el.dataset.oldOverflow = el.style.overflow; |
|||
|
|||
el.style.height = el.scrollHeight + 'px'; |
|||
el.style.overflow = 'hidden'; |
|||
}, |
|||
|
|||
leave(el: any) { |
|||
if (el.scrollHeight !== 0) { |
|||
// for safari: add class after set height, or it will jump to zero height suddenly, weired |
|||
addClass(el, 'collapse-transition'); |
|||
el.style.height = 0; |
|||
el.style.paddingTop = 0; |
|||
el.style.paddingBottom = 0; |
|||
} |
|||
}, |
|||
|
|||
afterLeave(el: any) { |
|||
removeClass(el, 'collapse-transition'); |
|||
el.style.height = ''; |
|||
el.style.overflow = el.dataset.oldOverflow; |
|||
el.style.paddingTop = el.dataset.oldPaddingTop; |
|||
el.style.paddingBottom = el.dataset.oldPaddingBottom; |
|||
}, |
|||
}, |
|||
}; |
|||
}, |
|||
}); |
|||
</script> |
|||
<style lang="less" scoped> |
|||
.collapse-transition { |
|||
transition: 0.2s height ease-in-out, 0.2s padding-top ease-in-out, |
|||
0.2s padding-bottom ease-in-out; |
|||
} |
|||
</style> |
|||
Loading…
Reference in new issue