collapse-transition.js 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. import { addClass, removeClass } from 'element-ui/src/utils/dom';
  2. class Transition {
  3. beforeEnter(el) {
  4. addClass(el, 'collapse-transition');
  5. if (!el.dataset) el.dataset = {};
  6. el.dataset.oldPaddingTop = el.style.paddingTop;
  7. el.dataset.oldPaddingBottom = el.style.paddingBottom;
  8. el.style.height = '0';
  9. el.style.paddingTop = 0;
  10. el.style.paddingBottom = 0;
  11. }
  12. enter(el) {
  13. el.dataset.oldOverflow = el.style.overflow;
  14. if (el.scrollHeight !== 0) {
  15. el.style.height = el.scrollHeight + 'px';
  16. el.style.paddingTop = el.dataset.oldPaddingTop;
  17. el.style.paddingBottom = el.dataset.oldPaddingBottom;
  18. } else {
  19. el.style.height = '';
  20. el.style.paddingTop = el.dataset.oldPaddingTop;
  21. el.style.paddingBottom = el.dataset.oldPaddingBottom;
  22. }
  23. el.style.overflow = 'hidden';
  24. }
  25. afterEnter(el) {
  26. // for safari: remove class then reset height is necessary
  27. removeClass(el, 'collapse-transition');
  28. el.style.height = '';
  29. el.style.overflow = el.dataset.oldOverflow;
  30. }
  31. beforeLeave(el) {
  32. if (!el.dataset) el.dataset = {};
  33. el.dataset.oldPaddingTop = el.style.paddingTop;
  34. el.dataset.oldPaddingBottom = el.style.paddingBottom;
  35. el.dataset.oldOverflow = el.style.overflow;
  36. el.style.height = el.scrollHeight + 'px';
  37. el.style.overflow = 'hidden';
  38. }
  39. leave(el) {
  40. if (el.scrollHeight !== 0) {
  41. // for safari: add class after set height, or it will jump to zero height suddenly, weired
  42. addClass(el, 'collapse-transition');
  43. el.style.height = 0;
  44. el.style.paddingTop = 0;
  45. el.style.paddingBottom = 0;
  46. }
  47. }
  48. afterLeave(el) {
  49. removeClass(el, 'collapse-transition');
  50. el.style.height = '';
  51. el.style.overflow = el.dataset.oldOverflow;
  52. el.style.paddingTop = el.dataset.oldPaddingTop;
  53. el.style.paddingBottom = el.dataset.oldPaddingBottom;
  54. }
  55. }
  56. export default {
  57. name: 'ElCollapseTransition',
  58. functional: true,
  59. render(h, { children }) {
  60. const data = {
  61. on: new Transition()
  62. };
  63. return h('transition', data, children);
  64. }
  65. };