实例详解之怎样使用css实现3D穿梭效果

本篇文章给大家带来了怎样使用css来实现星际3d穿越效果的问题,希望对大家有帮助。

实例详解之怎样使用css实现3D穿梭效果

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

这个技巧,我在 奇思妙想 CSS 3D 动画 | 仅使用 CSS 能制作出多惊艳的动画? 也有提及过,感兴趣的可以一并看看。

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

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

+7.png

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

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

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

登录后复制

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

+6.png

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

+5.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:

+4.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);  }}

登录后复制

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

+2.gif

上述的完整代码,你可以猛击这里:CSS 灵感 — 3D 宇宙时空穿梭效果

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

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

+2.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 实现上述效果:

+1.gif

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

(学习视频分享:css视频教程)

以上就是实例详解之怎样使用css实现3D穿梭效果的详细内容,更多请关注【创想鸟】其它相关文章!

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

发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2867359.html

(0)
上一篇 2025年3月10日 17:55:58
下一篇 2025年3月10日 16:02:22

AD推荐 黄金广告位招租... 更多推荐

相关推荐

  • 十分钟教会你仅使用一个div配合css实现饼状图

    本篇文章给大家带来了关于怎样使用一个div配合css实现病状图的相关问题,希望对大家有帮助。 完整的代码请滑到文末。 我们只使用一个div,仅采用css实现饼状图。 HTMl 结构 立即学习“前端免费学习笔记(深入)”; 60% 登录后复制…

    2025年3月10日 编程技术
    200
  • 聊聊利用CSS实现九宫格布局的几种方法!

    本篇文章给大家分享利用css实现九宫格布局的几种方法,并介绍一下nth-of-type 与 nth-child 的区别,希望对大家有所帮助! 最近几天刷面经常看见一道题,“九宫格布局”。自己尝试用几种办法实现了九宫格布局,发现这里面涉及了挺…

    2025年3月10日 编程技术
    200
  • 深入解析自定义的CSS重置样式

    本篇文章带大家深入解析下自定义的css重置样式,研究下其中的每一条规则,并分析下使用该规则的原因,希望对大家有所帮助! 每当我开始一个新项目时,首要的任务就是处理 CSS 语言中的那些边边角角的问题。为了解决这些问题,通常会使用自定义的一组…

    2025年3月10日 编程技术
    200
  • 手把手教你使用纯CSS仿AntDesign的Logo彩蛋效果

    怎么实现 ant design官网的logo彩蛋效果?本篇文章就来分析一下实现原理,带大家一起使用纯css来一步步实现 ant design官网logo彩蛋效果,希望对大家有所帮助! 最近项目中 Ant Design 接入比较多,还是非常不…

    2025年3月10日 编程技术
    200
  • 深入浅析css中的层叠上下文

    本篇文章带大家聊聊css中的层叠上下文,通过示例来比较一下层叠等级,希望对大家有所帮助! 前段时间,公司开始推进低代码平台业务,我有幸的参与其中。在这期间牵扯到了css的层叠上下文,并给我带来了一定的困扰,为了更好的实现业务逻辑,我觉得好好…

    2025年3月10日 编程技术
    200
  • 浅析CSS中的5种设计模式,聊聊vue项目中CSS目录代码的作用

    本篇文章带大家聊聊css中的5种设计模式,并介绍一下vue3项目中个css style目录中的代码作用,希望对大家有所帮助! 工作了几年,发现在项目中经常存在如下问题: 1.模块拆分不合理2.变量和函数命名不知所云3.缺少注释或者是写了一堆…

    2025年3月10日
    200
  • 鲜为人知!用css做极光效果

    本篇文章给大家分享使用css实现极光效果,其中主要步骤包括绘制深色背景、使用渐变画出极光的轮廓、旋转拉伸等等相关问题,希望对大家有帮助。 使用 CSS 可以实现极光吗? 像是这样: 立即学习“前端免费学习笔记(深入)”; emmm,这有点难…

    2025年3月10日 编程技术
    200
  • 你了解 Transition 吗?一起来深入了解下Transition!

    你了解 transition 吗?你可能并不了解 transition?下面本篇文章就来通过图文结合的方式带大家深入了解一下transition,希望对大家有所帮助! 这篇文章我们深入学习 Transition 动画。没错,CSS3 Tra…

    2025年3月10日 编程技术
    200
  • 详细介绍CSS渐变、阴影和滤镜

    本篇文章给大家带来了关于css中渐变、阴影和滤镜的相关知识,其中包括了线性渐变、径向渐变、圆锥渐变等等相关问题,希望对大家有帮助。 推荐学习:css 一、初识 CSS 渐变 CSS 渐变是image类型的一种特殊类型用gradient表示,…

    2025年3月10日 编程技术
    200
  • 你必须了解Selenium使用CSS定位总结

    本篇文章给大家带来了关于selenium使用css定位总结的相关知识,css定位也有它的价值,css定位更快,语法更简洁,希望对大家有帮助。 大部分人在使用selenium定位元素时,用的是xpath定位,css定位往往被忽略掉了,其实cs…

    2025年3月10日
    200

发表回复

登录后才能评论