collapse.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. const elTransition =
  2. "0.3s height ease-in-out, 0.3s padding-top ease-in-out, 0.3s padding-bottom ease-in-out";
  3. const Transition = {
  4. "before-enter"(el) {
  5. el.style.transition = elTransition;
  6. if (!el.dataset) el.dataset = {};
  7. el.dataset.oldPaddingTop = el.style.paddingTop;
  8. el.dataset.oldPaddingBottom = el.style.paddingBottom;
  9. el.style.height = 0;
  10. el.style.paddingTop = 0;
  11. el.style.paddingBottom = 0;
  12. },
  13. enter(el) {
  14. el.dataset.oldOverflow = el.style.overflow;
  15. if (el.scrollHeight !== 0) {
  16. el.style.height = el.scrollHeight + "px";
  17. el.style.paddingTop = el.dataset.oldPaddingTop;
  18. el.style.paddingBottom = el.dataset.oldPaddingBottom;
  19. } else {
  20. el.style.height = "";
  21. el.style.paddingTop = el.dataset.oldPaddingTop;
  22. el.style.paddingBottom = el.dataset.oldPaddingBottom;
  23. }
  24. el.style.overflow = "hidden";
  25. },
  26. "after-enter"(el) {
  27. el.style.transition = "";
  28. el.style.height = "";
  29. el.style.overflow = el.dataset.oldOverflow;
  30. },
  31. "before-leave"(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. el.style.transition = elTransition;
  42. el.style.height = 0;
  43. el.style.paddingTop = 0;
  44. el.style.paddingBottom = 0;
  45. }
  46. },
  47. "after-leave"(el) {
  48. el.style.transition = "";
  49. el.style.height = "";
  50. el.style.overflow = el.dataset.oldOverflow;
  51. el.style.paddingTop = el.dataset.oldPaddingTop;
  52. el.style.paddingBottom = el.dataset.oldPaddingBottom;
  53. }
  54. };
  55. export default {
  56. name: "collapseTransition",
  57. functional: true,
  58. render(h, { children }) {
  59. const data = {
  60. on: Transition
  61. };
  62. return h("transition", data, children);
  63. }
  64. };