当前位置: 首页 > news >正文

使用CSS3与JavaScript实现炫酷的3D旋转魔方及九宫格交换动效

文章目录

  • 前言
  • 一、项目需求背景
  • 二、CSS3 3D基础知识介绍
    • 2.1 什么是CSS3 3D?
    • 2.2 主要使用的CSS属性
  • 三、使用HTML和CSS搭建魔方结构
  • 四、让魔方动起来:CSS3动画
  • 五、九宫格数字交换的JavaScript实现
    • 5.1 九宫格布局
    • 5.2 随机交换数字
  • 六、随机交换与相邻格子的逻辑
  • 七、项目总结与完整代码
  • 总结


前言

在前端开发中,视觉效果的提升一直是提升用户体验的重要手段。通过CSS3和JavaScript的组合,我们可以实现很多令人惊叹的动画效果。在本文中,我们将通过一个实际的案例,展示如何实现一个旋转魔方的3D效果,并且在魔方的九宫格上随机交换数字。这个动效看似复杂,但通过合理的CSS与JavaScript编排,你会发现它不仅有趣且非常具有实用性。


一、项目需求背景

在日常的网页设计中,3D效果和动效已经逐渐成为了增强用户体验的重要元素。这次实现的效果,我希望通过一个3D魔方展示如何将CSS3的3D变换与JavaScript的动态交互相结合。魔方不仅会进行旋转,魔方面上的数字也会以随机相邻交换的方式进行变化。

二、CSS3 3D基础知识介绍

2.1 什么是CSS3 3D?

CSS3引入了transform属性,允许开发者对元素进行三维操作。我们可以通过rotateX、rotateY等方法在三维空间中旋转元素。本文中的魔方正是基于这些技术实现的,它不仅在X、Y、Z轴上进行旋转,同时使用perspective属性给予了它空间感。

2.2 主要使用的CSS属性

•	transform: 进行三维旋转、平移的核心属性。
•	transform-style: 确保元素的子元素在3D空间中呈现。
•	@keyframes: 定义动画效果的关键帧,确保魔方能流畅旋转。

三、使用HTML和CSS搭建魔方结构

在实现复杂动效前,我们首先需要搭建魔方的基础结构。魔方由6个面组成,每个面都是一个九宫格布局。具体的HTML结构如下:

<div class="magic-cube"><div class="face front"></div><div class="face back"></div><div class="face left"></div><div class="face right"></div><div class="face top"></div><div class="face bottom"></div>
</div>

每个面对应一个CSS类,通过position和transform属性定义它们在3D空间中的位置。

四、让魔方动起来:CSS3动画

使用CSS的@keyframes,我们可以让魔方进行自动旋转。通过多个关键帧的设定,魔方可以围绕X、Y、Z三个轴进行不同方向的旋转。

@keyframes complexRotate {0%   { transform: rotateX(-30deg) rotateY(-45deg) rotateZ(0deg); }100% { transform: rotateX(120deg) rotateY(180deg) rotateZ(-80deg); }
}

五、九宫格数字交换的JavaScript实现

5.1 九宫格布局

我们通过HTML动态生成九宫格的每个格子,并为每个格子指定初始的数字和位置。

positions.forEach((pos, i) => {const cell = document.createElement('div');cell.textContent = i + 1;cell.style.top = pos.top;cell.style.left = pos.left;face.appendChild(cell);
});

5.2 随机交换数字

为了让数字的变化更具动感,我们通过JavaScript随机交换相邻的格子位置。交换的动画由CSS的transition属性负责,实现平滑过渡。

六、随机交换与相邻格子的逻辑

要确保数字交换的规则是合理的,我们引入了一个函数来判断两个格子是否相邻。通过计算九宫格的行列位置,我们限制了交换只能发生在相邻的格子之间。

function areAdjacent(index1, index2) {const row1 = Math.floor(index1 / 3), col1 = index1 % 3;const row2 = Math.floor(index2 / 3), col2 = index2 % 3;return (row1 === row2 && Math.abs(col1 - col2) === 1) || (col1 === col2 && Math.abs(row1 - row2) === 1);
}

七、项目总结与完整代码

通过本文,我们实现了一个旋转魔方的3D效果,并在每个面上实现了随机相邻格子的数字交换动效。CSS3的3D技术为魔方带来了空间感,JavaScript则为九宫格的动态变化提供了强大的支持。本文的核心在于CSS3动画与JavaScript交互的结合,通过这样的小项目,你可以掌握如何实现更加复杂且富有视觉冲击力的网页效果。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>3D Magic Cube with More Tile Movements</title><style>body {display: flex;justify-content: center;align-items: center;height: 100vh;background-color: #2e3440;margin: 0;}.magic-cube {position: relative;width: 180px;height: 180px;transform-style: preserve-3d;transform: rotateX(-30deg) rotateY(-45deg);animation: complexRotate 8s infinite linear;}.face {position: absolute;width: 180px;height: 180px;display: flex;flex-wrap: wrap;perspective: 1000px;}.face div {width: calc(100% / 3);height: calc(100% / 3);display: flex;justify-content: center;align-items: center;font-size: 20px;background: rgba(255, 255, 255, 0.9);border: 1px solid #ccc;box-sizing: border-box;position: absolute;transition: all 0.5s ease;}.front  { transform: rotateY(0deg) translateZ(90px); background-color: #ff4d4d; }.back   { transform: rotateY(180deg) translateZ(90px); background-color: #4d94ff; }.left   { transform: rotateY(-90deg) translateZ(90px); background-color: #4dff4d; }.right  { transform: rotateY(90deg) translateZ(90px); background-color: #ffff4d; }.top    { transform: rotateX(90deg) translateZ(90px); background-color: #ff944d; }.bottom { transform: rotateX(-90deg) translateZ(90px); background-color: #944dff; }@keyframes complexRotate {0%   { transform: rotateX(-30deg) rotateY(-45deg) rotateZ(0deg); }25%  { transform: rotateX(30deg) rotateY(45deg) rotateZ(20deg); }50%  { transform: rotateX(60deg) rotateY(90deg) rotateZ(-40deg); }75%  { transform: rotateX(90deg) rotateY(135deg) rotateZ(60deg); }100% { transform: rotateX(120deg) rotateY(180deg) rotateZ(-80deg); }}</style>
</head>
<body><div class="magic-cube"><div class="face front"></div><div class="face back"></div><div class="face left"></div><div class="face right"></div><div class="face top"></div><div class="face bottom"></div></div><script>const positions = [{top: '0%', left: '0%'}, {top: '0%', left: '33.33%'}, {top: '0%', left: '66.66%'},{top: '33.33%', left: '0%'}, {top: '33.33%', left: '33.33%'}, {top: '33.33%', left: '66.66%'},{top: '66.66%', left: '0%'}, {top: '66.66%', left: '33.33%'}, {top: '66.66%', left: '66.66%'}];// 判断两个索引是否相邻function areAdjacent(index1, index2) {const row1 = Math.floor(index1 / 3), col1 = index1 % 3;const row2 = Math.floor(index2 / 3), col2 = index2 % 3;// 只允许水平或者垂直方向相邻,不能跨行或者跨列return (row1 === row2 && Math.abs(col1 - col2) === 1) || (col1 === col2 && Math.abs(row1 - row2) === 1);}document.addEventListener("DOMContentLoaded", () => {const faces = document.querySelectorAll('.face');// 初始化每个面九宫格faces.forEach(face => {positions.forEach((pos, i) => {const cell = document.createElement('div');cell.textContent = i + 1;cell.style.top = pos.top;cell.style.left = pos.left;face.appendChild(cell);});});// 随机交换多个相邻格子setInterval(() => {faces.forEach(face => {const cells = face.querySelectorAll('div');// 让多个相邻格子随机交换,增加动效复杂性for (let i = 0; i < 3; i++) { // 每次交换三组格子let index1 = Math.floor(Math.random() * 9);let index2 = Math.floor(Math.random() * 9);// 确保两个格子是水平或垂直相邻的while (!areAdjacent(index1, index2)) {index2 = Math.floor(Math.random() * 9);}// 获取两个相邻的格子const cell1 = cells[index1];const cell2 = cells[index2];// 交换两个格子的 top 和 left 值const tempTop = cell1.style.top;const tempLeft = cell1.style.left;cell1.style.top = cell2.style.top;cell1.style.left = cell2.style.left;cell2.style.top = tempTop;cell2.style.left = tempLeft;}});}, 1200); // 每隔1.2秒随机交换相邻格子});</script>
</body>
</html>

总结

这篇博文展示了CSS3和JavaScript结合使用的强大之处,通过这个项目,我们不仅掌握了CSS3 3D动画的基本操作,还学会了如何利用JavaScript实现页面中动态内容的变化。希望这篇文章能为你今后的项目带来一些启发,无论是复杂的动画效果还是简单的交互,CSS和JavaScript的结合总能带来惊艳的视觉效果。

相关文章:

使用CSS3与JavaScript实现炫酷的3D旋转魔方及九宫格交换动效

文章目录 前言一、项目需求背景二、CSS3 3D基础知识介绍2.1 什么是CSS3 3D&#xff1f;2.2 主要使用的CSS属性 三、使用HTML和CSS搭建魔方结构四、让魔方动起来&#xff1a;CSS3动画五、九宫格数字交换的JavaScript实现5.1 九宫格布局5.2 随机交换数字 六、随机交换与相邻格子的…...

springboot项目通过maven的profile功能实现通过不同文件夹的方式来组织不同环境配置文件

写在前面 本文看下springboot项目如何通过文件夹的方式来组织不同环境配置文件。 1&#xff1a;正文 一般的我们写springboot项目时配置文件是这个样子的&#xff1a; appliction.yaml --> 通过spring.profiles.activexxx来激活某个指定后缀的配置文件 application-evn1…...

GAN(Generative Adversarial Nets)

GAN(Generative Adversarial Nets) 引言 GAN由Ian J. Goodfellow等人提出&#xff0c;是Ian J. Goodfellow的代表作之一&#xff0c;他还出版了大家耳熟能详的花书&#xff08;Deep Learning深度学习&#xff09;&#xff0c;GAN主要的思想是同时训练两个模型&#xff0c;生成…...

linux下使用mpi求自然数和

搭建MPI并行计算环境&#xff0c;编写 MPI程序&#xff0c;求和 1 23....1 0000。 要求: 1.使用100个进程; 2.进程0计算1 2...100, 进程1计算101 102... 200, ..... 进程99计算9901 9902... 10000; 3.调用计时函数,分别输出每个进程的计算时间; 4.需使用MPI集群通信函数和同…...

WebGl学习使用attribute变量绘制一个水平移动的点

在WebGL编程中&#xff0c;attribute变量是一种特殊类型的变量&#xff0c;用于从客户端传递数据到顶点着色器。这些数据通常包括顶点的位置、颜色、纹理坐标等&#xff0c;它们是与每个顶点直接相关的信息。attribute变量在顶点着色器中声明&#xff0c;并且对于每个顶点来说都…...

机器学习四大框架详解及实战应用:PyTorch、TensorFlow、Keras、Scikit-learn

目录 框架概述PyTorch&#xff1a;灵活性与研究首选TensorFlow&#xff1a;谷歌加持的强大生态系统Keras&#xff1a;简洁明了的高层 APIScikit-learn&#xff1a;传统机器学习的必备工具实战案例 图像分类实战自然语言处理实战回归问题实战 各框架的对比总结选择合适的框架 1…...

linux源码安装slurm以及mung和openssl

一、源码安装munge 1、编译安装munge &#xff08;1&#xff09;下载munge地址&#xff1a;https://github.com/dun/munge/releases &#xff08;2&#xff09;解压编译安装&#xff1a; 1 2 3 4 5 6 7 8 创建/data目录 复制文件munge-0.5.15.tar.xz 到/data目录下 tar -Jx…...

分享蓝牙耳机A2DP音频卡顿原因及解决思路

背景 最近一直在更新博客&#xff0c;我觉得写博客有三个好处&#xff0c;一是很多东西时间久了就会忘&#xff0c;记下来方便自己以后回忆和总结&#xff0c;二是记下来可以加深自己对知识的理解&#xff0c;三是可以知识分享&#xff0c;方便他人。 言归正传&#xff0c;今天…...

Mac 下编译 libaom 源码教程

AV1 AV1是一种开放、免版税的视频编码格式&#xff0c;由开放媒体联盟&#xff08;AOMedia&#xff09;开发&#xff0c;旨在提供高压缩效率和优秀的视频质量。AV1支持多种分辨率&#xff0c;包括SD、HD、4K和8K&#xff0c;并适用于视频点播&#xff08;VOD&#xff09;、直播…...

【成品设计】基于Arduino平台的物联网智能灯

《基于Arduino平台的物联网智能灯》 整体功能&#xff1a; 这个任务中要求实现一个物联网智能灯。实际测试环境中要求设备能够自己创建一个热点&#xff0c;连接这个热点后能自动弹出控制界面&#xff08;强制门户&#xff09;。 功能点 基础功能 (60分) 要求作品至少有2个灯…...

安装和配置k8s可视化UI界面dashboard-1.20.6

安装和配置k8s可视化UI界面dashboard-1.20.6 1.环境规划2.初始化服务器1&#xff09;配置主机名2&#xff09;设置IP为静态IP3&#xff09;关闭selinux4&#xff09;配置主机hosts文件5&#xff09;配置服务器之间免密登录6&#xff09;关闭交换分区swap&#xff0c;提升性能7&…...

VLAN:虚拟局域网

VLAN:虚拟局域网 交换机和路由器协同工作后&#xff0c;将原先的一个广播域&#xff0c;逻辑上&#xff0c;切分为多个广播域。 第一步:创建VLAN [SW1]dispaly vlan 查询vlan VID&#xff08;VLAN ID&#xff09;:用来区分和标定不同的vlan 由12位二进制构成 范围: 0-4…...

利用可解释性技术增强制造质量预测模型

概述 论文地址&#xff1a;https://arxiv.org/abs/2403.18731 本研究提出了一种利用可解释性技术提高机器学习&#xff08;ML&#xff09;模型性能的方法。该方法已用于铣削质量预测&#xff0c;这一过程首先训练 ML 模型&#xff0c;然后使用可解释性技术识别不需要的特征并去…...

FlexMatch: Boosting Semi-Supervised Learning with Curriculum Pseudo Labeling

FlexMatch: Boosting Semi-Supervised Learning with Curriculum Pseudo Labeling 摘要:引言:背景3 flexMatch3.1 Curriculum Pseudo Labeling3.2 阈值预热3.3非线性映射函数实验4.1 主要结果4.2 ImageNet上的结果4.3收敛速度加速4.4 消融研究5 相关工作摘要: 最近提出的Fi…...

Spring Cloud 3.x 集成eureka快速入门Demo

1.什么是eureka&#xff1f; Eureka 由 Netflix 开发&#xff0c;是一种基于REST&#xff08;Representational State Transfer&#xff09;的服务&#xff0c;用于定位服务&#xff08;服务注册与发现&#xff09;&#xff0c;以实现中间层服务的负载均衡和故障转移&#xff…...

线性代数 矩阵

一、矩阵基础 1、定义 一组数按照矩形排列而成的数表&#xff1b;形似行列式&#xff0c;区别点是 矩阵行列式符号()或[]| |形状方阵或非方阵方阵本质数表数属性A|A|是A诸多属性中的一种维度m *n (m 与n可以相等也可以不相等)n*n 同型矩阵 若A、B两个矩阵都是mn 矩阵&#x…...

【C语言】使用结构体实现位段

文章目录 一、什么是位段二、位段的内存分配1.位段内存分配规则练习1练习2 三、位段的跨平台问题四、位段的应用五、位段使用的注意事项 一、什么是位段 在上一节中我们讲解了结构体&#xff0c;而位段的声明和结构是类似的&#xff0c;它们有两个不同之处&#xff0c;如下&…...

univer实现excel协同

快速入门 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title><script src&q…...

JavaScript进阶笔记--深入对象-内置构造函数及案例

深入对象 创建对象三种方式 利用对象字面量new Object&#xff08;{…}&#xff09;利用构造函数 // 1. 字面量创建对象const obj1 {name: pig,age: 18};console.log(obj1); // {name: "pig", age: 18}// 2. 构造函数创建对象function Pig(name, age) {this.name…...

网络爬虫自动化Selenium模拟用户操作

自动化测试和网络爬虫在现代软件开发中占据着重要的位置。它们通过自动化用户操作,减少了人工重复操作的时间成本。Selenium作为一个功能强大且应用广泛的自动化工具,不仅能在不同的浏览器中运行自动化测试,还能进行跨平台测试,并允许与多种编程语言集成。本教程将介绍如何…...

尚硅谷rabbitmq 2024 流式队列2024指定偏移量 第55节答疑

rabbitmq的stream&#xff1a; 4、对比 autoTrackingstrategy方式:始终监听Stream中的新消息(狗狗看家&#xff0c;忠于职守)指定偏移量方式:针对指定偏移量的消息消费之后就停止(狗狗叼飞盘&#xff0c;回来就完) 这两种分别怎么写&#xff1f;java 在 RabbitMQ 中&#xff0c…...

NSSCTF-WEB-pklovecloud

目录 前言 正文 思路 尝试 结尾 前言 许久未见,甚是想念. 今天来解一道有意思的序列化题 正文 思路 <?php include flag.php; class pkshow {function echo_name(){return "Pk very safe^.^";} }class acp {protected $cinder;public $neutron;public $…...

深入Postman- 自动化篇

前言 在前两篇博文《Postman使用 - 基础篇》《玩转Postman:进阶篇》中,我们介绍了 Postman 作为一款专业接口测试工具在接口测试中的主要用法以及它强大的变量、脚本功能,给测试工作人员完成接口的手工测试带来了极大的便利。其实在自动化测试上,Postman 也能进行良好的支…...

react-JSX

JSX理念 jsx在编译的时候会被babel编译为react.createELement方法 在使用jsx的文件中&#xff0c;需要引入react。import React from "react" jsx会被编译为React.createElement,所有jsx的运行结果都是react element React Component 在react中&#xff0c;常使用…...

深度对比:IPguard与Ping32在企业网络管理中的应用

随着网络安全形势日益严峻&#xff0c;企业在选择网络管理工具时需慎之又慎。IPguard与Ping32是目前市场上两款颇具代表性的产品&#xff0c;它们在功能、性能以及应用场景上各有优势。本文将对这两款产品进行深度对比&#xff0c;以帮助企业找到最合适的解决方案。 IPguard以其…...

AI测试之 TestGPT

如今最火热的技术莫非OpenAI的ChatGPT莫属&#xff0c;AI技术也在很多方面得到广泛应用。今天我们要介绍的TestGPT就是一个软件测试领域中当红的应用。 TestGPT是什么&#xff1f; TestGPT是一家总部位于以色列特拉维夫的初创公司 CodiumAI Ltd.&#xff0c;发布的一款用于测…...

JavaEE-进程与线程

1.进程 1.1什么是进程 每个应⽤程序运⾏于现代操作系统之上时&#xff0c;操作系统会提供⼀种抽象&#xff0c;好像系统上只有这个程序在运 ⾏&#xff0c;所有的硬件资源都被这个程序在使⽤。这种假象是通过抽象了⼀个进程的概念来完成的&#xff0c;进程可 以说是计算机科学…...

JAVA软开-面试经典问题(6)-equals与hashcode方法

1.equals方法 1.Object类中的equals方法比较的是两个对象的地址&#xff08;底层原理是 比较的&#xff0c;即比较的是对象的地址&#xff09; return (this obj);2.基本数据类型的包装类和String类都重写了equals方法。 基本数据类型&#xff1a;比较的是数值的是否相等 …...

计算机网络(以Linux讲解)

计算机网络 网络协议初识协议分层OSI七层模型TCP/IP五层模型--初识 网络中的地址管理IP地址MAC地址 网络传输基本流程网络编程套接字预备知识网络字节序socket编程UDP socketTCP socket地址转换函数Jsoncpp 进程间关系与守护进程进程组会话控制终端作业控制守护进程 网络命令TC…...

计算机网络基本架构知识点

1. 网络体系结构模型&#xff1a; - OSI 七层模型&#xff1a; - 物理层&#xff1a;是网络通信的基础层&#xff0c;负责在物理介质上传输比特流。该层定义了物理连接的标准&#xff0c;如电缆的类型、接口的形状、插头的规格等&#xff0c;以及信号的传输方式&#xff0c;包括…...