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

50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | 3dBackgroundBoxes(3D背景盒子组件)

📅 我们继续 50 个小项目挑战!—— 3dBackgroundBoxes组件

仓库地址:https://github.com/SunACong/50-vue-projects

项目预览地址:https://50-vue-projects.vercel.app/

在这里插入图片描述


使用 Vue 3<script setup> 语法结合 Tailwind CSS 来创建一个充满魔法感的交互式动画组件 —— “魔法盒子”。当你点击“Magic”按钮时,整个盒子阵列会放大并旋转,带来一种神奇的视觉体验!

准备好施展魔法了吗?让我们开始吧!✨


📝 应用目标

  • 使用 Vue 3 Composition API 管理响应式状态
  • 动态生成 4×4 的盒子网格
  • 实现点击按钮触发整体缩放与旋转动画
  • 利用背景定位实现 Gif 动画的分块显示
  • 添加 3D 边框效果增强立体感
  • 使用 Tailwind CSS 快速构建布局与过渡效果

🔧 技术实现点

技术点描述
Vue 3 <script setup>使用 refonMounted 管理状态与生命周期
响应式数据 isBigboxes控制动画状态与盒子位置
v-for 循环生成创建 16 个盒子元素
@click 事件绑定触发尺寸切换
动态类名绑定 :class根据状态切换样式
内联样式 :style精确控制每个盒子的背景位置
Tailwind 过渡动画实现平滑的尺寸与旋转变化

🖌️ 组件实现

🎨 模板结构 <template>

<template><div class="flex h-screen flex-col items-center justify-center overflow-hidden bg-gray-100"><!-- 魔法按钮 --><button@click="isBig = !isBig"class="font-poppins fixed top-5 z-50 transform rounded bg-yellow-400 px-5 py-3 text-white shadow-md transition-all duration-200 hover:shadow-lg active:translate-y-1 active:shadow-none">Magic 🎩</button><!-- 盒子容器 --><div:class="['relative flex flex-wrap justify-around transition-all duration-400',isBig ? 'h-[600px] w-[600px]' : 'h-[500px] w-[500px]',]"><!-- 动态生成盒子 --><divv-for="(box, index) in boxes":key="index":class="['relative h-[125px] w-[125px] transition-all duration-400',isBig ? 'rotate-360' : 'rotate-0',]":style="{backgroundImage: 'url(https://media.giphy.com/media/EZqwsBSPlvSda/giphy.gif)',backgroundRepeat: 'no-repeat',backgroundSize: '500px 500px',backgroundPosition: `${box.x}px ${box.y}px`,}"><!-- 3D效果伪元素通过Tailwind实现 --><divclass="absolute top-2 right-[-15px] h-full w-4 skew-y-12 transform bg-yellow-200"></div><divclass="absolute bottom-[-15px] left-2 h-4 w-full skew-x-12 transform bg-yellow-400"></div></div></div></div>
</template>

模板部分包含两个核心区域:

  1. 魔法按钮:固定在顶部,点击后切换 isBig 状态。
  2. 盒子容器:包含 16 个盒子,每个盒子显示 Gif 图片的不同区域,并带有 3D 边框。

💻 脚本逻辑 <script setup>

<script setup>import { ref, onMounted } from 'vue'// 响应式状态管理const isBig = ref(false)const boxes = ref([])// 创建盒子数据function createBoxes() {const boxArray = []for (let i = 0; i < 4; i++) {for (let j = 0; j < 4; j++) {boxArray.push({x: -j * 125,y: -i * 125,})}}boxes.value = boxArray}// 组件挂载时创建盒子onMounted(() => {createBoxes()})
</script>

脚本部分负责:

  • 定义 isBig 响应式变量控制动画状态。
  • 定义 boxes 数组存储每个盒子的背景偏移位置。
  • onMounted 钩子中调用 createBoxes() 生成 4×4 的盒子数据。

🎨 Tailwind CSS 样式重点

类名作用
h-screen设置高度为视口高度
flex-col垂直方向 Flex 布局
items-center / justify-center居中对齐
overflow-hidden隐藏溢出内容
bg-gray-100设置背景色
fixed top-5按钮固定在顶部
z-50提升按钮层级
transform启用变换
rounded圆角按钮
bg-yellow-400 / text-white按钮颜色
shadow-md / hover:shadow-lg阴影效果
active:translate-y-1按下时向下移动
active:shadow-none按下时隐藏阴影
relative / flex-wrap容器布局
transition-all duration-4000.4s 平滑过渡
h-[125px] w-[125px]固定盒子尺寸
rotate-360 / rotate-0控制旋转状态
absolute top-2 right-[-15px]创建右侧斜面
skew-y-12Y轴倾斜12度
bg-yellow-200 / bg-yellow-4003D边框颜色

🔍 关键功能解析

✅ 背景分块显示技术

通过设置 backgroundSize: '500px 500px' 并为每个盒子设置不同的 backgroundPositionx: -j * 125, y: -i * 125),实现了将一张大图(或Gif)切割成16块分别显示的效果。

✅ 动画同步控制

使用 isBig 变量统一控制容器尺寸和所有盒子的旋转状态,确保动画同步进行。

✅ 3D 边框模拟

利用两个倾斜的 div.skew-y-12.skew-x-12)模拟出立体边框效果,增强视觉层次感。


📁 常量定义 + 组件路由

constants/index.js 添加组件预览常量:

{id: 40,title: '3dBackgroundBoxes',image: 'https://50projects50days.com/img/projects-img/40-3d-background-boxes.png',link: '3dBackgroundBoxes',},

router/index.js 中添加路由选项:

{path: '/3dBackgroundBoxes',name: '3dBackgroundBoxes',component: () => import('@/projects/3dBackgroundBoxes.vue'),},

🏁 总结

想让你的魔法盒子更炫酷?试试这些扩展:

  • 添加音效:点击时播放魔法音效
  • 随机旋转角度:每个盒子旋转角度不同
  • 颜色主题切换:支持多种配色方案
  • 手势控制:支持触摸滑动触发动画
  • 粒子特效:点击时释放小星星或火花动画

👉 下一篇,我们将完成VerifyAccountUi组件,实现了一个非常使用的验证码UI组件。🚀

感谢阅读,欢迎点赞、收藏和分享 😊

http://www.lryc.cn/news/604742.html

相关文章:

  • 前端兼容性问题全面解决方案
  • Vue2-封装一个看起来像左右分布表格的表单组件
  • JetBrains Annotations:从入门到落地,彻底告别 NullPointerException
  • 2025年GEO服务商有哪些?——从技术到服务的专业分析
  • 2507C++,介绍名字对象
  • Java Stream核心:ReferencePipeline解析
  • 【WPS】邮件合并教程\Excel批量写入数据进Word模板
  • 滚珠导轨在电子制造中的流畅性优势
  • 新零售“实—虚—合”逻辑下的技术赋能与模式革新:基于开源AI大模型、AI智能名片与S2B2C商城小程序源码的研究
  • 洛谷 P11230:[CSP-J 2024 T4] 接龙 ← 图论+动态规划
  • 北京-4年功能测试2年空窗-报培训班学测开-第六十四天-准备面试项目(焦虑)-同学开始面试
  • 汽车免拆诊断案例 | 免拆诊断发动机起动困难故障2例
  • Linux730 tr:-d /-s;sort:-r,-n,-R,-o,-t,-k,-u;bash;cut:-d,-c;tee -a;uniq -c -i
  • VS Code中如何关闭Github Copilot
  • 深度学习-丢弃法 Dropout
  • MySQL索引和事务笔记
  • 开源 Arkts 鸿蒙应用 开发(十三)音频--MP3播放
  • WPFC#超市管理系统(3)商品管理
  • 【科研绘图系列】R语言绘制绝对量柱状堆积图+环形图数量统计+特数量标注
  • 潇洒郎: Kafka Ubuntu 安装部署,命令行或者python生产数据与消费数据(kafka-python)
  • 【选型】HK32L088 与 STM32F0/L0 系列 MCU 参数对比与选型建议(ST 原厂 vs 国产芯片)
  • 2025年6月数据挖掘顶刊TKDE研究热点有哪些?
  • 传输层协议UDP与TCP
  • 周期滤波策略
  • AbMole小课堂丨bFGF(FGF-2):维持干细胞培养、驱动类器官构建与细胞分化
  • 容器与虚拟机的本质差异:从资源隔离到网络存储机制
  • 如何使用 Apache Ignite 作为 Spring 框架的缓存(Spring Cache)后端
  • GitPython02-Git使用方式
  • RHCA - CL260 | Day03:配置 RHCS 集群
  • 将 qt 构建为静态库