探索 HTML 和 CSS 实现的 3D旋转相册

效果演示

这段HTML与CSS代码创建了一个包含10张卡片的3D旋转效果,每张卡片都有自己的边框颜色和图片。通过CSS的3D变换和动画,实现了一个动态的旋转展示效果

HTML

html 复制代码
<div class="wrapper">
  <div class="inner" style="--quantity: 10;">
    <div class="card" style="--index: 0;--color-card: 142, 249, 252;">
      <div class="img">
        <img src="../../static/3.jpg" alt="">
      </div>
    </div>
    <div class="card" style="--index: 1;--color-card: 142, 252, 204;">
      <div class="img">
        <img src="../../static/4.jpg" alt="">
      </div>
    </div>
    <div class="card" style="--index: 2;--color-card: 142, 252, 157;">
      <div class="img">
        <img src="../../static/5.jpg" alt="">
      </div>
    </div>
    <div class="card" style="--index: 3;--color-card: 215, 252, 142;">
      <div class="img">
        <img src="../../static/3.jpg" alt="">
      </div>
    </div>
    <div class="card" style="--index: 4;--color-card: 252, 252, 142;">
      <div class="img">
        <img src="../../static/4.jpg" alt="">
      </div>
    </div>
    <div class="card" style="--index: 5;--color-card: 252, 208, 142;">
      <div class="img">
        <img src="../../static/5.jpg" alt="">
      </div>
    </div>
    <div class="card" style="--index: 6;--color-card: 252, 142, 142;">
      <div class="img">
        <img src="../../static/4.jpg" alt="">
      </div>
    </div>
    <div class="card" style="--index: 7;--color-card: 252, 142, 239;">
      <div class="img">
        <img src="../../static/5.jpg" alt="">
      </div>
    </div>
    <div class="card" style="--index: 8;--color-card: 204, 142, 252;">
      <div class="img">
        <img src="../../static/3.jpg" alt="">
      </div>
    </div>
    <div class="card" style="--index: 9;--color-card: 142, 202, 252;">
      <div class="img">
        <img src="../../static/4.jpg" alt="">
      </div>
    </div>
  </div>
</div>
  • .wrapper:最外层的容器,用于包裹整个3D效果。
  • .inner:内部容器,用于包裹所有的卡片,并且设置了--quantity自定义属性,这个值表示卡片的总数,用于计算每个卡片的旋转角度。
  • .card:单个卡片的容器,每个卡片都有一个--index属性,表示卡片的索引,用于计算旋转角度,以及--color-card属性,表示卡片的边框颜色。
  • .img:图片容器,用于包裹img标签。
  • img:图片元素,用于显示卡片上的图片。

CSS

css 复制代码
.wrapper {
  width: 100%;
  height: 100%;
  position: relative;
  text-align: center;
  display: flex;
  align-items: center;
  justify-content: center;
  overflow: hidden;
}
.inner {
  --w: 150px;
  --h: 200px;
  --translateZ: calc((var(--w) + var(--h)) + 0px);
  --rotateX: -15deg;
  --perspective: 1000px;
  position: absolute;
  width: var(--w);
  height: var(--h);
  top: 25%;
  left: calc(50% - (var(--w) / 2) - 2.5px);
  z-index: 2;
  transform-style: preserve-3d;
  transform: perspective(var(--perspective));
  animation: rotating 20s linear infinite;
}

@keyframes rotating {
  from {
    transform: perspective(var(--perspective)) rotateX(var(--rotateX)) rotateY(0);
  }

  to {
    transform: perspective(var(--perspective)) rotateX(var(--rotateX)) rotateY(1turn);
  }
}
.card {
  position: absolute;
  border: 2px solid rgba(var(--color-card));
  border-radius: 12px;
  overflow: hidden;
  inset: 0;
  transform: rotateY(calc((360deg / var(--quantity)) * var(--index))) translateZ(var(--translateZ));
}
.img {
  width: 100%;
  height: 100%;
  object-fit: cover;
  background: #0000 radial-gradient(circle,
      rgba(var(--color-card), 0.2) 0%,
      rgba(var(--color-card), 0.6) 80%,
      rgba(var(--color-card), 0.9) 100%);
}
.img img {
  width: 100%;
  height: 100%;
}
  • .wrapper:设置为相对定位,并且使其充满整个视口(viewport),居中显示内容,并且隐藏溢出的内容。
  • .inner:设置为绝对定位,并且定义了一些自定义属性,用于计算卡片的宽度、高度、Z轴的平移距离、X轴的旋转角度和透视效果。它还设置了transform-style为preserve-3d,这是实现3D效果的关键属性。此外,它还定义了一个无限循环的rotating动画。
  • @keyframes rotating:定义了一个名为rotating的关键帧动画,使.inner容器围绕Y轴旋转。
  • .card:设置为绝对定位,并且使用rotateY和translateZ变换来实现卡片的3D旋转效果。每个卡片的旋转角度由--index和--quantity属性计算得出。
  • .img:设置图片容器的宽高、对象适应模式和背景渐变效果。
  • .img img:设置图片的宽高以填满容器。
相关推荐
国服第二切图仔11 分钟前
DevUI Design中后台产品开源前端解决方案之Carousel 走马灯组件使用指南
前端·开源
无限大618 分钟前
为什么浏览器能看懂网页代码?——从HTML到渲染引擎的奇幻之旅
前端
福尔摩斯张20 分钟前
Linux信号捕捉特性详解:从基础到高级实践(超详细)
linux·运维·服务器·c语言·前端·驱动开发·microsoft
2401_8603195222 分钟前
DevUI组件库实战:从入门到企业级应用的深度探索 ,如何快速安装DevUI
前端·前端框架
cc蒲公英44 分钟前
javascript有哪些内置对象
java·前端·javascript
zhangwenwu的前端小站1 小时前
vue 对接 Dify 官方 SSE 流式响应
前端·javascript·vue.js
王林不想说话1 小时前
受控/非受控组件分析
前端·react.js·typescript
_杨瀚博1 小时前
VUE中使用AXIOS包装API代理
前端
张有志1 小时前
基于 Body 滚动的虚拟滚动组件技术实现
前端·react.js
b***74881 小时前
前端正在进入“超级融合时代”:从单一技术栈到体验、架构与智能的全维度进化
前端·架构