【发布时间】:2018-10-22 23:28:10
【问题描述】:
我有一个垂直的项目列表,每个项目都可以删除。我将我的项目放在一个过渡组中,并为它们创建了简单的不透明度和变换过渡。已移除元素上的转换按预期工作,但是如果我移除一个未放置在底部的元素,则下方的元素只会跳起来并在没有任何转换的情况下取代它。我找不到针对这种行为的方法。 我想要的只是下面的元素平滑地向上滑动。
有没有什么办法可以通过使用 css transitipms 和 Vue 的动画钩子来实现这个效果?
这是一个演示:https://jsfiddle.net/gcp18nq0/
模板:
<div id="app">
<div class="form">
<label for="name">Name</label>
<input type="text" id="name" v-model="name">
<button @click="addPlayer">Add player</button>
</div>
<div class="players">
<transition-group name="player">
<div class="panel" v-for="player in players" :key="player.id">
<h2>
{{ player.name}}
<span class="remove" @click="removePlayer(player.id)">Remove</span>
</h2>
</div>
</transition-group>
</div>
</div>
脚本:
data() {
return {
name: "",
players: [
{id: 1, name: 'Player1'},
{id: 2, name: 'Player2'},
{id: 3, name: 'Player3'},
]
}
},
methods: {
addPlayer: function () {
//,,,,
},
removePlayer: function (playerId) {
//...
}
}
});
CSS
.form {
margin:0 auto;
width:400px;
}
.panel {
width: 400px;
margin: 10px auto;
overflow: hidden;
border: 1px solid;
text-align: center;
}
.remove {
float: right;
cursor: pointer;
text-decoration: underline;
font-size: 12px;
vertical-align: bottom
}
.player-enter,
.player-leave-to
/* .fade-leave-active below version 2.1.8 */
{
opacity: 0;
}
.player-enter {
transform: translateY(30%);
}
.player-leave-to {
transform: translateX(30%);
}
.player-enter-active,
.player-leave-active {
transition: all 1.5s;
}
.player-move {
transition: all 1.5s;
}
我发现的唯一工作方式是在“player-leave-active”状态下添加 position:absolute,但由于元素折叠,它会改变其垂直位置,这不是预期的效果。我也尝试改变高度,但是在高度设置为 0 后,下面的元素仍然会向上跳跃一点。 我确信这可以通过 jQuery 轻松实现,但我相信应该有一种方法可以在没有 js 的情况下做到这一点。
提前感谢您!
附言这是我在这里的第一篇文章,所以我希望它解释得足够清楚。
【问题讨论】:
标签: javascript css vue.js vuejs2