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

Vue中Teleport实现购物车模态框的slide-fade过渡CSS问题

Vue Teleport购物车模态框的slide-fade过渡实现方案

你的代码存在两处关键问题:一是Teleport与过渡组件的层级关系错误,二是过渡参数不够灵活且变量不统一。以下是修正后的完整实现:

完整Vue组件代码

<template>
  <button @click="showCart = true">打开购物车</button>

  <Teleport to="body">
    <transition name="slide-fade">
      <div v-show="showCart" class="cart-overlay fixed inset-0 bg-black/50 z-50" @click.self="showCart = false">
        <div class="cart-container fixed top-0 right-0 h-full w-96 bg-white shadow-xl overflow-hidden">
          <div class="p-4">
            <button @click="showCart = false">关闭</button>
            <p>购物车商品列表...</p>
          </div>
        </div>
      </div>
    </transition>
  </Teleport>
</template>

<script setup>
import { ref } from 'vue';
const showCart = ref(false);
</script>

对应的CSS样式

/* 购物车主体的过渡动画 */
.slide-fade-enter-active,
.slide-fade-leave-active {
  transition: all 0.3s ease;
}

.slide-fade-enter-from,
.slide-fade-leave-to {
  transform: translateX(100%); /* 用百分比适配任意宽度的购物车 */
  opacity: 0;
}

/* 遮罩层的淡入淡出过渡(可选优化) */
.cart-overlay {
  transition: opacity 0.3s ease;
}

.slide-fade-enter-from .cart-overlay,
.slide-fade-leave-to .cart-overlay {
  opacity: 0;
}

关键细节说明

  • 将<transition>嵌套在<Teleport>内部,确保过渡作用于最终挂载到body的元素,避免父元素样式干扰
  • 使用translateX(100%)替代固定像素值,保证购物车无论宽度多少,都能完全滑出视口右侧
  • 通过@click.self实现点击遮罩层关闭购物车,点击购物车内部不会触发关闭
  • 给遮罩层单独添加透明度过渡,让整体动画更流畅自然

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 15:38:09