最近群里有这样一个有意思的问题,大家在探讨,应用 CSS 3D 是否实现如下所示的成果:
这里的外围难点在于,如何利用 CSS 实现一个平面的数字?CSS 能做到吗?
不是特地好实现,然而,如果仅仅只是在肯定角度内,利用视觉障眼法,咱们还是能够比拟完满的还原上述成果的。
利用间隔、角度及光影构建不一样的 3D 成果
这是一种很有意思的技巧,在 奇思妙想 CSS 3D 动画 | 仅应用 CSS 能制作出多惊艳的动画?咱们已经介绍过,当然,制作的过程须要比拟多的调试。
正当的利用间隔、角度及光影构建出不一样的 3D 成果。看看上面这个例子,只是简略是设置了三层字符,让它们在 Z 轴上相距肯定的间隔。
简略的伪代码如下:
<div>
<span class='C'>C</span>
<span class='S'>S</span>
<span class='S'>S</span>
<span></span>
<span class='3'>3</span>
<span class='D'>D</span>
</div>
$bright : #AFA695;
$gold : #867862;
$dark : #746853;
$duration : 10s;
div {
perspective: 2000px;
transform-style: preserve-3d;
animation: fade $duration infinite;
}
span {
transform-style: preserve-3d;
transform: rotateY(25deg);
animation: rotate $duration infinite ease-in;
&:after, &:before {content: attr(class);
color: $gold;
z-index: -1;
animation: shadow $duration infinite;
}
&:after{transform: translateZ(-16px);
}
&:before {transform: translateZ(-8px);
}
}
@keyframes fade {// 透明度变动}
@keyframes rotate {// 字体旋转}
@keyframes shadow {// 字体色彩变动}
简略捋一下,上述代码的外围就是:
- 父元素、子元素设置
transform-style: preserve-3d
- 用
span
元素的两个伪元素复制两个雷同的字,利用translateZ()
让它们在 Z 轴距离肯定间隔 - 增加简略的旋转、透明度、字体色彩变动
能够失去这样一种相似电影开片的题目 3D 动画,其实只有 3 层元素,然而因为角度失当,视觉上的连接比拟完满,看上去就十分的 3D。
为什么下面说须要正当的利用间隔、角度及光影呢?
还是同一个动画成果,如果动画的初始旋转角度设置的略微大一点,整个成果就会穿帮:
能够看到,在前几帧,能看进去简略的分层构造。又或者,简略调整一下 perspective
,设置父容器的 perspective
由 2000px
改为 500px
,穿帮成果更为显著:
也就是说,在失当的间隔,适合的角度,咱们仅仅通过很少的元素,就能在视觉上造成比拟不错的 3D 成果。
上述的残缺代码,你能够猛击这里:CSS 灵感 — 3D 文字出场动画
基于,这个技巧,咱们简略的革新一下,咱们首先替换一下文字效果:
<div>
<span class='2'>2</span>
<span class='0'>0</span>
<span class='2'>2</span>
<span class='3'>3</span>
</div>
这样,咱们就能够失去这样一种成果:
Wow,有点那个意思了。接下来,咱们须要换上喜庆的文字效果。首先,轻易在网上找一找烟花 Gif 图,兴许是这样:
咱们通过 background-clip: text
,给 3 层文字都加上相似这个成果,外围伪代码如下:
span {
position: relative;
transform-style: preserve-3d;
color: transparent;
background: url(xxx.gif);
background-clip: text;
&:after, &:before {
position: absolute;
content: attr(class);
color: transparent;
background: url(xxx.gif);
background-clip: text;
}
&:before {transform: translateZ(-12px);
}
&:after {transform: translateZ(-6px);
}
}
这样,咱们就失去了带有烟花成果的文字,以及,一点 3D 成果:
还剩下最初一步,倒影成果怎么制作呢?
办法有很多种,比拟便捷的是应用 webkit-box-reflect
元素。只须要一行代码即可:
div {
//...
-webkit-box-reflect: below -6vw linear-gradient(transparent 20%, rgba(255,255,255, .6));
}
当然,如果对两个伪元素生成的字造成的 3D 文字视觉上的厚度不称心,也能够同步去调整两个伪元素的 transform: translateZ(-6px)
的值,通过一番调整后,咱们就简略的复刻了如题图所示的 2023 3D 文字动画成果:
残缺的代码,你能够戳这里:CodePen Demo — CSS 3D 2023
最初
好了,本文到此结束,十分有意思的一个小技巧,心愿本文对你有所帮忙 :)
更多精彩 CSS 技术文章汇总在我的 Github — iCSS,继续更新,欢送点个 star 订阅珍藏。
如果还有什么疑难或者倡议,能够多多交换,原创文章,文笔无限,满腹经纶,文中若有不正之处,万望告知。