【问题标题】:Vuejs back and forth transition skipping ahead to last frame on backVuejs来回过渡跳到后面的最后一帧
【发布时间】:2019-01-22 23:27:49
【问题描述】:

我正在创建一个仅包含 2 个项目的滑块元素。当我单击返回/下一步时,我希望它们能够顺畅地左右滑动。单击下一步时效果很好,元素滚动和淡出,但是当我单击返回时,无论我做什么,第一个元素都会及时跳转,这个 gif 更直观地解释了一点:

编辑:这是一个小提琴 - http://jsfiddle.net/eywraw8t/273583/

这是我的 CSS:

.first-slide-enter{
  opacity: 0;
  transform: translatex(-100%);
  transition: all 1.5s ease-out;
}
.first-slide-enter-to{
  opacity: 1;
  transform: translatex(0);
  transition: all 1.5s ease-out;
}
.first-slide-leave-to{
    opacity: 0;
    transform: translatex(-100%);
    transition: all 1.5s ease-out;
}


.second-slide-enter{
  opacity: 0;
  transform: translatex(0);
  transition: all 1.5s ease-out;
}
.second-slide-enter-to{
    opacity: 1;
    transform: translatex(-100%);
    transition: all 1.5s ease-out;
}
.second-slide-leave-to{
    opacity: 0;
    transform: translatex(0);
    transition: all 1.5s ease-out;
}

这是我的html:

        <transition name="first-slide">
            <div v-if="!newShortcut.link">

                <div id="drop-shortcut" class="drag-file clickable" @click="addShortcut">
                    <i class="fas fa-file-upload fa-lg"></i>
                    <p style="margin:20px 0 0;">Drag file here
                        <br> or click to browse</p>
                </div>                      
                <div>
                        <button @click="newShortcut.link = !newShortcut.link">Next</button>
                </div>

            </div>
        </transition>

        <transition name="second-slide">
            <div v-if="newShortcut.link">
                <div id="drop-icon" class="drag-file" @click="">
                    <i class="far fa-file-image fa-lg"></i>
                    <p style="margin:20px 0 0;">Drag file here
                        <br> or click to browse</p>
                </div>
                <div>
                    <button @click="newShortcut.link = !newShortcut.link">back</button>
                </div>
            </div>
        </transition>

如何做到这一点?

【问题讨论】:

标签: javascript vue.js vuejs2


【解决方案1】:

所以@Julian 对于阻塞问题是正确的,但还有另一种方法可以解决它,它可能对你更有效。看到这个小提琴:http://jsfiddle.net/xcmn76Lo/

基本上需要对第二张幻灯片进行一些调整。您可以使用类似于enter 的钩子来指定它从哪里开始离开。在这种情况下,由于其他 div 会立即保留其空间,因此您需要适当地启动离开过渡偏移。

.second-slide-leave{
  transform:translatex(-100%);
}

然后,将leave-to 设置为 0(也就是如果被传入的 div 移到它会结束的位置),而不是转换为 100%。

.second-slide-leave-to{
    opacity: 0;
    transform: translatex(0);
    transition: all 1.5s ease-out;
}

【讨论】:

  • 哇,它有效!我以前试过这个,但我把“过渡:所有 1.5 秒缓出;” .second-slide-leave 中的属性也是如此,然后将其破坏。任何想法为什么?
  • 这是因为它本质上是在努力让回到到它开始的位置,同时它会用它来动画化自己。如果在.second-slide-leave 上将其设置为transition: all .2s ease-out;,您可以看到效果。它“抽搐”了一下自己。但是如果你没有在它上面添加过渡,它会立即将自己捕捉到你想要的偏移位置。
【解决方案2】:

问题在于您的元素的显示方式。每张幻灯片都是一个block,因此它会在您的布局中占据一个空间。

因此,当您在第二张幻灯片上并单击后退按钮时。 在此之前发生的情况是,布局中没有幻灯片 1,当 vue 开始将幻灯片 1 插入时,它占用了一个空间,导致第二张幻灯片突然从左跳到右。

因此,要解决该问题,您可以将每张幻灯片的位置设置为 absolute,这样如果它们被插入回来,它们就不会导致这种行为,因为 absolute 的位置不会影响它的相邻元素的位置,这与 relative 不同位置。

#app>div {
  position: absolute;
  height: 200px;
  width: 200px;
  text-align: center;
  left: 0;
  top: 0;
}

并稍微更新第二张幻灯片的 css 过渡:

.second-slide-enter {
  opacity: 0;
  transform: translatex(100%);
  transition: all 1.5s ease-out;
}

.second-slide-enter-to {
  opacity: 1;
  transform: translatex(0);
  transition: all 1.5s ease-out;
}

.second-slide-leave-to {
  opacity: 0;
  transform: translatex(100%);
  transition: all 1.5s ease-out;
}

这是完整的 JS Fiddle:http://jsfiddle.net/eywraw8t/273631/

【讨论】:

  • 似乎有效,但由于父级是固定的,在我的网站上它需要 0 高度,因为所有子级都是绝对定位的。关于如何在不使用绝对值的情况下执行此操作的任何想法?
  • 顺便说一句,即使它不是绝对的,它也应该以 transformx(-100%) 开始离开,所以即使其他元素正在取代它,它仍然会在那里,对吧?跨度>
  • 不,translateX 实际上并没有“从字面上”移动你的元素。我的意思是,盒子占据的空间仍然在同一个空间上,即使它看起来像是在最左边。您只能通过使用left 而不是'transform: translateX' 来实现true 对位置的更改。当您还使用lefttoprightbottom 时,您需要将元素的position 属性设置为relativefixedabsolute 等。 .. 让它发挥作用。
  • 您最好的选择是使用position,但您需要专门设置容器的高度。
  • @JulianPaoloDayag 看到我的回答,你应该能够抵消动画的开始,它应该可以正常工作。
猜你喜欢
  • 2020-01-14
  • 2017-04-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-10
  • 2018-09-30
  • 2015-01-20
  • 1970-01-01
相关资源
最近更新 更多