Vue3技术开发,使用纯CSS3动手制作一个3D环绕的相册展示效果,支持传入任意图片.3D轮播相册的组件

主要讲述封装一个3D轮播相册的组件,效果图如下,仅仅传入一个图片的数组即可,效果如下:

使用Vue3技术开发,支持传入任意张数的图片。

使用方法

javascript 复制代码
<template>
  <Swiper :list="list" />
</template>

<script setup>
import Swiper from '@/components/Swiper.vue'

let list = [
  'https://gd-hbimg.huaban.com/0c89e8d8eebbd8b3168051c9c32dda927b11041544c27-7h2Nuu_fw658webp',
  'https://gd-hbimg.huaban.com/d8ab30b96c90ef2c0428376d1df6e86df379ddc33b598-XfLbgw_fw658webp',
  'https://gd-hbimg.huaban.com/617a23ff457a8e7f403560601ee1986f0be521ce31262-yudWdl_fw658webp',
  'https://gd-hbimg.huaban.com/02381538312ca44802a7fb6140fdf79711d046d01e256-bGN4Hq_fw658webp',
  'https://gd-hbimg.huaban.com/2f625b869a53f799fdaf79c20ca7e0d96277767b39594-OQN9F9_fw658webp',
]
</script>

swiper组件

javascript 复制代码
<template>
  <section>
    <div class="green-circle">
      <div class="pink-circle">
        <img
          class="bottom-circle"
          src="https://gd-hbimg.huaban.com/1784343fe17d90f4de4bccf96594d0965c616f5947463-umfPH3_fw658webp"
          alt=""
        />
      </div>
    </div>
    <div class="swiper-box" id="swiperBox">
      <div
        v-for="(item, index) in list"
        :key="'img-' + index"
        class="loop-item"
        :style="{
          transform: `translate(-50%, -50%) rotate(${
            (360 / list.length) * index
          }deg) translateY(-17.5vh) rotateX(90deg)`,
        }"
      >
        <img class="alarm-img" :src="item" />
      </div>
    </div>
  </section>
</template>

<script setup>
const props = defineProps({
  list: {
    type: Array,
    default: () => [],
  },
})
</script>

<style lang="scss" scoped>
section {
  width: 100%;
  height: 100%;
  position: relative;
  display: flex;
  align-items: center;
  justify-content: center;

  .green-circle {
    margin-top: 126px;
    position: absolute;
    display: flex;
    align-items: center;
    justify-content: center;
    width: 800px;
    height: 800px;
    transform-style: preserve-3d;
    transform: rotateX(60deg) rotate(18deg);
    background-color: #aee6b4;
    box-shadow: 19px 48px 27px #c5e3dd;
    border-radius: 50%;
    .pink-circle {
      display: flex;
      align-items: center;
      justify-content: center;
      width: 300px;
      height: 300px;
      background-color: rgba(255, 9, 9, 0.6);
      border-radius: 50%;
      box-shadow: 2px 2px 30px #c82d2d;
      .bottom-circle {
        width: 300px;
        object-fit: contain;
      }
    }
  }

  .swiper-box {
    position: relative;
    z-index: 200;
    width: 100%;
    transform-style: preserve-3d;
    animation: three-dimensions-circle 30s linear infinite;

    .loop-item {
      object-fit: cover;
      position: absolute;
      top: 50%;
      left: 50%;
      cursor: pointer;
      text-align: center;

      .loop-name {
        font-size: 14px;
        color: #ffffff;
        overflow: hidden;
        white-space: nowrap;
        text-overflow: ellipsis;
      }

      img,
      .alarm-img {
        margin-top: 4px;
        width: 150px;
        height: 9.2vh;
      }
    }
  }
}

@keyframes three-dimensions-circle {
  0% {
    transform: rotateX(-108deg) rotate(0);
  }
  100% {
    transform: rotateX(-108deg) rotate(-360deg);
  }
}
</style>

1. 大致思路

通过 :style="{transform: translate(-50%, -50%) rotate(${(360 / list.length) * index}deg) translateY(-17.5vh) rotateX(90deg)}" 来先实现静态的图片摆放,然后通过旋转 swiper-box 来达到整体旋转的效果。

通过 360 / list.length 来计算出每张图片的左右间距,以保证占满一个圈。

2. 3D效果

3D效果主要通过 css3 的 transform-style: preserve-3d; 配合 transform: rotate; 来实现

相关推荐
南囝coding2 分钟前
最近Vibe Coding的经验总结
前端·后端·程序员
前端小咸鱼一条28 分钟前
React组件化的封装
前端·javascript·react.js
随便起的名字也被占用36 分钟前
leaflet中绘制轨迹线的大量轨迹点,解决大量 marker 绑定 tooltip 同时显示导致的性能问题
前端·javascript·vue.js·leaflet
南方kenny42 分钟前
TypeScript + React:让前端开发更可靠的黄金组合
前端·react.js·typescript
Cache技术分享1 小时前
149. Java Lambda 表达式 - Lambda 表达式的序列化
前端·后端
LaoZhangAI1 小时前
GPT-5推理能力全解析:o3架构、链式思考与2025年8月发布
前端·后端
JuneXcy1 小时前
11.Layout-Pinia优化重复请求
前端·javascript·css
子洋1 小时前
快速目录跳转工具 zoxide 使用指南
前端·后端·shell
天下无贼!1 小时前
【自制组件库】从零到一实现属于自己的 Vue3 组件库!!!
前端·javascript·vue.js·ui·架构·scss
CF14年老兵2 小时前
✅ Next.js 渲染速查表
前端·react.js·next.js