Vue / CSS,如何在两个交替元素之间进行平滑的高度过渡(包括小提琴)

时间:2017-07-16 12:42:06

标签: css vue.js flexbox css-transitions

我正在尝试制作两个在相反的v-show谓词上交替的元素,以便在高度方面进行转换,但我无法为此找到一个好的解决方案。 这可能有点基本,但我对过渡/动画缺乏经验,我找不到任何好的例子来指导我。

HTML:

<div id="app">

  <div class="history">
    <p>
    How to make the green bordered area transition smoothly between different height in states A and B?
    </p>
    <div class="placeholder-content">
    </div>
  </div>

  <div class="interaction">
    <button @click="(show_A ? show_A = false : show_A = true);">
      Cycle states
    </button>

    <transition name="swap">
    <div v-show="show_A" class="interaction-A"> A </div>
    </transition>

    <transition name="swap">
    <div v-show="!show_A" class="interaction-B"> B </div>
    </transition>

  </div>
</div>

CSS:

.swap-enter{
}
.swap-leave-to{
}
.swap-enter-active{
}
.swap-leave-active{
}
.swap-move{
}

我用小提琴制定了这个问题:

https://fiddle.jshell.net/jensmtg/7zun5c9f/

1 个答案:

答案 0 :(得分:1)

您的代码中存在一些严重错误。

首先,您需要使用一个过渡元素,而不是两个,因为您希望过渡元素发生 IN ,而不是 ACROSS 多个过渡元素,即使它涉及它们。

HTML:

@app.route('/', methods=['GET','POST'])
def index():
    if request.method == 'POST': #If there is an input from form
        CurtainOpenTime = request.form['CurtainOpenTime'] #Assign CurtainOpenTime variable in python to the html CurtainOpenTime variable.
        CurtainCloseTime = request.form['CurtainCloseTime'] #Assign CurtainCloseTime variable in python to the html CurtainCloseTime variable.

    return render_template('Index.html',  CCT=CurtainCloseTime)

其次,您需要将<div class="interaction" v-bind:class="{ show_B: !show_A }"> <button @click="(show_A ? show_A = false : show_A = true);"> Cycle states </button> <transition name="fade"> <div v-if="show_A" class="interaction-A" key="a"> A </div> <div v-else class="interaction-B" key="b"> B </div> </transition> </div> 属性应用于要使用唯一键转换的每个元素,以便Vue识别它们是不同的。

我已清理您的代码并使用keyv-if来确保元素被拆除。

最后,使用淡入淡出过渡为您提供了一个很好的平滑变化,可以解释高度差异。

CSS:

v-else

为了在转换内部元素时平滑过渡外部容器,在切换内容时应用类.interaction { border: 10px solid lightgreen; display: flex; flex: 1 0 auto; max-height: 225px; transition: max-height 0.25s ease-out; } .interaction.show_B { max-height: 325px; transition: max-height 0.15s ease-in; } .fade-enter-active, .fade-leave-active { transition-property: opacity; transition-duration: .10s; } .fade-enter-active { transition-delay: .25s; } .fade-enter, .fade-leave-active { opacity: 0; } 以区分show_BA子内容。

B

我们可以使用它来应用转换和新的最大尺寸,在子内容调整大小时调整外部内容的大小:

<div class="interaction" v-bind:class="{ show_B: !show_A }">

你可以看到工作小提琴here