考虑到动态内容的高度,使用vue过渡平滑扩展/折叠过渡

时间:2019-03-04 10:19:46

标签: javascript css vue.js vuejs2 transition

我在使用vue转换时遇到了一些麻烦,也许你们中的一些人可以帮助我?我想实现的是一个使用vue转换的简单,轻巧的折叠组件。

因此,在我目前的方法中,每次塌陷塌陷时,应将其高度设置为contentHeight,然后紧随其后设置为0(以及展开时的相反方向)。或在Vue Transition的JavaScript挂钩中说:

  • 输入前:将高度设置为0
  • 输入:将高度设置为contentHeight
  • 输入后:将高度设置为auto
  • 离开前:将高度设置为contentHeight
  • 离开:将高度设置为0

这是当前的方法:

<template>
  <transition
    @before-enter="beforeEnter"
    @enter="enter"
    @after-enter="afterEnter"
    @before-leave="beforeLeave"
    @leave="leave"
    @after-leave="afterLeave"
  >
    <div
      v-if="isCollapsed === false"
      :style="componentStyles"
      class="UiCollapse"
    >
      <div 
        ref="content"
        class="UiCollapse-content"
      >
        <slot/>
      </div>
    </div>
  </transition>
</template>

<script>
export default {
  name: "UiCollapse",

  props: {
    isCollapsed: {
      type: Boolean,
      default: false
    }
  },

  data() {
    return {
      componentStyles: {
        height: undefined
      }
    };
  },

  methods: {
    beforeEnter() {
      this.setHeight(0);
    },

    enter() {
      this.setHeight(this.getContentHeight());
    },

    afterEnter() {
      this.setHeight(undefined);
    },

    beforeLeave() {
      this.setHeight(this.getContentHeight());
    },

    leave() {
      this.setHeight(0);
    },

    afterLeave() {
      this.setHeight(0);
    },

    setHeight(height) {
      this.componentStyles.height = height;
    },

    getContentHeight() {
      return this.$refs.content.scrollHeight + "px";
    }
  }
};
</script>

<style scoped>
.UiCollapse {
  display: block;
  height: auto;
  overflow: hidden;
}

.UiCollapse.v-enter-active,
.UiCollapse.v-leave-active {
  transition: height 0.3s ease;
}

.UiCollapse-content {
  display: block;
}
</style>

通过这种方法,应该考虑内容的动态高度以及影响其高度的内容更改。

我还将其转移到了一个codeandbox:https://codesandbox.io/s/yq1nw51yq9

在这里我期望的是平滑的打开和关闭过渡(在CSS中定义),但是正如您在该项目中看到的那样,这仅部分起作用,我不明白为什么。你们有任何想法吗?

也许这不是正确的方法,我对其他方法或已经存在的库都持开放态度(尽管我更愿意在这里理解vue转换),但是到目前为止,我发现的解决方案是使用{{1 }}或其他我想避免的解决方法。

在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

那扩展面板组件呢?我不确定您真正想做什么,但这至少可以帮助您。 https://vuetifyjs.com/en/components/expansion-panels