当前位置:首页 > VUE

vue实现图片堆叠伸展

2026-02-24 09:15:41VUE

实现图片堆叠伸展效果

在Vue中实现图片堆叠伸展效果可以通过CSS和Vue的响应式特性结合完成。以下是具体实现方法:

使用CSS transform和transition

通过CSS的transform属性实现堆叠效果,transition实现平滑动画:

vue实现图片堆叠伸展

<template>
  <div class="stack-container">
    <div 
      v-for="(image, index) in images" 
      :key="index"
      :class="['stack-item', { active: activeIndex === index }]"
      @click="setActive(index)"
    >
      <img :src="image.src" :alt="image.alt">
    </div>
  </div>
</template>

<script>
export default {
  data() {
    return {
      activeIndex: 0,
      images: [
        { src: 'image1.jpg', alt: 'Image 1' },
        { src: 'image2.jpg', alt: 'Image 2' },
        { src: 'image3.jpg', alt: 'Image 3' }
      ]
    }
  },
  methods: {
    setActive(index) {
      this.activeIndex = index
    }
  }
}
</script>

<style>
.stack-container {
  position: relative;
  width: 300px;
  height: 200px;
}

.stack-item {
  position: absolute;
  width: 100%;
  height: 100%;
  transition: transform 0.3s ease;
  transform-origin: center bottom;
}

.stack-item img {
  width: 100%;
  height: 100%;
  object-fit: cover;
}

.stack-item:not(.active) {
  transform: scale(0.9) translateY(10px);
  z-index: 1;
  filter: brightness(0.8);
}

.stack-item.active {
  transform: scale(1);
  z-index: 2;
}
</style>

使用Vue Transition组件

结合Vue的Transition组件实现更复杂的动画效果:

vue实现图片堆叠伸展

<template>
  <div class="stack-gallery">
    <TransitionGroup name="stack" tag="div" class="stack-wrapper">
      <div 
        v-for="(img, i) in images" 
        :key="img.id"
        :class="['stack-card', { 'active': activeCard === i }]"
        @click="activeCard = i"
      >
        <img :src="img.url" :alt="img.title">
      </div>
    </TransitionGroup>
  </div>
</template>

<style>
.stack-gallery {
  perspective: 1000px;
}

.stack-wrapper {
  position: relative;
  width: 300px;
  height: 400px;
}

.stack-card {
  position: absolute;
  width: 100%;
  height: 100%;
  transition: all 0.5s cubic-bezier(0.22, 1, 0.36, 1);
  transform-origin: center bottom;
}

.stack-card:not(.active) {
  transform: scale(0.85) translateY(30px);
  z-index: 1;
  opacity: 0.8;
}

.stack-card.active {
  transform: scale(1);
  z-index: 10;
}

.stack-enter-active,
.stack-leave-active {
  transition: all 0.5s ease;
}

.stack-enter-from,
.stack-leave-to {
  opacity: 0;
  transform: translateY(20px) scale(0.95);
}
</style>

响应式堆叠布局

实现根据屏幕大小调整堆叠数量的响应式效果:

computed: {
  visibleImages() {
    const maxVisible = this.$vuetify.breakpoint.smAndDown ? 3 : 5
    return this.images.slice(0, maxVisible)
  }
}
@media (max-width: 768px) {
  .stack-item {
    transform: scale(0.85) translateY(15px);
  }

  .stack-item.active {
    transform: scale(0.95);
  }
}

3D堆叠效果

添加3D变换增强视觉效果:

.stack-container {
  transform-style: preserve-3d;
}

.stack-item:not(.active) {
  transform: 
    scale(0.9) 
    translateY(20px) 
    rotateX(10deg);
  box-shadow: 0 10px 20px rgba(0,0,0,0.2);
}

.stack-item.active {
  transform: 
    scale(1) 
    translateY(0) 
    rotateX(0);
  box-shadow: 0 15px 30px rgba(0,0,0,0.3);
}

以上方法可以根据实际需求组合使用,调整transform参数和过渡时间可获得不同的视觉效果。对于更复杂的需求,可以考虑使用GSAP等动画库实现更精细的控制。

标签: 图片vue
分享给朋友:

相关文章

vue 实现级联

vue 实现级联

Vue 实现级联选择器 级联选择器(Cascader)常用于省市区选择、分类选择等场景。Vue 中可以通过 Element UI、Ant Design Vue 等 UI 库实现,也可以手动封装。 使…

vue实现全屏

vue实现全屏

Vue 实现全屏功能的方法 在 Vue 中实现全屏功能可以通过浏览器提供的 Fullscreen API 来实现。以下是几种常见的实现方式: 使用原生 Fullscreen API 通过调用 doc…

vue实现订单

vue实现订单

Vue 实现订单功能 订单数据结构设计 订单数据通常包含以下字段: order: { id: String, // 订单ID userId: String,…

vue实现pc

vue实现pc

Vue 实现 PC 端应用开发 Vue.js 是一个流行的前端框架,适用于构建 PC 端 Web 应用。以下是关键步骤和最佳实践: 项目初始化 使用 Vue CLI 或 Vite 创建项目:…

自实现vue

自实现vue

实现 Vue 的核心功能 要实现一个简化版的 Vue,需要理解其核心功能:数据响应式、模板编译、虚拟 DOM 和组件系统。以下是关键步骤的分解: 数据响应式 Vue 使用 Object.define…

vue路由实现滑动

vue路由实现滑动

实现 Vue 路由滑动效果的方法 使用 Vue Router 结合 CSS 过渡动画 在 Vue Router 的路由视图组件 <router-view> 上添加过渡效果,结合 CSS 实…