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

[复制链接]
发表于 2025-7-19 16:28:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
📅 我们继续 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组件实现

  1. <template>
  2.   <div
  3.     class="head-text flex h-screen items-center justify-center text-black"
  4.     ref="container"
  5.     @mousemove="handleMouseMove"
  6.     @mouseleave="resetPanels">
  7.     <!-- 左侧面板 -->
  8.     <div
  9.       ref="leftSide"
  10.       :class="[ 'relative h-full transition-all duration-700 ease-in-out', activePanel === 'left' ? 'w-3/4' : activePanel === 'none' ? 'w-1/2' : 'w-1/4' ]">
  11.       <div class="absolute inset-0 bg-[url(@/assets/ps.jpg)] bg-cover"></div>
  12.       <div class="absolute inset-0 bg-pink-300/50"></div>
  13.       <div class="absolute inset-0 flex flex-col items-center justify-center gap-10 text-white">
  14.         <p class="text-6xl font-bold">Playstation 5</p>
  15.         <button class="rounded-lg bg-pink-500 px-6 py-2 text-white transition-all hover:bg-pink-600">
  16.           BUY NOW
  17.         </button>
  18.       </div>
  19.     </div>
  20.     <!-- 右侧面板 -->
  21.     <div
  22.       ref="rightSide"
  23.       :class="[ 'relative h-full transition-all duration-700 ease-in-out', activePanel === 'right' ? 'w-3/4' : activePanel === 'none' ? 'w-1/2' : 'w-1/4' ]">
  24.       <div class="absolute inset-0 bg-[url(@/assets/xbox.jpg)] bg-cover"></div>
  25.       <div class="absolute inset-0 bg-gray-200/50"></div>
  26.       <div class="absolute inset-0 flex flex-col items-center justify-center gap-10 text-white">
  27.         <p class="text-6xl font-bold">Xbox Series X</p>
  28.         <button class="rounded-lg bg-gray-700 px-6 py-2 text-white transition-all hover:bg-gray-800">
  29.           BUY NOW
  30.         </button>
  31.       </div>
  32.     </div>
  33.   </div>
  34. </template>
复制代码

🧩 重点效果实现

  1. const handleMouseMove = (e) => {
  2.   if (!container.value) return
  3.   const containerWidth = container.value.offsetWidth
  4.   const mouseX = e.clientX
  5.   activePanel.value = mouseX < containerWidth / 2 ? 'left' : 'right'
  6. }
  7. const resetPanels = () => {
  8.   activePanel.value = 'none'
  9. }
复制代码


  • handleMouseMove:根据鼠标位置设置当前激活面板
  • resetPanels:鼠标移出容器,规复为中心对称状态

🎨 TailwindCSS 样式重点讲授

类名作用说明w-3/4、w-1/2、w-1/4控制宽度动态相应transition-all添加平滑过渡效果duration-700设置动画时长 700msease-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 添加组件预览常量:
  1. export const projectList = [
  2. {
  3.         id: 7,
  4.         title: 'Split Landing Page',
  5.         image: 'https://50projects50days.com/img/projects-img/7-split-landing-page.png',
  6.         link: 'SplitLandingPage',
  7.     },
  8. ]
复制代码
router/index.js 中添加路由选项:
  1. {
  2.         path: '/SplitLandingPage',
  3.         name: 'SplitLandingPage',
  4.         component: () => import('@/projects/SplitLandingPage.vue'),
  5.     },
复制代码

🧠 小结

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

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

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表