我有两个元素,顶部元素的可见性由一个简单布尔值上的v-if控制.

transition(name="fade")
    #element1(v-if="showFirst")
        p Foo

#element2
    p Bar

第一个元素被包装在<transition>标签中,与Vue documentation标签完全相同.

然而,虽然这确实会创建一个渐弱的动画,但页面上的其他内容仍然跳得非常刺耳.

我如何才能创建一个过渡,也将顺利地改变任何和所有sibling 姐妹的地位,跟随?

fiddle人演示了这个问题.

推荐答案

您需要使用transition-group键,并输入动态div和静态div

<transition-group name="fade">
  <div v-if="switc" key="dynamic" class="animated">
     ...
  </div>
  <div key="main-content" class="animated">
     ...
  </div>
</transition-group>

并使用这个css类

.fade-enter,
.fade-leave-active {
    opacity: 0;
    transform: translateY(-10px);
}
.fade-leave-active {
    position: absolute;
}

.animated {
  transition: all 0.5s;
  /*display: flex;*/
  width: 100%;
}

真正的诀窍是在离开时将position改为absolute,然后任何其他内容都可以占据正确的位置.

要了解更多有关Vue如何制作动画的信息,请参阅本FLIP explanation post

请看这把小提琴

Edit

我错误地在.animated类中设置了display: flex;,这导致每个内部元素都以一种奇怪的方式呈现.

现在,我完全删除了.animate类,而将transition: all 0.5swidth:100%应用于.wrapper的每个直接内部元素

我的最终SCS如下所示:

.wrapper {
  display: flex;
  flex-direction: column;
  >* {
    transition: all 0.5s;
    width:100%;
  };
}

.fade-enter,
.fade-leave-active {
  opacity: 0;
  transform: translateY(-10px);
}

.fade-leave-active {
  position: absolute;
}

Flex布局是一个扩展主题,但简而言之,对于这个特殊情况,flex-direction: column是一个一个地排列元素.

如果其中一个元素具有绝对位置,则在flex布局中将被忽略,以便在可用空间上重新分配任何其他元素.

请看关于flexbox的guide篇文章和最后一篇working fiddle篇文章,希望能有所帮助.

Vue.js相关问答推荐

在VITE-VUE APP-DEV模式上重定向HTTP请求

在计算(computed)属性上调用数组方法

vue 3 中范围样式和深度样式的问题

如果单元格不可见,则以编程方式打开行的编辑模式. Ag 网格,Vue.js

如何使用 vue.js 和 vue 路由实现当前路由的子菜单的子菜单

如何在vue中动态加载组件

Vue CLI - 编译后将配置文件保留为外部

理解 VueJS 中的组件 props

VueJS 插件的如何react式绑定?

如何在Typescript语言Vuejs中使用watch功能?

将检测外部点击自定义指令从 Vue 2 迁移到 Vue 3

加载和渲染时对象值上的 Vue.js 未定义错误

当 v-for 与对象的属性一起使用时,将 v-model 与复选框一起使用

VueJS错误编译模板

重新加载页面正在 vue 组件中的插槽上闪烁内容

中文而不是英文的Element UI分页

使用 Vue 在单个文件组件中调用渲染方法

$set 不是函数

使用 Vue 的点击编辑文本字段

Vuetify 过渡:如何设置过渡速度