下面我将为你提供一个从入门到精通的完整指南,包括:

(图片来源网络,侵删)
- 核心原理:3D相册是如何工作的?
- 基础入门:一个简单的3D旋转相册(使用纯CSS)。
- 进阶特效:更酷炫的交互和动画(结合CSS和JavaScript)。
- 高级实现:使用专业库(如Three.js)创建真正的3D空间相册。
- 完整代码示例:可以直接复制使用的代码。
核心原理:3D相册是如何工作的?
网页上的3D效果并非真正的三维模型,而是利用CSS3的 transform 属性,在二维平面上模拟出三维空间的视觉效果,核心概念包括:
- 透视:
perspective属性定义了观察者与3D空间之间的距离,值越小,透视效果越强(物体变形越厉害);值越大,透视效果越弱(物体看起来越扁平),这是实现3D效果的基础。 - 3D变换:
rotateX(): 绕X轴旋转(上下翻转)。rotateY(): 绕Y轴旋转(左右翻转)。rotateZ(): 绕Z轴旋转(平面内旋转)。translate3d(): 在三维空间中移动元素。
- 变换样式:
transform-style: preserve-3d;:这个属性至关重要!它告诉子元素也要在3D空间中进行变换,而不是被压扁到2D平面上,没有它,所有的3D效果都会失效。
- 场景:一个具有
perspective的父容器,作为我们的“3D舞台”。 - 相册容器:一个具有
transform-style: preserve-3d的子容器,作为我们的“旋转盘”。 - 照片:相册容器内的每一个
<img>或.photo元素,通过transform将它们定位在3D空间中的不同位置(围成一个圆柱形或立方体)。
基础入门:纯CSS 3D旋转相册
这个例子将创建一个可以自动旋转的圆柱形相册。
HTML 结构
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">纯CSS 3D旋转相册</title>
<link rel="stylesheet" href="style.css">
</head>
<body>
<div class="scene">
<div class="album">
<div class="photo">
<img src="https://picsum.photos/seed/photo1/300/400.jpg" alt="照片1">
</div>
<div class="photo">
<img src="https://picsum.photos/seed/photo2/300/400.jpg" alt="照片2">
</div>
<div class="photo">
<img src="https://picsum.photos/seed/photo3/300/400.jpg" alt="照片3">
</div>
<div class="photo">
<img src="https://picsum.photos/seed/photo4/300/400.jpg" alt="照片4">
</div>
<div class="photo">
<img src="https://picsum.photos/seed/photo5/300/400.jpg" alt="照片5">
</div>
<div class="photo">
<img src="https://picsum.photos/seed/photo6/300/400.jpg" alt="照片6">
</div>
</div>
</div>
</body>
</html>
CSS 样式
/* style.css */
body {
margin: 0;
height: 100vh;
display: flex;
justify-content: center;
align-items: center;
background-color: #1a1a1a;
font-family: sans-serif;
overflow: hidden; /* 防止出现滚动条 */
}
/* 1. 3D场景 - 舞台 */
.scene {
width: 300px;
height: 400px;
perspective: 1000px; /* 设置透视距离,数值越小效果越夸张 */
}
/* 2. 相册容器 - 旋转盘 */
.album {
width: 100%;
height: 100%;
position: relative;
transform-style: preserve-3d; /* 关键:保持3D环境 */
animation: rotate 20s infinite linear; /* 无限旋转动画 */
}
/* 3. 单张照片 */
.photo {
position: absolute;
width: 300px;
height: 400px;
left: 0;
top: 0;
border: 10px solid white;
box-shadow: 0 0 20px rgba(0,0,0,0.5);
backface-visibility: hidden; /* 隐藏背面,可选但推荐 */
}
.photo img {
width: 100%;
height: 100%;
object-fit: cover; /* 保证图片填满容器,不变形 */
}
/* 4. 定位照片 - 围成一个圆柱体 */
/* 每张照片绕Y轴旋转60度 (360/6),并沿Z轴轴向外移动 */
.photo:nth-child(1) { transform: rotateY(0deg) translateZ(250px); }
.photo:nth-child(2) { transform: rotateY(60deg) translateZ(250px); }
.photo:nth-child(3) { transform: rotateY(120deg) translateZ(250px); }
.photo:nth-child(4) { transform: rotateY(180deg) translateZ(250px); }
.photo:nth-child(5) { transform: rotateY(240deg) translateZ(250px); }
.photo:nth-child(6) { transform: rotateY(300deg) translateZ(250px); }
/* 5. 旋转动画 */
@keyframes rotate {
from {
transform: rotateY(0deg);
}
to {
transform: rotateY(360deg);
}
}
如何运行:将HTML和CSS代码分别保存为 index.html 和 style.css 文件,放在同一个文件夹下,用浏览器打开 index.html 即可看到效果。
进阶特效:鼠标交互与控制
我们可以通过JavaScript来增强相册的交互性,比如用鼠标拖动来控制旋转。

(图片来源网络,侵删)
HTML 结构 (增加控制按钮)
<!-- 在body内的 .scene 后面添加 -->
<div class="controls">
<button id="prevBtn">上一张</button>
<button id="nextBtn">下一张</button>
<button id="autoPlayBtn">自动播放</button>
</div>
CSS 样式 (新增)
/* 在 style.css 末尾添加 */
.controls {
position: absolute;
bottom: 20px;
display: flex;
gap: 10px;
}
.controls button {
padding: 10px 20px;
font-size: 16px;
cursor: pointer;
background-color: #333;
color: white;
border: none;
border-radius: 5px;
transition: background-color 0.3s;
}
.controls button:hover {
background-color: #555;
}
JavaScript 交互
// 在 <body> 标签结束前添加 <script> 标签
<script>
document.addEventListener('DOMContentLoaded', () => {
const album = document.querySelector('.album');
const photos = document.querySelectorAll('.photo');
const prevBtn = document.getElementById('prevBtn');
const nextBtn = document.getElementById('nextBtn');
const autoPlayBtn = document.getElementById('autoPlayBtn');
let currentRotation = 0;
let isAutoPlaying = true;
let autoPlayInterval;
// 计算每张照片应该旋转的角度
const photoAngle = 360 / photos.length;
// 自动播放函数
function startAutoPlay() {
autoPlayInterval = setInterval(() => {
currentRotation -= photoAngle;
album.style.transform = `rotateY(${currentRotation}deg)`;
}, 3000); // 每3秒切换一张
}
function stopAutoPlay() {
clearInterval(autoPlayInterval);
}
// 上一张/下一张按钮事件
prevBtn.addEventListener('click', () => {
stopAutoPlay();
currentRotation += photoAngle;
album.style.transform = `rotateY(${currentRotation}deg)`;
});
nextBtn.addEventListener('click', () => {
stopAutoPlay();
currentRotation -= photoAngle;
album.style.transform = `rotateY(${currentRotation}deg)`;
});
// 自动播放/暂停按钮
autoPlayBtn.addEventListener('click', () => {
if (isAutoPlaying) {
stopAutoPlay();
autoPlayBtn.textContent = '自动播放';
isAutoPlaying = false;
} else {
startAutoPlay();
autoPlayBtn.textContent = '暂停';
isAutoPlaying = true;
}
});
// 鼠标拖动控制 (进阶)
let isDragging = false;
let startX = 0;
let currentX = 0;
album.addEventListener('mousedown', (e) => {
isDragging = true;
startX = e.clientX;
stopAutoPlay();
album.style.cursor = 'grabbing';
});
document.addEventListener('mousemove', (e) => {
if (!isDragging) return;
e.preventDefault();
currentX = e.clientX;
const diffX = currentX - startX;
currentRotation += diffX * 0.5; // 乘以一个系数来控制灵敏度
album.style.transform = `rotateY(${currentRotation}deg)`;
startX = currentX;
});
document.addEventListener('mouseup', () => {
isDragging = false;
album.style.cursor = 'grab';
// 可以在这里重新启动自动播放
});
// 启动自动播放
startAutoPlay();
});
</script>
高级实现:使用 Three.js 创建真正的3D空间
当相册数量很多,或者需要更复杂的3D效果(如粒子效果、光影、真正的3D模型)时,纯CSS就力不从心了,这时,我们可以使用 Three.js 这个强大的3D库。
Three.js允许你在网页中创建和渲染复杂的3D场景。
概念
- 场景:所有3D对象的容器。
- 相机:决定了你从哪个角度、多远距离观看场景。
- 渲染器:将3D场景绘制成2D图像并显示在网页上。
- 几何体:物体的形状,如
BoxGeometry(立方体),CylinderGeometry(圆柱体),PlaneGeometry(平面)。 - 材质:物体的外观,如颜色、纹理、光泽度等。
MeshBasicMaterial不受光照影响,MeshStandardMaterial则会。 - 网格:几何体和材质的结合,构成了我们能看到的具体物体。
- 纹理:通常是图片,可以贴到几何体表面。
示例:一个漂浮的3D照片墙
这个例子需要引入Three.js库。
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">Three.js 3D相册</title>
<style>
body { margin: 0; overflow: hidden; }
canvas { display: block; }
</style>
</head>
<body>
<!-- 引入Three.js库 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r128/three.min.js"></script>
<script>
// 1. 初始化场景、相机、渲染器
const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer({ antialias: true });
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);
// 2. 创建照片墙
const photoCount = 20;
const photoGroup = new THREE.Group(); // 将所有照片放在一个组里,方便整体旋转
for (let i = 0; i < photoCount; i++) {
// 创建一个平面几何体作为照片
const geometry = new THREE.PlaneGeometry(2, 3);
// 加载纹理(图片)
const textureLoader = new THREE.TextureLoader();
const texture = textureLoader.load(`https://picsum.photos/seed/three${i}/400/600.jpg`);
// 创建材质
const material = new THREE.MeshBasicMaterial({ map: texture, side: THREE.DoubleSide });
// 创建网格(照片)
const photo = new THREE.Mesh(geometry, material);
// 随机位置和旋转
const radius = 10;
const theta = Math.random() * Math.PI * 2;
const phi = Math.random() * Math.PI;
photo.position.x = radius * Math.sin(phi) * Math.cos(theta);
photo.position.y = radius * Math.sin(phi) * Math.sin(theta);
photo.position.z = radius * Math.cos(phi);
photo.lookAt(0, 0, 0); // 让每张照片都朝向中心
photoGroup.add(photo);
}
scene.add(photoGroup);
// 3. 设置相机位置
camera.position.z = 25;
// 4. 添加动画
function animate() {
requestAnimationFrame(animate);
// 让整个照片组缓慢旋转
photoGroup.rotation.y += 0.002;
renderer.render(scene, camera);
}
animate();
// 5. 响应窗口大小变化
window.addEventListener('resize', () => {
camera.aspect = window.innerWidth / window.innerHeight;
camera.updateProjectionMatrix();
renderer.setSize(window.innerWidth, window.innerHeight);
});
</script>
</body>
</html>
这个例子会创建一个球形的照片墙,所有照片随机分布在球面上,并缓慢旋转,你可以通过 OrbitControls (Three.js的一个附加组件) 来实现用鼠标拖动、缩放查看的效果,这会让交互性更强。

(图片来源网络,侵删)
总结与建议
| 特性 | 纯CSS实现 | Three.js实现 |
|---|---|---|
| 学习难度 | 低,只需了解CSS3 | 中高,需要理解3D图形学概念 |
| 性能 | 优秀,GPU加速 | 优秀,但复杂场景可能消耗更多资源 |
| 实现复杂度 | 简单,代码量少 | 复杂,需要编写JavaScript逻辑 |
| 灵活性 | 有限,主要局限于旋转和变换 | 极高,可创建任何3D效果和交互 |
| 适用场景 | 少量照片的展示、卡片翻转、轮播 | 大量照片、3D画廊、粒子特效、游戏 |
给你的建议:
- 从CSS开始:先尝试用纯CSS实现一个基础的3D相册,这能帮助你快速理解3D变换的核心原理。
- 加入JS交互:当熟悉了CSS后,用JavaScript来控制动画和鼠标交互,这是让相册“活”起来的关键一步。
- 探索Three.js:如果你追求更酷炫、更专业的效果,或者项目本身就需要复杂的3D,那么学习Three.js是必然的选择,它为网页3D世界打开了无限可能。
希望这份详细的指南能帮助你成功创建出令人惊艳的3D特效相册!
