50天50个小项目 (Vue3 + Tailwindcss V4) ✨ | Split Landing Page(拆分展示页)

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

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

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

在这里插入图片描述


在这篇文章中,我们将实现一个交互式的左右面板对比组件,当用户将鼠标悬停在某一侧时,该侧会自动扩展以获得更多展示空间,提供强烈的视觉聚焦效果 ✨

适用于:商品对比、双选项引导页面、动态首页背景等场景


🎯 组件目标

  • 左右两个全屏高度的面板
  • 鼠标悬停在任一面板上时,该面板自动扩展至 75% 宽度,另一面板缩小至 25%
  • 鼠标移出后恢复 50% 对半布局
  • 背景支持图片和透明遮罩,内容居中展示标题与按钮

🛠️ 技术实现点

  • 使用 Vue 的 ref + reactive 实现响应式状态追踪
  • 使用 TailwindCSS 原子类管理布局、动画、背景和文本样式
  • 利用 @mousemove@mouseleave 事件监听鼠标位置
  • 根据鼠标区域动态绑定 class 控制宽度动画

🧱 SplitLandingPage.vue组件实现

<template><divclass="head-text flex h-screen items-center justify-center text-black"ref="container"@mousemove="handleMouseMove"@mouseleave="resetPanels"><!-- 左侧面板 --><divref="leftSide":class="[ 'relative h-full transition-all duration-700 ease-in-out', activePanel === 'left' ? 'w-3/4' : activePanel === 'none' ? 'w-1/2' : 'w-1/4' ]"><div class="absolute inset-0 bg-[url(@/assets/ps.jpg)] bg-cover"></div><div class="absolute inset-0 bg-pink-300/50"></div><div class="absolute inset-0 flex flex-col items-center justify-center gap-10 text-white"><p class="text-6xl font-bold">Playstation 5</p><button class="rounded-lg bg-pink-500 px-6 py-2 text-white transition-all hover:bg-pink-600">BUY NOW</button></div></div><!-- 右侧面板 --><divref="rightSide":class="[ 'relative h-full transition-all duration-700 ease-in-out', activePanel === 'right' ? 'w-3/4' : activePanel === 'none' ? 'w-1/2' : 'w-1/4' ]"><div class="absolute inset-0 bg-[url(@/assets/xbox.jpg)] bg-cover"></div><div class="absolute inset-0 bg-gray-200/50"></div><div class="absolute inset-0 flex flex-col items-center justify-center gap-10 text-white"><p class="text-6xl font-bold">Xbox Series X</p><button class="rounded-lg bg-gray-700 px-6 py-2 text-white transition-all hover:bg-gray-800">BUY NOW</button></div></div></div>
</template>

🧩 重点效果实现

const handleMouseMove = (e) => {if (!container.value) returnconst containerWidth = container.value.offsetWidthconst mouseX = e.clientXactivePanel.value = mouseX < containerWidth / 2 ? 'left' : 'right'
}const resetPanels = () => {activePanel.value = 'none'
}
  • handleMouseMove:根据鼠标位置设置当前激活面板
  • resetPanels:鼠标移出容器,恢复为中间对称状态

🎨 TailwindCSS 样式重点讲解

类名作用说明
w-3/4w-1/2w-1/4控制宽度动态响应
transition-all添加平滑过渡效果
duration-700设置动画时长 700ms
ease-in-out提升动画曲线体验
absolute inset-0实现背景图和遮罩的层叠与填充
bg-[url(...)] bg-cover加载背景图并保持填充
bg-pink-300/50半透明粉色遮罩层
text-6xl font-bold设置标题文字样式
hover:bg-pink-600按钮 hover 态变色

🧾 常量定义 + 组件路由建议

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

export const projectList = [
{id: 7,title: 'Split Landing Page',image: 'https://50projects50days.com/img/projects-img/7-split-landing-page.png',link: 'SplitLandingPage',},
]

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

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

🧠 小结

通过 Vue 的响应式状态 + Tailwind 的原子类动画能力,我们成功实现了一个交互性十足的左右悬停扩展对比组件。它不仅视觉吸引力强,而且极其易于维护和扩展。如果你在构建商城首页、交互引导页或产品对比模块,这个模式可以完美复用!🚀


👉 下一篇,我们将完成一个简单灵动的 FromWave组件,适合任何表单搜集页面!🚀

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

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

相关文章

机器学习-ROC曲线​​ 和 ​​AUC指标

1. 什么是ROC曲线&#xff1f;​​ ROC&#xff08;Receiver Operating Characteristic&#xff0c;受试者工作特征曲线&#xff09;是用来评估​​分类模型性能​​的一种方法&#xff0c;特别是针对​​二分类问题​​&#xff08;比如“患病”或“健康”&#xff09;。 ​…

Docker容器创建Redis主从集群

利用虚拟机中的三个Docker容器创建主从集群&#xff0c;容器信息&#xff1a; 容器名角色IP映射端口r1master192.168.150.1017001r2slave192.168.150.1017002r3slave192.168.150.1017003 启动多个redis实例 新建一个docker-compose文件来构建主从集群&#xff1a; 文件内容&…

手写ArrayList和LinkedList

项目仓库&#xff1a;https://gitee.com/bossDuy/hand-tear-collection-series 基于b站up生生大佬&#xff1a;https://www.bilibili.com/video/BV1Kp5tzGEc5/?spm_id_from333.788.videopod.sections&vd_source4cda4baec795c32b16ddd661bb9ce865 LinkedList package com…

每日c/c++题 备战蓝桥杯(Cantor 表)

Cantor 表的探究与实现 在数学中&#xff0c;有理数的可枚举性是一个令人惊叹的结论。今天&#xff0c;就让我们一起深入探讨这个经典问题&#xff0c;并分享一段精心编写的代码&#xff0c;揭开这一数学奥秘的神秘面纱。 问题背景 在 19 世纪末&#xff0c;伟大的数学家康托…

解决idea与springboot版本问题

遇到以下问题&#xff1a; 1、springboot3.2.0与jdk1.8 提示这个包org.springframework.web.bind.annotation不存在&#xff0c;但是pom已经引入了spring-boot-starter-web 2、Error:Cannot determine path to tools.jar library for 17 (D:/jdk17) 3、Error:(3, 28) java: …

Notepad++找回自动暂存的文件

场景&#xff1a; 当你没有保存就退出Notepad&#xff0c;下次进来Notepad会自动把你上次编辑的内容显示出来&#xff0c;以便你继续编辑。除非你手动关掉当前页面&#xff0c;这样Notepad就会删除掉自动保存的内容。 问题&#xff1a; Notepad会将自动保存的文件地址,打开Note…

yolov12毕设前置知识准备 1

1 什么是目标检测呢&#xff1f; 目标检测&#xff08;Object Detection&#xff09;主要用于识别图像或视频中特定类型物体的位置&#xff0c;并标注其类别。 简单来说&#xff0c;就是让计算机像人类一样 “看懂” 图像内容&#xff0c;不仅能识别出物体&#xff08;如人、…

unix/linux source 命令,其内部结构机制

要理解 source (或 .) 命令的内部结构机制,我们需要戴上“操作系统”和“解释器设计”的眼镜,深入到 Shell 如何管理其状态以及如何执行命令的层面。 虽然我们无法直接看到 Shell 内部的 C 代码(除非我们去阅读 Bash 或 Zsh 的源码),但我们可以基于其行为和操作系统的原理…

计算机网络学习20250528

地址解析协议ARP 实现IP地址和Mac地址的转换 ARP工作原理&#xff1a; 每台主机或路由器都有一个ARP表&#xff0c;表项&#xff1a;<IP地址&#xff0c;Mac地址&#xff0c;TTL>&#xff08;TTL一般为20分钟&#xff09; 主机产生ARP查询分组&#xff0c;包含源目的IP地…

【Rust】Rust获取命令行参数以及IO操作

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

微服务中引入公共拦截器

本文使用的微服务版本为springcloudAlbaba :2021.0.4.0 微服务工程&#xff0c;一般公共的东西都放入一个工程&#xff0c;别的微服务都会引入这个工程&#xff0c;比如common-service,那么就可以在这个工程编写一个拦截器&#xff1a;&#xff0c;比如&#xff1a; public cla…

Linux SLES 系统的/var/log/下的常见文件及其作用

在 SUSE Linux Enterprise Server&#xff08;SLES&#xff09; 系统中&#xff0c;/var/log/ 目录是系统日志的集中地&#xff0c;存储了各种服务、内核、系统消息的日志。以下是一些在 /var/log/ 下常见的日志文件及其功能&#xff1a; &#x1f4c2; 常见日志文件及功能 文…

oracle goldengate同步SQL server到SQL server的实时数据同步

参考文档 https://docs.oracle.com/en/middleware/goldengate/core/19.1/oggmp/oracle-goldengate-classic-sql-server.html#GUID-948C5BEE-E7A0-4CE2-BE09-F83145677D18 https://docs.oracle.com/en/middleware/goldengate/core/21.3/ggcab/other-programs-and-settings-sql-…

语音转文字工具

平时工作和学习比较忙&#xff0c;可能没时间听讲座&#xff0c;只能看回放&#xff0c;回访也很长&#xff0c;这时&#xff0c;我们可以借助语言转文字&#xff0c;通过阅读文字快速了解讲座的重点&#xff0c;今天给大家分享一个本人经常用的语言转文字工具&#xff0c;改工…

硬件实时时钟(RTC)

硬件实时时钟&#xff08;RTC&#xff09;详解 硬件实时时钟&#xff08;Real-Time Clock&#xff0c;RTC&#xff09;是计算机主板上的一个独立计时芯片&#xff0c;用于在系统关机后持续记录时间。它不依赖操作系统&#xff0c;由纽扣电池&#xff08;如CR2032&#xff09;供…

pycharm debug的时候无法debug到指定的位置就停住不动了

报错大致是这样的&#xff0c;但是直接run没有问题&#xff0c;debug就停住不动了 Traceback (most recent call last): File "/home/mapengsen/.pycharm_helpers/pydev/_pydevd_bundle/pydevd_comm.py", line 467, in start_client s.connect((host, port)) Timeou…

Python6.1打卡(day33)

DAY 33 MLP神经网络的训练 知识点回顾&#xff1a; 1.PyTorch和cuda的安装 2.查看显卡信息的命令行命令&#xff08;cmd中使用&#xff09; 3.cuda的检查 4.简单神经网络的流程 1.数据预处理&#xff08;归一化、转换成张量&#xff09; 2.模型的定义 …

NodeJS全栈开发面试题讲解——P11消息队列(MQ)

✅ 11.1 为什么要用消息队列&#xff1f;在哪些场景下最适合&#xff1f; ✅ 作用&#xff1a; 削峰填谷&#xff1a;缓解高并发压力&#xff0c;异步处理任务&#xff08;如秒杀下单 → MQ → 异步扣库存&#xff09; 解耦服务&#xff1a;上下游解耦&#xff08;如下单服务…

mysql执行sql语句报错事务锁住

报错情况 1205 - Lock wait timeout exceeded; try restarting transaction先找出长时间运行的事务 SELECT * FROM information_schema.INNODB_TRX ORDER BY trx_started ASC;终止长时间运行的事务 KILL [PROCESS_ID];

C#集合循环删除某些行

你想要在遍历集合&#xff08;例如List&#xff09;的同时删除某些元素时&#xff0c;直接在循环中删除元素可能会导致问题&#xff0c;因为这可能会改变集合的大小和导致索引问题&#xff1b; 可以用for循环的倒序来删除&#xff1b; 如果要删除满足特定条件的所有元素&…