javascript - 过渡中的Vue过渡在错误的地方结束过渡
问题描述
我正在尝试在另一个具有自己的过渡的“父”div 中向子 div 添加过渡,但是子过渡似乎存在问题。
似乎正在发生的事情是子转换与父转换混淆并在错误的位置结束转换。
我想要获得的效果是当单击按钮时,子容器 A(在视图中)向左滑出,而子容器 B 在子容器 A 之后从右侧滑入视图。
我在这里复制了这个问题:https ://codepen.io/BONDJAMES/pen/mdegmMe
如何在切换后将子容器 A 向左滑动,而子容器 B 在子容器 A 之后从右侧滑入视图?
HTML
<div id="app">
<div class="viewBlocks">
<transition name="slide">
<div class="left" v-if="!MaxView">
<div class="subContainer">
<div class="container">
...
</div>
</div>
</div>
</transition>
<transition name="slide">
<div class="right">
<div class="subContainer">
<button @click="toggleBtn">Toggle</button>
Parent DIV
<div class="container">
<transition name="first-slide">
<div v-if="!showMiniB" class="miniContainerA">
<button @click="slideDivs">Slide A out - B In</button>
Child Container A
</div>
</transition>
<transition name="second-slide">
<div v-if="showMiniB" class="miniContainerB">
<button @click="slideDivs">Slide B out - A</button>
Child Container B
</div>
</transition>
</div>
</div>
</div>
</transition>
</div>
</div>
CSS
body {
margin: 0;
}
* {
box-sizing: border-box;
}
.viewBlocks {
display: flex;
}
.viewBlocks > * {
flex: 1 1 0%;
overflow: hidden;
}
.viewBlocks .subContainer {
margin: 10px;
background-color: white;
min-height: 200px;
padding: 1rem;
/* prevent text wrapping during transition? */
min-width: 300px;
}
.viewBlocks .left {
background-color: blue;
}
.viewBlocks .right {
background-color: red;
}
.viewBlocks .container {
background-color: white;
}
.slide-leave-active, .slide-enter-active {
transition: 1s cubic-bezier(0.5, 0, 0.3, 1);
}
.slide-leave-to, .slide-enter {
flex-grow: 0;
}
.miniContainerA{
border: green 3px solid;
text-align: center;
height: 60px
}
.miniContainerB{
border: pink 3px solid;
text-align: center;
height: 60px
}
.first-slide-enter {
opacity: 0;
transform: translatex(-100%);
transition: all 0.7s ease-out;
}
.first-slide-enter-to {
opacity: 1;
transform: translatex(0);
transition: all 0.7s ease-out;
}
.first-slide-leave-to {
opacity: 0;
transform: translatex(-100%);
transition: all 0.7s ease-out;
}
.second-slide-enter {
opacity: 0;
transform: translatex(0);
transition: all 0.7s ease-out;
}
.second-slide-enter-to {
opacity: 1;
transform: translatex(-100%);
transition: all 0.7s ease-out;
}
.second-slide-leave-to {
opacity: 0;
transform: translatex(0);
transition: all 0.7s ease-out;
}
.second-slide-leave {
transform: translatex(-100%);
}
VUE
var app = new Vue({
el: '#app',
data: () => ({
MaxView: false,
showMiniB: false
}),
methods: {
toggleBtn(){
this.MaxView = !this.MaxView
},
slideDivs(){
this.showMiniB = !this.showMiniB
}
}
})
解决方案
只是稍微调整一下css
对于miniContainerA
和miniContainerB
(在下面的示例中仅使用 div),您需要锚定到顶部。您可以通过将父对象定位为absolute
和子对象 (miniContainers)来做到这一点relative
.viewBlocks .container {
background-color: white;
position: relative;
top: 0;
}
.viewBlocks .container div{
background-color: yellow;
position: absolute;
top: 0;
left:0;
width:100%;
}
然后调整您的转换百分比(将 100% 添加到您的 translatex 值)
.second-slide-enter {
opacity: 0;
transform: translatex(100%);
transition: all 0.7s ease-out;
}
.second-slide-enter-to {
opacity: 1;
transform: translatex(0%);
transition: all 0.7s ease-out;
}
.second-slide-leave-to {
opacity: 0;
transform: translatex(100%);
transition: all 0.7s ease-out;
}
.second-slide-leave {
transform: translatex(0%);
}
推荐阅读
- python - python 3.8中的singledispatchmethod和类方法装饰器
- ubuntu - Nginx 不显示 ServerBlocks
- spring-boot - 在 Spring Boot 中禁用 CSRF 的原因
- node.js - Monkey 修补节点 js bunyan 日志记录
- python - 如何打印在任何行中找不到的值?
- azure - 使用 .NET SDK 获取给定 Azure 区域中的所有可用 Kubernetes 版本
- tensorflow - tensorflow_core._api.v2.random 没有属性 Generator
- node.js - 如果依赖项已经加载,Sinon 存根不会改变行为
- discord.js - 如何在没有命令召唤的情况下设置权限?
- python - Python3读取文件并将具有int值的二维数组放置一行