520要来了,CSS3模拟3D旋转节日表白动画特效

news2024/11/19 1:37:15

一年一度的520要来了,做为一名CSS3爱好者,怎么能不为大家的技术型表白做出一点贡献呢,这不,用CSS3模拟3D旋转的表白特效来了,快快拿去表白

目录

实现思路 

单层3D可见

HTML源代码

CSS3源代码


 

实现思路 

本文通过添加.scene类,添加.banner类,使其双层3D呈现 transform-style: preserve-3d

然后将360度切割为24份,每份占用15度,进行内容分部;

再利用 animation 配合 transform 的Y轴旋转,达到3D旋转的效果

单层3D可见

我们知道如果是2D的,就是一个平面,无法看见对面的旋转背面,所以做3D旋转很炫酷,但如果单层3D可见旋转的话,会是这个样子

.scene {
  position: relative;
  transform-style: preserve-3d;
}

但如果只保留 banner类中的3D可见,却又效果不同,但仍然不是我们想要的效果,这个时候虽然也出现了一定的3D效果,但背面却被遮挡了,我们是希望当前文案正面展示,背面的可见,达到一个真正的有角度的3D效果

.scene {
  position: relative;
  /* transform-style: preserve-3d; */
}

.banner {
  display: flex;
  transform-style: preserve-3d;
  -webkit-animation: rotate 24s infinite linear;
          animation: rotate 24s infinite linear;
}

 

HTML源代码

将360度切割为24分段,每段占用15度的位置。然后给.panel类的::before属性添加content文案 “又是一个520,做我男朋友吧”。然后再针对 :nth-child 每一个切块,做出定位,使用 left hue 和 angle 属性

最终再利用.banner 的 animation动画,辅助以 transform: rotateY 来整体实现

<div class="scene">
  <div class="banner">
   <div class="panel"></div>
   <div class="panel"></div>
   <div class="panel"></div>
   <div class="panel"></div>
   <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  <div class="panel"></div>
  </div>
</div>

CSS3源代码

body {
  background-color: #000;
  color: #fff;
  min-height: 100vh;
  display: grid;
  place-items: center;
  perspective: 500px;
  perspective-origin: 50% calc(50% - 150px);
}

.scene {
  position: relative;
  /* transform-style: preserve-3d; */
}

.banner {
  display: flex;
  transform-style: preserve-3d;
  -webkit-animation: rotate 24s infinite linear;
          animation: rotate 24s infinite linear;
}

@-webkit-keyframes rotate {
  to {
    transform: rotateY(-360deg);
  }
}

@keyframes rotate {
  to {
    transform: rotateY(-360deg);
  }
}
.panel {
  position: absolute;
  transform: translate(-50%, -50%) rotateY(var(--angle)) translateZ(190px);
  width: 50px;
  height: 120px;
  overflow: hidden;
}

.panel::before {
  position: absolute;
  left: var(--left);
  content: "又是一个520,做我男朋友吧";
  font-size: 96px;
  width: -webkit-max-content;
  width: -moz-max-content;
  width: max-content;
  color: hsl(var(--hue), 75%, 75%);
}

.panel:nth-child(1) {
  --left: 0px;
  --hue: 0;
  --angle: 0deg;
}

.panel:nth-child(2) {
  --left: -50px;
  --hue: 15;
  --angle: 15deg;
}

.panel:nth-child(3) {
  --left: -100px;
  --hue: 30;
  --angle: 30deg;
}

.panel:nth-child(4) {
  --left: -150px;
  --hue: 45;
  --angle: 45deg;
}

.panel:nth-child(5) {
  --left: -200px;
  --hue: 60;
  --angle: 60deg;
}

.panel:nth-child(6) {
  --left: -250px;
  --hue: 75;
  --angle: 75deg;
}

.panel:nth-child(7) {
  --left: -300px;
  --hue: 90;
  --angle: 90deg;
}

.panel:nth-child(8) {
  --left: -350px;
  --hue: 105;
  --angle: 105deg;
}

.panel:nth-child(9) {
  --left: -400px;
  --hue: 120;
  --angle: 120deg;
}

.panel:nth-child(10) {
  --left: -450px;
  --hue: 135;
  --angle: 135deg;
}

.panel:nth-child(11) {
  --left: -500px;
  --hue: 150;
  --angle: 150deg;
}

.panel:nth-child(12) {
  --left: -550px;
  --hue: 165;
  --angle: 165deg;
}

.panel:nth-child(13) {
  --left: -600px;
  --hue: 180;
  --angle: 180deg;
}

.panel:nth-child(14) {
  --left: -650px;
  --hue: 195;
  --angle: 195deg;
}

.panel:nth-child(15) {
  --left: -700px;
  --hue: 210;
  --angle: 210deg;
}

.panel:nth-child(16) {
  --left: -750px;
  --hue: 225;
  --angle: 225deg;
}

.panel:nth-child(17) {
  --left: -800px;
  --hue: 240;
  --angle: 240deg;
}

.panel:nth-child(18) {
  --left: -850px;
  --hue: 255;
  --angle: 255deg;
}

.panel:nth-child(19) {
  --left: -900px;
  --hue: 270;
  --angle: 270deg;
}

.panel:nth-child(20) {
  --left: -950px;
  --hue: 285;
  --angle: 285deg;
}

.panel:nth-child(21) {
  --left: -1000px;
  --hue: 300;
  --angle: 300deg;
}

.panel:nth-child(22) {
  --left: -1050px;
  --hue: 315;
  --angle: 315deg;
}

.panel:nth-child(23) {
  --left: -1100px;
  --hue: 330;
  --angle: 330deg;
}

.panel:nth-child(24) {
  --left: -1150px;
  --hue: 345;
  --angle: 345deg;
}

效果如图

 我准备了一个非常有意思的投票,大家看完了文章可以投个票哦,开心一下,一直到这里,你愿意给狗哥点个关注吗?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 中的继承和多态

C 中的继承和多态 一、继承二、函数重载、隐藏、覆盖、重写1.函数重载&#xff08;Function Overload&#xff09;2.函数隐藏&#xff08;Function Hiding&#xff09;3.函数重写与函数覆盖&#xff08;Function Override&#xff09; 三、多态四、纯虚函数和抽象类五、多重继承…

【Linux高级 I/O(1)】如何使用阻塞 I/O 与非阻塞 I/O?

本系列再次回到文件 I/O 相关话题的讨论&#xff0c;将会介绍文件 I/O 当中的一些高级用法&#xff0c;以应对不同应用场合的需求&#xff0c;主要包括&#xff1a;非阻塞 I/O、I/O 多路复用、异步 I/O、存储映射 I/O 以及文件锁。 非阻塞 I/O 关于“阻塞”一词前面已经给大家…

使用大语言模型集成工具 LangChain 创建自己的论文汇总和查询工具

Langchain可以帮助开发人员构建由大型语言模型(llm)支持的应用程序。它提供一个框架将LLM与其他数据源(如互联网或个人文件)连接起来。这允许开发人员将多个命令链接在一起&#xff0c;以创建更复杂的应用程序。包括最近比较火爆的AutoGPT等都是使用了Langchain框架进行开发的。…

【框架源码】Spring源码底层IOC容器加入对象的方式

1.Spring容器加入对象方式简介 使用XML配置文件 在XML配置文件中使用< bean >标签来定义Bean&#xff0c;通过ClassPathXmlApplicationContext等容器来加载并初始化Bean。 使用注解 使用Spring提供的注解&#xff0c;例如Component、Service、Controller、Repository等注…

一篇带你看懂什么是DesignOps(设计运营管理)

“好设计就是好生意”(Good design is good business) ----IBM创始人Thomas J. Watson早在20世纪50年代&#xff0c;IBM就开始关注好设计。IBM创始人Thomas J. Watson认为好的设计能很大程度提高产品的质量、功能和美观度&#xff0c;吸引更多的消费者和客户&#xff0c;增加销…

工程监测无线中继采集仪的寄存器(参数)汇总详解

工程监测无线中继采集仪的寄存器&#xff08;参数&#xff09;汇总详解 一、 寄存器&#xff08;参数&#xff09;汇总 无线中继采集发送仪有很多参数&#xff08;寄存器&#xff09;&#xff0c;对于一些简单的应用&#xff0c;用户无需关心这些参数&#xff0c;使用默认参数值…

【GPT-4理论篇-1】GPT-4核心技术探秘 | 京东云技术团队

前言 GPT-4已经发布有一段时间了&#xff0c;但是出于安全性等各种原因&#xff0c;OpenAI并没有公布GPT-4的技术细节和代码&#xff0c;而是仅仅给出了一个长达100页的技术报告[1]。 这个技术报告着重介绍了GPT-4的强大之处&#xff0c;仅仅给出了几个技术方向的概括&#x…

《汇编语言》- 读书笔记 - 实验

《汇编语言》- 读书笔记 - 实验 实验 1 查看 CPU 和内存&#xff0c;用机器指令和汇编指令编程1. 预备知识: Debug 的使用r 修改或显示寄存器的值d 查看内存数据e 编辑内存中指定地址的内容u 显示代码t 单步执行一条指令a 写入汇编指令g 执行到指定位置n 指定文件名L 加载文件W…

可视化大屏就是“面子工程”?那是你压根不了解大屏的真正功能

我经常收到这样的私信“企业投入可视化大屏有必要吗&#xff1f;有什么好处呢&#xff1f;”我想说在当前数据时代&#xff0c;企业提高自身竞争力多在这方面下功夫是有必要的。说“没用”的人&#xff0c;都是大屏做的失败的人群&#xff0c;其实“面子”作用确实有&#xff0…

HTTP的协议格式与Fiddler的应用

HTTP的协议格式与Fiddler的应用 &#x1f50e;HTTP协议是什么&#x1f50e;HTTP协议的工作过程&#x1f50e;HTTP的协议格式Fiddler 的应用抓包工具原理协议格式总结 &#x1f50e;结尾 &#x1f50e;HTTP协议是什么 HTTP(超文本传输协议)是一种应用非常广泛的应用层协议 对于…

栈和队列OJ题:LeetCode--20.有效的括号

朋友们、伙计们&#xff0c;我们又见面了&#xff0c;今天给大家带来的是LeetCode--20.有效的括号 数 据 结 构 专 栏&#xff1a;数据结构 个 人 主 页 &#xff1a;stackY、 LeetCode 专 栏 &#xff1a;LeetCode刷题训练营 LeetCode--20.有效的括号&#xff1a;htt…

TypeError Object of type int64 is not JSON serializable

TypeError: Object of type int64 is not JSON serializable debug解析&#xff0c;在正常处理数据过程中&#xff0c;把模型预测结果&#xff0c;其他结构化数据转为str保存时&#xff0c;常常用到 json.dumps()&#xff0c;报错内容如标题所示。 原因&#xff1a;json.dump…

Vue图片处理解决方案,一篇就够了

文章目录 一、阅读须知二、解决的问题三、知识储备四、解决方案五、核心代码六、参考资料七、FileReader()对象八、Exif库使用九、Canvas画布十、动态创建标签并添加绑定事件十一、utils方法十二、vue中图片预览十三、工具网站 一、阅读须知 小帅爆肝整理的这篇文章&#xff0c…

华为OD机试真题 Java 实现【异常的打卡记录】【2023Q1 100分】

一、题目描述 考勤记录是分析和考核职工工作时间利用情况的原始依据&#xff0c;也是计算职工工资的原始依据。 为了正确地计算职工工资和监督工资基金使用情况&#xff0c;公司决定对员工的收集打卡记录进行异常排查。 如果出现以下两种情况&#xff0c;则认为打卡异常&…

持续引领 | 通付盾入选数说安全《2023年中国网络安全市场全景图》!

5月16日&#xff0c;数说安全正式发布《2023年中国网络安全市场全景图》&#xff08;以下简称全景图&#xff09;&#xff0c;这是自2018年开始&#xff0c;数说安全发布的第六版全景图。 其中&#xff0c;通付盾入选自动化攻击防护&#xff08;Anti-Bot&#xff09;、移动应用…

【软件工程】面向对象开发全面总结

文章目录 前言一、引言二、面向对象开发的含义三、面向对象开发的原则1. 封装原则2. 继承原则3. 多态原则4. 抽象原则5. 接口隔离原则6. 依赖倒置原则 四、面向对象开发的基本原则1. 单一职责原则2. 开放封闭原则3. 里氏替换原则 五、面向对象开发的方法1. 面向对象分析&#x…

阿里云服务器安装MySQL的具体步骤

1.首先打开阿里云&#xff0c;找到自己对于的公网ip 2.这里我使用MobaXterm的远程连接工具&#xff0c;这个工具还是很不错的耶&#xff0c;就是复制上图的公网ip地址 3.填写完成之后&#xff0c;会让你输入你阿里云服务端登入的密码&#xff0c;也就是你阿里云重置实例的密码&…

深度学习的十条调参经验

目录 法则一:调参、模型和数据 1、调参是锦上添花的事 2、模型 3、数据

富文本编辑器 kindeditor 使用整理

kindeditor富文本编辑器忘记什么时候添加到项目中了&#xff0c;最近做一个功能需要在原有编辑器上自定义添加一些固定内容&#xff0c;于是对着编辑器文档研究了一番&#xff0c;在这里做一个使用方式整理。 1.下载kindeditor 下载地址如下&#xff1a; https://github.com/…

视频平台。。。。 。

1.py 读取图片视频流 from flask import Flask from flask import render_template import os images_path_list[‘D:\imgs\’filename for filename in os.listdir(‘D:\imgs\’) if filename.endswith(‘.jpg’)] print(images_path_list) def return_img_stream(img_local_p…