千家信息网

怎么用CSS创建3D穿梭效果

发表于:2025-01-20 作者:千家信息网编辑
千家信息网最后更新 2025年01月20日,这篇文章主要讲解了"怎么用CSS创建3D穿梭效果",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么用CSS创建3D穿梭效果"吧!周末在家习惯性登陆 A
千家信息网最后更新 2025年01月20日怎么用CSS创建3D穿梭效果

这篇文章主要讲解了"怎么用CSS创建3D穿梭效果",文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习"怎么用CSS创建3D穿梭效果"吧!

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

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

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

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

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

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

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

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

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 设置了不同的背景色,结果如下:

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

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

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

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

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

由于设置的 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);  }}

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

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

  • 通过叠加两组同样的效果,一组比另一组通过负的 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);  }}

这样,我们就基本还原了上述见到的网易 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 的特性,在传入的大小的高宽内,生成传入个数的点。

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

我们再把上述这个图,替换实际的星空图,主要是替换 .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 实现上述效果:

感谢各位的阅读,以上就是"怎么用CSS创建3D穿梭效果"的内容了,经过本文的学习后,相信大家对怎么用CSS创建3D穿梭效果这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是,小编将为大家推送更多相关知识点的文章,欢迎关注!

效果 元素 动画 星空 星空图 加速器 图片 变化 背景 个子 代码 实际 平面 时候 视觉 颜色 学习 控制 接下来 内容 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 如何让表格同步更新数据库 ftb服务器如何搜索 数据库软件可以应用在哪些场景 南昌世讯软件开发 北京红外农业信息系统数据库 武汉前锦网络技术有限公司 为什么服务器6区进不去 相变换热软件开发的必要性 潭州网络技术公司是干嘛的 张家港口碑好服务器高质量的选择 程序软件开发费用是多少 传统网络技术论文 杭州软件开发张继楠博士生 网络安全密码有什么用 如何做局域网内做一个共享服务器 反编译gps数据库 长春市择居网络技术有限公司 dell服务器散热器拆解 网络技术基础教程实验 电脑的网络安全模式是什么 服务器主机需要电源吗 网络安全是什么的竞争 湖北箭火网络技术怎么样 盛世通全国数据库怎么查 邵阳智能软件开发哪家便宜 朝阳区品牌软件开发技术指导 服务器人一多就卡 铁路职工网络安全意识 生鲜配送财务报表系统软件开发 南通通用软件开发价格大全
0