一、HTML实现
首先我们来构建基本结构,钻石球体的结构还是比较复杂的,需要很多盒子来组合。我们创建了一个具有旋转球体效果的背景。
相关代码如下所示。
<div class="background">
<div class="rotater">
<div class="sphere">
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
<span></span>
</div>
......
此处省略四个类名为sphere的div盒子
</div>
</div>
说明:
(1)最外层的div:用于包含整个背景效果的容器。
(2).rotater:用于旋转的容器,在这个容器内的球体元素会以相同的速度和方向旋转。
(3).sphere:球体元素的容器,在它里面包含了一组<span>元素。
(4)<span>:球体的构成单元,通过旋转和样式设置创建了球体的外观。
以上就是整体的构成,由多个球体组成的旋转钻石效果,每个球体都由一组<span>元素构成。整个背景以相同的速度和方向旋转,营造出动态且有趣的视觉效果。
二、CSS实现
HTML代码本身目前并未为球体元素设置样式,因此接下来为这些元素添加相关样式,来实现具体的外观和表现。
1、为容器.rotater添加关键帧动画
首先我们为旋转球体的容器.rotater添加了样式,添加了关键帧动画。代码如下所示:
.background .rotater{
position: absolute;
top: calc(50% - 200px);
left: calc(50% - 200px);
width: 400px;
height: 400px;
transform-style: preserve-3d;
animation: rotater 20s linear infinite;
}
@keyframes rotater {
0%{
transform: rotateX(0deg) rotateY(0deg);
}
100%{
transform: rotateX(360deg) rotateY(360deg);
}
}
说明:
(1)rotater定位:
对于 rotater 的样式,我们将容器设置为绝对定位,使其相对于其最近的定位父元素进行定位。启用3D变换,使容器和其中的元素能够在3D空间中进行变换,这里插一句,该属性可以开启CSS硬件加速。最后应用名为rotater的关键帧动画到容器上,持续时间为 20 秒,使用线性的时间曲线,并且无限循环播放。
(2)rotater关键帧动画:
对于rotater的关键帧动画,在 0% 的关键帧中,容器的变换样式为旋转角度为 0 度;在 100% 的关键帧中,容器的变换样式为旋转角度为 360 度,即一圈完整的旋转。将包含球体元素的容器以 20 秒的持续时间和线性的时间曲线进行旋转。通过持续的旋转,球体的外观将以连续平滑的动画效果展示。
2、为球体元素添加样式
接下来为球体容器中的每个球体元素添加样式。相关代码如下:
.background .rotater .sphere{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
transform-style: preserve-3d;
}
.background .rotater .sphere:nth-child(2){
transform: rotate(90deg);
}
.background .rotater .sphere:nth-child(3){
transform: rotate(45deg);
}
.background .rotater .sphere:nth-child(4){
transform: rotate(-45deg);
}
说明:
对于.sphere的样式,我们将球体元素设置为绝对定位,使其脱离文档流。然后我们去选择球体容器中的某个球体元素,添加样式。比如将第二个球体元素以 90 度的角度顺时针旋转;将第三个球体元素以 45 度的角度顺时针旋转;将第四个球体元素以 -45 度的角度顺时针旋转。通过这些变换,球体元素在球体容器中呈现出错落有致的位置和旋转角度。
3、为球体元素的子元素span添加样式
最后我们为球体容器内的每个球体元素的子元素<span>添加样式。相关代码如下:
.background .rotater .sphere span:nth-child(1){
transform: rotateY(0deg);
}
.background .rotater .sphere span:nth-child(2){
transform: rotateY(30deg);
}
.background .rotater .sphere span:nth-child(3){
transform: rotateY(60deg);
}
.background .rotater .sphere span:nth-child(4){
transform: rotateY(90deg);
}
.background .rotater .sphere span:nth-child(5){
transform: rotateY(120deg);
}
.background .rotater .sphere span:nth-child(6){
transform: rotateY(150deg);
}
说明:
对于<span>的样式,我们通过nth-child(n)选择器选择球体容器每个.sphere元素下的第n个子元素<span>。transform: rotateY(n deg)表示将该子元素以n度的角度绕Y轴顺时针旋转。通过这些样式,每个球体元素内的<span>子元素将以不同的旋转角度绕Y轴旋转,同时设置了径向渐变背景和圆角样式,从而呈现出具有立体感的球体效果。
三、总结
以上就是整个效果的实现过程了,相比之前的CSS效果,这个会相对复杂一些,可以多花些时间去琢磨一下,或者可以在该效果的基础上做一些其他的改变。总之,这些CSS特效的可扩展性还是很高的。效果请参考旋转钻石背景demo。