You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Vuetify导航进入页面时如何实现列表项首次渲染入场动画

问题原因
  • 未定义对应过渡样式:你给过渡组件设置了name="view"属性,但没有编写任何以view-为前缀的Vue过渡生命周期CSS类,没有动画规则自然无法触发效果。
  • 过渡组件选型错误:v-for生成的是多个并列DOM元素,单个<transition>组件仅支持单元素/单组件过渡,多元素列表入场需要使用<transition-group>组件。
  • 存在渲染BUG:列表数据中有两个项的id均为5,v-for要求绑定的key值全局唯一,重复key会导致DOM映射异常,干扰动画正常触发。
修复实现方案

要实现页面加载时卡片从左侧依次滑入的效果,按以下步骤修改代码:

1. 修改HTML模板

将循环内的单个<transition>替换为外层的<transition-group>,给每个卡片绑定动态延迟样式实现错峰入场:

<div id="app">
  <v-app dark>
    <!-- 列表过渡用transition-group,tag指定渲染为div,避免额外标签破坏布局 -->
    <transition-group name="view" appear tag="div" class="box" justify="center" align="center">
      <div v-for="(item, index) in list" :key="item.id" :style="{transitionDelay: `${index * 0.1}s`}">
        <div class="card">{{item.name}}</div>
      </div>
    </transition-group>
  </v-app>
</div>

2. 修复JS数据

把重复的id改成唯一值:

Vue.use(Vuetify);

var vm = new Vue({
  el: "#app",
  data: {
    list: [
      {id: 1, name: "Lorem"},
      {id: 2, name: "Ipsum"},
      {id: 3, name: "Dolor"},
      {id: 4, name: "Sit"},
      {id: 5, name: "Amet"},
      {id: 6, name: "Consectetur"} // 原重复id:5的项修改为唯一id
    ]
  }
});

3. 补充过渡CSS样式

添加view前缀对应的入场过渡规则,实现左滑淡入效果:

.box {
  display: flex;
  flex-direction: row;
  flex-flow: row wrap;
}
.box .card  {
  width: 30vw;
  height: 200px;
  background-color: white;
  color: black;
  border: 1px solid red;
}

/* 入场动画初始状态 */
.view-appear {
  opacity: 0;
  transform: translateX(-60px); /* 初始位置在元素左侧60px处 */
}
/* 入场动画执行规则 */
.view-appear-active {
  transition: all 0.4s ease-out;
}
/* 入场动画完成状态(可省略,默认继承元素本身样式) */
.view-appear-to {
  opacity: 1;
  transform: translateX(0);
}

调整index * 0.1s的数值可以修改卡片之间的入场间隔,修改translateX的数值和transition时长可以调整滑入距离、动画播放速度。

内容的提问来源于stack exchange,提问作者Mr.P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 17:42:43