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

Svelte中实现卡片原地淡入淡出切换的方法

在Svelte里实现卡片淡换动画的正确姿势

核心要点

要实现两个同位置卡片无缝淡入淡出替换,关键是让俩卡片一直叠在同一个位置,别因为切换时DOM被删除重建导致位置跑偏,同时用Svelte的过渡动画让淡入淡出同步进行。

具体实现方法

1. 先把布局固定死

给外层容器设置相对定位,两个卡片都设绝对定位,确保它们完全重叠:

<div class="card-wrap">
  <!-- 卡片内容容器 -->
</div>

对应CSS:

.card-wrap {
  position: relative;
  width: 300px;
  height: 200px; /* 尺寸要和卡片一致 */
}
.card {
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  /* 自定义样式:背景、圆角、阴影等 */
}

2. 用Svelte过渡实现同步淡换

导入Svelte自带的fade过渡,控制卡片的显示状态:

<script>
  import { fade } from 'svelte/transition';
  let showCard1 = true;

  function swapCards() {
    showCard1 = !showCard1;
  }
</script>

<button on:click={swapCards}>切换卡片</button>

<div class="card-wrap">
  <!-- 方案一:用{#if}配合过渡 -->
  {#if showCard1}
    <div class="card" transition:fade={{ duration: 300 }}>卡片1内容</div>
  {:else}
    <div class="card" transition:fade={{ duration: 300 }}>卡片2内容</div>
  {/if}
</div>

3. 解决卡片偏移问题

如果之前用{#if}出现新卡片从下方弹出的情况,是因为切换时旧卡片先消失、新卡片才插入DOM导致布局闪跳。可以改用让两个卡片始终留在DOM里,只控制透明度的方案:

<div class="card-wrap">
  <div 
    class="card" 
    transition:fade={{ duration: 300 }}
    style="opacity: {showCard1 ? 1 : 0}"
  >卡片1内容</div>
  <div 
    class="card" 
    transition:fade={{ duration: 300 }}
    style="opacity: {showCard1 ? 0 : 1}"
  >卡片2内容</div>
</div>

这种方式下两个卡片始终重叠在同一位置,完全避免位移问题。

避坑提醒

  • 两个卡片的尺寸必须完全一致,否则重叠时会错位
  • 过渡时长要统一设置,保证淡出和淡入同步进行
  • 避免切换时让卡片被移出DOM,要么用{#key}强制重建但保持定位,要么让卡片始终留在DOM中通过透明度控制显示

内容的提问来源于stack exchange,提问作者monte

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 21:53:19