你会用CSS画一个炫酷的3D旋转柱状体吗?

简介: 你会用CSS画一个炫酷的3D旋转柱状体吗?

用 CSS 模拟一些 3D 形状,对前端开发者的 CSS 技术水平有很高的考验。

同时也可以提高对 CSS 的掌握和认知。

本文将会使用纯粹的 HTML、CSS 来绘制下面这个外观精美的 3D 圆珠图形,而不会使用任何框架。


实现分析


在写代码之前,我们要分析应该如何实现。

首先要提供一个 3D 空间的容器用来放置圆柱体,设置倾斜度数。然后在 3D 空间中画一个圆柱体,圆柱体由多个切面组成,每个切面需要计算宽度和倾斜度数,圆柱体还要有循环旋转的动画。

简单的实现思路已经有了,下面开始动手吧!


HTML


首先编写 HTML 部分的代码。


<div class="holder">
  <div class="cylinder">
  div>
div>
cylinder 中需要有很多切面,这里我们尝试设置 50 个切面,为了方便,我们使用 JS 的循环帮我们生成。
javascript
复制代码
const cylinderEl = document.querySelector('.cylinder')
for(let i = 0; i < 50; i++) {
  cylinderEl.innerHTML += `
`
}

这样 HTML 的部分就处理好了,是不是很简单?


CSS


要实现 3D 圆柱体,需要进行一些计算。所以在开始写代码之前,先定义出一些变量,来帮助我们更好的计算。

这是 CSS 变量。


body{
  --pi: 3.14159265358979;
  --cylinder-width: 100vw;
  --face-count: 50;
  --face-deg: (360deg / var(--face-count));
  --face-width: calc(var(--cylinder-width) / var(--face-count));
  --face-shift: calc(var(--cylinder-width) / var(--pi) / 2);
}

我来解释一下它们每一个的作用:

  • pi:圆周率,因为我们要计算一个完美的圆
  • cylinder-width:圆柱体的宽度
  • face-count:切面的总数
  • face-deg:每个切面的旋转度数,用 360 度除以切面总数
  • face-width:每个切面的宽度,通过圆柱体宽度除掉总数就可以了。
  • face-shift:将切面向外面移动,让它们具有更多的 3D 效果

添加 holder 样式,让容器实现倾斜外观。


.holder {
  transform-style: preserve-3d;
  transform: rotateX(-35deg);
}

设置圆柱体的旋转动画,让它绕 Y 轴 360 度旋转。


@keyframes spin {
  to {
    transform: rotateY(-360deg);
  }
}

我们开始编写圆柱体的样式,它没什么特别之处。


.cylinder {
  position: relative;
  height: 400px;
  width: var(--cylinder-width);
  transform-style: preserve-3d;
  animation: spin 7s infinite linear;
}

继续编写切面的样式。


.face {
  position: absolute;
  background-color: #da0060;
  opacity: 0.7;
  height: 100%;
  width: var(--face-width);
  top: 50%;
  left: 50%;
  transform: rotateY(calc(var(--face-deg) * var(--index))) translateZ(
      calc(var(--face-shift) - -6px)
    );
}

每个侧面都需要计算宽度,其中最具有魔法性的是 transform 属性。

我们改变了 Y 轴的旋转角度,将所有切面拼凑起来,最终得到一个完美的圆。

第一个切面的偏移度是 7.2,第二个是 14.4,依次递增,第 50 个刚好是 360 度。

每个切面的 Z 轴都会向后一些,这样看起来空间会更大。

最后给第一个切面做个标记,可以更好的看到它的旋转。


.face:nth-child(1) {
  background: repeating-linear-gradient(
      -45deg,
      transparent,
      transparent 25%,
      #f55 0,
      #f55 50%
    ),
    repeating-linear-gradient(
      45deg,
      transparent,
      transparent 25%,
      #55f 0,
      #55f 50%
    ),
    #efb;
}


最终完整的代码


<style>
body {
  --pi: 3.14159265358979;
  --cylinder-width: 100vw;
  --face-count: 50;
  --face-deg: (360deg / var(--face-count));
  --face-width: calc(var(--cylinder-width) / var(--face-count));
  --face-shift: calc(var(--cylinder-width) / var(--pi) / 2);
}
@keyframes spin {
  to {
    transform: rotateY(-360deg);
  }
}
.holder {
  transform-style: preserve-3d;
  transform: rotateX(-35deg);
}
.cylinder {
  position: relative;
  height: 50vw;
  width: var(--cylinder-width);
  transform-style: preserve-3d;
  animation: spin 5s infinite linear;
}
.face {
  position: absolute;
  background-color: #487df8;
  opacity: 0.7;
  height: 100%;
  width: var(--face-width);
  top: 50%;
  left: 50%;
  transform: rotateY(calc(var(--face-deg) * var(--index)))
    translateZ(calc(var(--face-shift) - -6px));
}
.face:nth-child(1) {
  background: repeating-linear-gradient(
      -45deg,
      transparent,
      transparent 25%,
      #f55 0,
      #f55 50%
    ),
    repeating-linear-gradient(
      45deg,
      transparent,
      transparent 25%,
      #55f 0,
      #55f 50%
    ),
    #efb;
}
style>
<div class="holder">
  <div class="cylinder">
  div>
div>
<script>
  const cylinderEl = document.querySelector('.cylinder')
  for(let i = 0; i < 50; i++) {
    cylinderEl.innerHTML += `
`
  }
script>

这么简单的 CSS 3D 旋转柱状体,你学会了吗?



相关文章
|
4月前
CSS3自动旋转正方体3D特效
CSS3自动旋转正方体3D特效
42 3
CSS3自动旋转正方体3D特效
|
28天前
|
前端开发
HTML+CSS动画实现动感3D卡片墙:现代Web设计的视觉盛宴
HTML+CSS动画实现动感3D卡片墙:现代Web设计的视觉盛宴
|
3月前
|
前端开发 JavaScript UED
CSS进阶-3D变换与透视效果
【6月更文挑战第15天】CSS3的3D变换和透视效果增强了网页的深度感。通过`rotateX/Y/Z`旋转和`translateZ`移动,结合`perspective`属性可创建3D空间。`perspective`定义观察者与Z轴的距离,影响元素的缩放感。常见问题包括过度失真和元素遮挡顺序,可通过调整`perspective`值和使用`z-index`解决。进阶技巧涉及层叠上下文理解和3D卡片翻转效果,通过实践与探索,设计师能更好地利用这些工具创新用户体验。
65 6
|
2月前
|
前端开发
前端 CSS 经典:旋转边框效果
前端 CSS 经典:旋转边框效果
26 0
|
2月前
|
前端开发 JavaScript
【HTML+CSS+JavaScript】3d-boxes-background
【HTML+CSS+JavaScript】3d-boxes-background
23 0
|
2月前
|
前端开发 JavaScript
前端 CSS 经典:3D Hover Effect 效果
前端 CSS 经典:3D Hover Effect 效果
36 0
|
2月前
|
前端开发 JavaScript
前端 CSS 经典:3D 渐变轮播图
前端 CSS 经典:3D 渐变轮播图
55 0
|
4月前
|
前端开发
纯css实现的3D立体鸡蛋动画视觉效果
纯css实现的3D立体鸡蛋动画视觉效果
52 6
纯css实现的3D立体鸡蛋动画视觉效果
|
4月前
|
UED
css3 2D与3D转换
css3 2D与3D转换
59 0
|
9月前
HTML+CSS制作3D旋转相册
HTML+CSS制作3D旋转相册