草庐IT

css绘制3D炫动ikun

AQMAX 2023-05-18 原文

今天做一个3D版的ikun。

先准备图片一张

代码浅析

页面整体div.contrainer,舞台div.stage,控制盒子div.control,图片盒子div.imgWrap,js载入div.img列表。

<div class="contrainer">
  <div class="stage">
    <div class="control">
      <div class="imgWrap"></div>
    </div>
  </div>
</div>

先设置页面背景色以及div.contrainer固定高度,导入图片。

body {
  background: #000;
}
.contrainer {
  position: relative;
  height: 100vh;
}
.stage {
  position: relative;
  width: 100%;
  height: 100%;
  margin: 0 auto;
  perspective: 120px;
}
.stage .control {
  position: relative;
  width: 100%;
  height: 100%;
}
.stage .control .imgWrap {
  position: absolute;
  width: 100%;
  height: 100%;
  max-width: 400px;
  min-height: 400px;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%);
}
.stage .control .imgWrap .img {
  position: absolute;
  width: 100%;
  height: 100%;
  line-height: 6px;
  font-size: 12px;
  top: 0;
  left: 0;
  background: var(--ikun);
  background-position: -150px 0;
  background-repeat: no-repeat;
  background-size: auto;
  overflow: hidden;
  color: transparent;
  word-break: break-word;
}

我完成了第一步效果

接下来我们需要加一点效果,给图片div.img加一个滤镜效果filter

.stage .control .imgWrap .img{
  ...
  filter: grayscale(1) invert(1) brightness(0.5);
}

grayscale(黑白效果),值在0-1之间,0为原图,1为完全变灰(0%-100%)

invert(反转效果),值在0-1之间,0为原图,1为完全反转(0%-100%)

brightness(亮度效果),值不为负数,1为原图(百分比也可以,1=100%)
超过1,图会更明亮,0-1相当于遮罩效果
使用 filter: brightness(0.5); 就无须额外制作遮罩

接下来给div.img设置一个味蕾before,同时,也和div.img一样设置背景,并且使用背景混合模式

.stage .control .imgWrap .img::before {
  content: '';
  position: absolute;
  inset: 0;
  z-index: 1;
  background: var(--ikun), red;
  background-blend-mode: lighten;
  margin-left: 10px;
  mix-blend-mode: darken;
  background-repeat: no-repeat;
  background-size: auto;
}

mix-blend-mode是CSS3新增的一个很有意思的属性,它描述了元素的内容应该与元素的直系父元素的内容和元素的背景如何混合。我们将 PS 中图层的概念替换为 HTML 中的元素。

这样我们就得到一下效果

接下来我们给div…stage,div.control,div.imgWrap,div.img这些盒子加上transform-style: preserve-3d;属性,preserve-3d将指示元素的子元素应位于 3D 空间中,该属性不能被子元素继承,属性的效果作用于子元素,不作用于自身,要结合transform使用,否则没效果。

继续,
我们给div.img加入文字或者符号…之类的,要用到background-clip: text;将文本绘制到背景区域,

效果如下

整体效果出来了,接下来我们需要用到动画让整体动起来,CSS3中添加的新属性animation是用来为元素实现动画效果的,但是animation无法单独担当起实现动画的效果。承载动画的另一个属性——@keyframes。

@keyframes rotate {
  0% {
    transform: rotateY(0deg);
  }
  50% {
    transform: rotateY(-360deg);
  }
  100% {
    transform: rotateY(-720deg);
  }
}
@keyframes filterChange {
  100% {
    filter: grayscale(1) invert(1) brightness(3);
  }
}

效果如下

这是一个div.img得到的效果,那么我们多加几个?我们使用js将div.img添加到div.imgWrap中,

 for(let i=0;i<8;i++){

      let div = document.createElement("div")
      div.className = 'img'
      div.innerText = '..........................................'
      document.getElementsByClassName('imgWrap')[0].appendChild(div)
  }

用js添加了div.img,我们还需要给每个div.img设置transform: rotateY() translateZ();rotateY是Y轴的旋转角度,translateZ是往Z轴移动,

stage .control .imgWrap .img:nth-child(1) {
  transform: rotateY(80deg) translateZ(482.84px);
  animation: filterChange 0.5s 500ms infinite linear; 
}
.stage .control .imgWrap .img:nth-child(2) {
  transform: rotateY(125deg) translateZ(482.84px);
  animation: filterChange 0.5s 500ms infinite linear;
}
.stage .control .imgWrap .img:nth-child(3) {
  transform: rotateY(170deg) translateZ(482.84px);
  animation: filterChange 0.5s 500ms infinite linear;
}
.stage .control .imgWrap .img:nth-child(4) {
  transform: rotateY(215deg) translateZ(482.84px);
  animation: filterChange 0.5s 500ms infinite linear;
}
.stage .control .imgWrap .img:nth-child(5) {
  transform: rotateY(260deg) translateZ(482.84px);
  animation: filterChange 0.5s 500ms infinite linear;
}
.stage .control .imgWrap .img:nth-child(6) {
  transform: rotateY(305deg) translateZ(482.84px);
  animation: filterChange 0.5s 500ms infinite linear;
}
.stage .control .imgWrap .img:nth-child(7) {
  transform: rotateY(350deg) translateZ(482.84px);
  animation: filterChange 0.5s 500ms infinite linear;
}
.stage .control .imgWrap .img:nth-child(8) {
  transform: rotateY(395deg) translateZ(482.84px);
  animation: filterChange 0.5s 500ms infinite linear;
}

css写太麻烦了,我们可以用less这样写方便快捷

.loop(@n,@i:1) when(@i<=@n){
    .img:nth-child(@{i}){
        transform: rotateY(35 + (@i * 45deg)) translateZ(482.84px) ;
        animation: filterChange .5s 500ms infinite linear;
    }
    .loop(@n,(@i)+1)
}
.loop(8)

最后就得到了我们开头看到的效果

结尾

其实做这个我也看了很多知识,受益良多。

一起学习,一起努力,共同进步,

学无止境,学无止境,学无止境。

—— END ——

有关css绘制3D炫动ikun的更多相关文章

  1. ruby - capybara field.has_css?匹配器 - 2

    我在MiniTest::Spec和Capybara中使用以下规范:find_field('Email').must_have_css('[autofocus]')检查名为“电子邮件”的字段是否具有autofocus属性。doc说如下:has_css?(path,options={})ChecksifagivenCSSselectorisonthepageorcurrentnode.据我了解,字段“Email”是一个节点,因此调用must_have_css绝对有效!我做错了什么? 最佳答案 通过JonasNicklas得到了答案:No

  2. css - 用 watir 检查标签类? - 2

    我有一个div,它根据表单是否正确提交而改变。我想知道是否可以检查类的特定元素?开始元素看起来像这样。如果输入不正确,添加错误类。 最佳答案 试试这个:browser.div(:id=>"myerrortest").class_name更多信息:http://watir.github.com/watir-webdriver/doc/Watir/HTMLElement.html#class_name-instance_method另一种选择是只查看具有您期望的类的div是否存在browser.div((:id=>"myerrortes

  3. 世界前沿3D开发引擎HOOPS全面讲解——集3D数据读取、3D图形渲染、3D数据发布于一体的全新3D应用开发工具 - 2

    无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD

  4. FOHEART H1数据手套驱动Optitrack光学动捕双手运动(Unity3D) - 2

    本教程将在Unity3D中混合Optitrack与数据手套的数据流,在人体运动的基础上,添加双手手指部分的运动。双手手背的角度仍由Optitrack提供,数据手套提供双手手指的角度。 01  客户端软件分别安装MotiveBody与MotionVenus并校准人体与数据手套。MotiveBodyMotionVenus数据手套使用、校准流程参照:https://gitee.com/foheart_1/foheart-h1-data-summary.git02  数据转发打开MotiveBody软件的Streaming,开始向Unity3D广播数据;MotionVenus中设置->选项选择Unit

  5. Unity 3D 制作开关门动画,旋转门制作,推拉门制作,门把手动画制作 - 2

    Unity自动旋转动画1.开门需要门把手先动,门再动2.关门需要门先动,门把手再动3.中途播放过程中不可以再次进行操作觉得太复杂?查看我的文章开关门简易进阶版效果:如果这个门可以直接打开的话,就不需要放置"门把手"如果门把手还有钥匙需要旋转,那就可以把钥匙放在门把手的"门把手",理论上是可以无限套娃的可调整参数有:角度,反向,轴向,速度运行时点击Test进行测试自己写的代码比较垃圾,命名与结构比较拉,高手轻点喷,新手有类似的需求可以拿去做参考上代码usingSystem.Collections;usingSystem.Collections.Generic;usingUnityEngine;u

  6. [Vuforia]二.3D物体识别 - 2

    之前说过10之后的版本没有3dScan了,所以还是9.8的版本或者之前更早的版本。 3d物体扫描需要先下载扫描的APK进行扫面。首先要在手机上装一个扫描程序,扫描现实中的三维物体,然后上传高通官网,在下载成UnityPackage类型让Unity能够使用这个扫描程序可以从高通官网上进行下载,是一个安卓程序。点到Tools往下滑,找到VuforiaObjectScanner下载后解压数据线连接手机,将apk文件拷入手机安装然后刚才解压文件中的Media文件夹打开,两个PDF图打印第一张A4-ObjectScanningTarget.pdf,主要是用来辅助扫描的。好了,接下来就是扫描三维物体。将瓶

  7. ruby-on-rails - Assets 管道损坏 : Not compiling on the fly css and js files - 2

    我开始了一个新的Rails3.2.5项目,Assets管道不再工作了。CSS和Javascript文件不再编译。这是尝试生成Assets时日志的输出:StartedGET"/assets/application.css?body=1"for127.0.0.1at2012-06-1623:59:11-0700Servedasset/application.css-200OK(0ms)[2012-06-1623:59:11]ERRORNoMethodError:undefinedmethod`each'fornil:NilClass/Users/greg/.rbenv/versions/1

  8. ruby-on-rails - Rails - 理解 application.js 和 application.css - 2

    rails新手。只是想了解\assests目录中的这两个文件。例如,application.js文件有如下行://=requirejquery//=requirejquery_ujs//=require_tree.我理解require_tree。只是将所有JS文件添加到当前目录中。根据上下文,我可以看出requirejquery添加了jQuery库。但是它从哪里得到这些jQuery库呢?我没有在我的Assets文件夹中看到任何jquery.js文件——或者直接在我的整个应用程序中没有看到任何jquery.js文件?同样,我正在按照一些说明安装TwitterBootstrap(http:

  9. css - Rails 4.1 和 Bootstrap 3 字形图标不工作 - 2

    我正在尝试消除使用Bootstrap3的Rails4元素中的glyphicon错误。我没有使用任何Bootstrapgem将其添加到Assets管道中。我手动将bootstrap.css和bootstrap.js添加到各自的app/assets目录下,分别添加到application.css和application.js什么的我现在在网络浏览器的控制台中看到以下内容:GEThttp://localhost:3000/fonts/glyphicons-halflings-regular.woff404(NotFound)localhost/:1GEThttp://localhost:30

  10. python - Ruby 或 Python 的 3d 游戏引擎? - 2

    关闭。这个问题不符合StackOverflowguidelines.它目前不接受答案。要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于StackOverflow来说是偏离主题的,因为它们往往会吸引自以为是的答案和垃圾邮件。相反,describetheproblem以及迄今为止为解决该问题所做的工作。关闭9年前。Improvethisquestion是否有适用于这些的3d游戏引擎?

随机推荐