利用纯CSS创建 3D 穿梭效果(附代码)

怎么创建3d 穿梭效果?实现一种加速动画效果?下面本篇文章就来给大家介绍一下如何使用纯css来轻松搞定它!希望对大家有所帮助!

利用纯CSS创建 3D 穿梭效果(附代码)

周末在家习惯性登陆 Apex,准备玩几盘。在登陆加速器的过程中,发现加速器到期了。

我一直用的腾讯网游加速器,然而点击充值按钮,提示最近客户端升级改造,暂不支持充值(这个操作把我震惊了~)。只能转头下载网易 UU 加速器

打开 UU 加速器首页,映入眼帘的是这样一幅画面:

立即学习“前端免费学习笔记(深入)”;

1.gif

瞬间,被它这个背景图吸引。

出于对 CSS 的敏感,盲猜了一波这个用 CSS 实现的,至少也应该是 Canvas。打开控制台,稍微有点点失望,居然是一个 .mp4文件:

2.png

再看看 Network 面板,这个 .mp4 文件居然需要 3.5M?

3.png

emm,瞬间不想打游戏了。这么个背景图,CSS 不能搞定么

使用 CSS 3D 实现星际 3D 穿梭效果

假设我们有这样一张图形:

4.png

这张图先放着备用。在使用这张图之前,我们会先绘制这样一个图形:

body {  background: #000;}.g-container {  position: relative;}.g-group {  position: absolute;  width: 100px;  height: 100px;  left: -50px;  top: -50px;  transform-style: preserve-3d;}.item {  position: absolute;  width: 100%;  height: 100%;  background: rgba(255, 255, 255, .5);}.item-right {  background: red;  transform: rotateY(90deg) translateZ(50px);}.item-left {  background: green;  transform: rotateY(-90deg) translateZ(50px);}.item-top {  background: blue;  transform: rotateX(90deg) translateZ(50px);}.item-bottom {  background: deeppink;  transform: rotateX(-90deg) translateZ(50px);}.item-middle {  background: rgba(255, 255, 255, 0.5);  transform: rotateX(180deg) translateZ(50px);}

一共设置了 5 个子元素,不过仔细看 CSS 代码,其中 4 个子元素都设置了 rotateX/Y(90deg/-90deg),也就是绕 X 轴或者 Y 轴旋转了 90°,在视觉上是垂直屏幕的一张平面,所以直观视觉上我们是不到的,只能看到一个平面 .item-middle

我将 5 个子 item 设置了不同的背景色,结果如下:

5.png

现在看来,好像平平无奇,确实也是。

不过,见证奇迹的时候来了,此时,我们给父元素 .g-container 设置一个极小的 perspective,譬如,设置一个 perspective: 4px,看看效果:

.g-container {  position: relative;+ perspective: 4px;}// ...其余样式保持不变

此时,画风骤变,整个效果就变成了这样:

6.png

由于 perspective 生效,原本的平面效果变成了 3D 的效果。接下来,我们使用上面准备好的星空图,替换一下上面的背景颜色,全部都换成同一张图,神奇的事情发生了:

7.png

由于设置的  perspective 非常之下,而每个 item 的 transform: translateZ(50px) 设置的又比较大,所以图片在视觉上被拉伸的非常厉害。但是整体是充满整个屏幕的。

接下来,我们只需要让视角动起来,给父元素增加一个动画,通过控制父元素的 translateZ() 进行变化即可:

.g-container{  position: relative;  perspective: 4px;  perspective-origin: 50% 50%;}.g-group{  position: absolute;  // ... 一些定位高宽代码  transform-style: preserve-3d;  + animation: move 8s infinite linear;}@keyframes move {  0%{    transform: translateZ(-50px) rotate(0deg);  }  100%{    transform: translateZ(50px) rotate(0deg);  }}

看看,神奇美妙的星空穿梭的效果就出来了,Amazing:

8.gif

美中不足之处在于,动画没能无限衔接上,开头和结尾都有很大的问题。

当然,这难不倒我们,我们可以:

通过叠加两组同样的效果,一组比另一组通过负的 animation-delay 提前行进,使两组动画衔接起来(一组结束的时候另外一组还在行进中)

再通过透明度的变化,隐藏掉 item-middle 迎面飞来的突兀感

最后,可以通过父元素的滤镜 hue-rotate 控制图片的颜色变化

我们尝试修改 HTML 结构如下:

修改后的核心 CSS 如下:

.g-container{  perspective: 4px;  position: relative;  // hue-rotate 变化动画,可以让图片颜色一直变换  animation: hueRotate 21s infinite linear;}.g-group{  transform-style: preserve-3d;  animation: move 12s infinite linear;}// 设置负的 animation-delay,让第二组动画提前进行.g-group:nth-child(2){  animation: move 12s infinite linear;  animation-delay: -6s;}.item {  background: url(https://z3.ax1x.com/2021/08/20/fLwuMd.jpg);  background-size: cover;  opacity: 1;  // 子元素的透明度变化,减少动画衔接时候的突兀感  animation: fade 12s infinite linear;  animation-delay: 0;}.g-group:nth-child(2) .item {  animation-delay: -6s;}@keyframes move {  0%{    transform: translateZ(-500px) rotate(0deg);  }  100%{    transform: translateZ(500px) rotate(0deg);  }}@keyframes fade {  0%{    opacity: 0;  }  25%,  60%{    opacity: 1;  }  100%{    opacity: 0;  }}@keyframes hueRotate {  0% {    filter: hue-rotate(0);  }  100% {    filter: hue-rotate(360deg);  }}

最终完整的效果如下,星空穿梭的效果,整个动画首尾相连,可以一直无限下去,几乎没有破绽,非常的赞:

9.gif

上述的完整代码,你可以猛击这里:CSS 灵感 — 3D 宇宙时空穿梭效果https://csscoco.com/inspiration/#/./3d/3d-css-galaxy-shuttle

这样,我们就基本还原了上述见到的网易 UU 加速器首页的动图背景。

更进一步,一个图片我都不想用

当然,这里还是会有读者吐槽,你这里不也用了一张图片资源么?没有那张星空图行不行?这张图我也懒得去找。

当然可以,CSS YYDS。这里我们尝试使用 box-shadow,去替换实际的星空图,也是在一个 div 标签内实现,借助了 SASS 的循环函数:

@function randomNum($max, $min: 0, $u: 1) {@return ($min + random($max)) * $u;}@function randomColor() {    @return rgb(randomNum(255), randomNum(255), randomNum(255));}@function shadowSet($maxWidth, $maxHeight, $count) {    $shadow : 0 0 0 0 randomColor();        @for $i from 0 through $count {                 $x: #{random(10000) / 10000 * $maxWidth};        $y: #{random(10000) / 10000 * $maxHeight};                $shadow: $shadow, #{$x} #{$y} 0 #{random(5)}px randomColor();    }        @return $shadow;}body {    background: #000;}div {    width: 1px;    height: 1px;    border-radius: 50%;    box-shadow: shadowSet(100vw, 100vh, 500);}

这里,我们用 SASS 封装了一个函数,利用多重 box-shadow 的特性,在传入的大小的高宽内,生成传入个数的点。

这样,我们可以得到这样一幅图,用于替换实际的星空图:

10.png

我们再把上述这个图,替换实际的星空图,主要是替换 .item 这个 class,只列出修改的部分:

// 原 CSS,使用了一张星空图.item {  position: absolute;  width: 100%;  height: 100%;  background: url(https://z3.ax1x.com/2021/08/20/fLwuMd.jpg);  background-size: cover;  animation: fade 12s infinite linear;}// 修改后的 CSS 代码.item {  position: absolute;  width: 100%;  height: 100%;  background: #000;  animation: fade 12s infinite linear;}.item::after {  content: "";  position: absolute;  top: 0;  left: 0;  right: 0;  bottom: 0;  width: 1px;  height: 1px;  border-radius: 50%;  box-shadow: shadowSet(100vw, 100vh, 500);}

这样,我们就实现了这样一个效果,在不借助额外资源的情况下,使用纯 CSS 实现上述效果:

11.gif

CodePen Demo — Pure CSS Galaxy  Shuttle 2:

https://codepen.io/Chokcoco/pen/NWvYOqW

通过调整动画的时间,perspective 的值,每组元素的 translateZ() 变化距离,可以得到各种不一样的观感和效果,感兴趣的读者可以基于我上述给的 DEMO 自己尝试尝试。

最后

好了,本文到此结束,希望本文对你有所帮助 :)

(学习视频分享:web前端教程)

以上就是利用纯CSS创建 3D 穿梭效果(附代码)的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1622119.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月24日 07:43:57
下一篇 2025年12月24日 07:44:12

相关推荐

  • css如何设置表格的右边框

    在css中,可以使用border-right属性来设置表格的右边框,该属性的作用就是指定元素右边框的宽度、样式和颜色,语法“table{border-right: 边框宽度 边框样式 边框颜色;}”。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑…

    好文分享 2025年12月24日
    000
  • css如何让导航栏变透明

    在css中,可以通过opacity属性来让导航栏变透明,只需要给导航栏元素添加“opacity: 透明度值;”样式即可;透明度值的范围是从0到1,数值越小透明度越高。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。 css让导航栏变透明的方法: …

    2025年12月24日 好文分享
    000
  • css 怎么去除a标签的手形

    css去除a标签的手形的方法:1、创建一个HTML示例文件;2、设置一个a标签;3、给a标签添加一个css属性为“cursor: default;”即可实现去除a标签手形的效果。 本文操作环境:windows7系统、css3版、Dell G3电脑。 css 怎么去除a标签的手形? 很简单,直接看下面…

    2025年12月24日
    000
  • css里怎样设置字体大小和字体颜色

    在css中,可以使用“font-size”和color属性设置字体大小和字体颜色,只需要给字体元素添加“{font-size: 字体大小值;color: 颜色值;}”样式即可。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。 css里设置字体大小…

    2025年12月24日
    000
  • css如何固定导航栏

    在css中,可以使用position属性固定导航栏;只需要给导航栏元素添加“position: fixed;”样式进行固定定位即可。固定定位会使元素固定在窗口的某个位置,即使窗口滚动也不会移动,不会对窗口其他元素造成影响。 本教程操作环境:windows7系统、CSS3&&HTML5…

    2025年12月24日
    000
  • css边框变圆角边框怎么写

    写法:1、给边框添加“border-radius:圆角值;”样式统一设置圆角大小;2、添加“border-top-left-radius:圆角值;”、“border-top-right-radius:圆角值;”等样式分别设置四角圆角大小。 本教程操作环境:windows7系统、CSS3&&a…

    2025年12月24日
    000
  • css怎么让鼠标滑过图片旋转

    在css中,可以使用“:hover”伪类选择器和transform属性实现鼠标滑过图片旋转的效果,语法为“图片元素:hover{transform:rotateZ(旋转角度);}”。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。 css怎么让鼠…

    2025年12月24日 好文分享
    000
  • css怎样设置div的最大高度

    在css中,可以利用max-height属性来设置div的最大高度,该属性的作用就是设置元素的最大高度,只需要给div元素添加“div{max-height:最大高度值;}”样式即可。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。 在css中,…

    2025年12月24日
    000
  • css鼠标指针怎么设置为图片样式

    在css中,可以利用cursor属性来设置鼠标指针为图片样式,只需要给cursor属性添加一个或多个逗号分隔的“url()”值来指定用作鼠标指针的图像即可,语法“cursor:url(图片文件路径)”。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电…

    2025年12月24日
    000
  • css如何去掉上边框

    css去掉上边框的方法:1、使用“border-top:none;”语句去除;2、利用“border-top:transparent;”语句将上边框的边框颜色设置为透明;3、利用“border-top:0;”语句将上边框的边框宽度设置为0。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日 好文分享
    000
  • css中如何设置边框大小和颜色

    css中设置边框大小和颜色的方法:1、利用border-width属性设置元素的边框大小,语法“border-width:宽度值;”;2、利用border-color属性设置边框颜色,语法“border-color: 颜色值;”。 本教程操作环境:windows7系统、CSS3&&H…

    2025年12月24日 好文分享
    000
  • css怎么清除背景图片重复

    在css中,可以利用background-repeat属性来清除背景图片重复,只需要将该属性的值设置为“no-repeat”就可指定背景图像不重复,即背景图像将仅显示一次;语法“background-repeat:no-repeat;”。 本教程操作环境:windows7系统、CSS3&&a…

    2025年12月24日
    000
  • css怎么实现鼠标经过显示离开隐藏效果

    实现方法:1、给元素添加“display: none;”样式,将元素先隐藏起来;2、使用“:hover”选择器和“display:block;”样式设置鼠标经过显示效果,语法“父元素:hover 元素{display:block;}”。 本教程操作环境:windows7系统、CSS3&&am…

    2025年12月24日
    000
  • css怎么设置文本的行距

    在css中,可以利用line-height属性来设置文本的行距,该属性的作用就是设置行间的距离、调节每行文字字体间距的,只需要给文本元素添加“line-height:间距值;”样式即可;需要注意,间距值不可为负值。 本教程操作环境:windows7系统、CSS3&&HTML5版、De…

    2025年12月24日
    000
  • css如何使鼠标悬停变色

    在css中,可以通过hover选择器和color属性实现鼠标悬停变色的效果,hover选择器用于选择鼠标指针浮动在上面的元素,color属性用于设置悬停时的颜色;语法“:hover{color:悬停颜色;}”。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell…

    2025年12月24日 好文分享
    000
  • css怎么只选择偶数行

    在css中,可以利用伪类选择器“:nth-child()”来选择偶数行,该选择器能选择表格或li等有规律元素的偶数行,语法“元素:nth-child(2n){样式}”或“元素:nth-child(even){样式}”。 本教程操作环境:windows7系统、CSS3&&HTML5版、…

    2025年12月24日 好文分享
    000
  • css怎么设置tr中的字体颜色

    在css中,可以通过给tr元素添加color属性样式来设置tr的字体颜色,具体语法格式“tr{color: 颜色值;}”;其中,颜色值可以使用颜色名、十六进制数值、RGB或RGBA、HSL等来定义。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。…

    2025年12月24日 好文分享
    000
  • css怎么设置文本两端对齐

    设置方法:1、给文本元素添加“text-align: justify;”样式;2、给文本元素添加“justify-content: space-around;”或“justify-content: space-between;”样式。 本教程操作环境:windows7系统、CSS3&&amp…

    2025年12月24日 好文分享
    000
  • css如何引入外部样式表

    引入方法:1、使用link标签引入,语法“”;2、在style标签内使用“@import”规则引入,语法“@import url(“css文件路径”);”。 本教程操作环境:windows7系统、CSS3&&HTML5版、Dell G3电脑。 外部样式表必须导…

    2025年12月24日
    000
  • css怎么加载外部字体文件

    在css中,可利用“@font-face”规则来加载外部字体文件,语法@font-face {font-family:字体名称;src:url(外部字体文件路径);[font-weight:粗细值];[font-style:样式值];}”。 本教程操作环境:windows7系统、CSS3&&…

    好文分享 2025年12月24日
    000

发表回复

登录后才能评论
关注微信