当前位置: 首页 > 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作为一个功能强大且应用广泛的自动化工具,不仅能在不同的浏览器中运行自动化测试,还能进行跨平台测试,并允许与多种编程语言集成。本教程将介绍如何…...

多模态2025:技术路线“神仙打架”,视频生成冲上云霄

文&#xff5c;魏琳华 编&#xff5c;王一粟 一场大会&#xff0c;聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中&#xff0c;汇集了学界、创业公司和大厂等三方的热门选手&#xff0c;关于多模态的集中讨论达到了前所未有的热度。其中&#xff0c;…...

前端倒计时误差!

提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...

Java入门学习详细版(一)

大家好&#xff0c;Java 学习是一个系统学习的过程&#xff0c;核心原则就是“理论 实践 坚持”&#xff0c;并且需循序渐进&#xff0c;不可过于着急&#xff0c;本篇文章推出的这份详细入门学习资料将带大家从零基础开始&#xff0c;逐步掌握 Java 的核心概念和编程技能。 …...

JS手写代码篇----使用Promise封装AJAX请求

15、使用Promise封装AJAX请求 promise就有reject和resolve了&#xff0c;就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

Rust 开发环境搭建

环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行&#xff1a; rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu ​ 2、Hello World fn main() { println…...

Sklearn 机器学习 缺失值处理 获取填充失值的统计值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 使用 Scikit-learn 处理缺失值并提取填充统计信息的完整指南 在机器学习项目中,数据清…...

【Linux】Linux安装并配置RabbitMQ

目录 1. 安装 Erlang 2. 安装 RabbitMQ 2.1.添加 RabbitMQ 仓库 2.2.安装 RabbitMQ 3.配置 3.1.启动和管理服务 4. 访问管理界面 5.安装问题 6.修改密码 7.修改端口 7.1.找到文件 7.2.修改文件 1. 安装 Erlang 由于 RabbitMQ 是用 Erlang 编写的&#xff0c;需要先安…...

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法

用神经网络读懂你的“心情”:揭秘情绪识别系统背后的AI魔法 大家好,我是Echo_Wish。最近刷短视频、看直播,有没有发现,越来越多的应用都开始“懂你”了——它们能感知你的情绪,推荐更合适的内容,甚至帮客服识别用户情绪,提升服务体验。这背后,神经网络在悄悄发力,撑起…...

数据分析六部曲?

引言 上一章我们说到了数据分析六部曲&#xff0c;何谓六部曲呢&#xff1f; 其实啊&#xff0c;数据分析没那么难&#xff0c;只要掌握了下面这六个步骤&#xff0c;也就是数据分析六部曲&#xff0c;就算你是个啥都不懂的小白&#xff0c;也能慢慢上手做数据分析啦。 第一…...