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

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

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

在这里插入图片描述


使用 Vue 3 的 Composition API(<script setup>)结合 TailwindCSS 创建一个全屏、左右联动的垂直轮播组件。左侧为文字内容,右侧为图片展示,两者通过按钮控制上下滑动切换。

这种设计非常适合用于企业官网首页、产品介绍页、作品集展示等需要视觉冲击力的页面。


🎯 组件目标

  • 创建一个全屏垂直轮播组件
  • 左右区域内容联动滑动
  • 支持点击按钮切换当前 Slide
  • 使用 Vue 响应式变量管理状态
  • 使用 TailwindCSS 快速构建布局和动画
  • 实现优雅的滑动过渡效果

⚙️ 技术实现点

技术点描述
Vue 3 <script setup>使用响应式变量管理当前 slide 索引
ref 响应式变量控制当前激活的 slide 索引 (activeSlideIndex)
动态类绑定 :class控制当前 slide 的层级和动画状态
内联样式绑定 :style动态设置每个 slide 的背景色或图片及位移动画
按钮事件绑定 @click触发上一页/下一页切换
TailwindCSS 布局类构建全屏容器、左右分栏、居中对齐
TailwindCSS 过渡类添加平滑的滑动动画

🧱 组件实现

模板结构 <template>

<template><div class="relative flex h-screen w-screen overflow-hidden"><!-- 左侧 --><div class="relative h-full w-[35%] overflow-hidden"><divv-for="(slide, index) in leftSlides":key="index"class="absolute inset-0 flex flex-col items-center justify-center text-white transition-all duration-500 ease-in-out":class="[index === activeSlideIndex ? 'z-10' : 'pointer-events-none z-0']":style="{backgroundColor: slide.bgColor,transform: `translateY(${-(index - activeSlideIndex) * 100}%)`,}"><h1 class="-mt-8 mb-2 text-4xl">{{ slide.title }}</h1><p class="text-lg">{{ slide.description }}</p></div><!-- 向下按钮 --><div class="absolute top-1/2 right-0 z-20 -translate-y-1/2"><buttonclass="rounded-l-md bg-white p-4 text-gray-500 shadow hover:text-black"@click="changeSlide('down')">👇</button></div></div><!-- 右侧 --><div class="relative h-full w-[65%] overflow-hidden"><divv-for="(slide, index) in rightSlides":key="index"class="absolute inset-0 h-full w-full bg-cover bg-center bg-no-repeat transition-all duration-500 ease-in-out":class="[index === activeSlideIndex ? 'z-10' : 'pointer-events-none z-0']":style="{backgroundImage: `url(${slide.imageUrl})`,transform: `translateY(${(index - activeSlideIndex) * 100}%)`,}"></div><!-- 向上按钮 --><div class="absolute top-1/2 left-0 z-20 -translate-y-1/2"><buttonclass="rounded-r-md bg-white p-4 text-gray-500 shadow hover:text-black"@click="changeSlide('up')">👆</button></div></div></div>
</template>

脚本逻辑 <script setup>

<script setup>
import { ref } from 'vue'const activeSlideIndex = ref(0)const leftSlides = [{ title: 'Flying eagle', description: 'in the sunset', bgColor: '#FFB866' },{ title: 'Lonely castle', description: 'in the wilderness', bgColor: '#252E33' },{ title: 'Bluuue Sky', description: "with it's mountains", bgColor: '#2A86BA' },{ title: 'Nature flower', description: 'all in pink', bgColor: '#FD3555' },
]const rightSlides = [{imageUrl:'https://images.unsplash.com/photo-1508768787810-6adc1f613514?auto=format&fit=crop&w=1350&q=80',},{imageUrl:'https://images.unsplash.com/photo-1519981593452-666cf05569a9?auto=format&fit=crop&w=715&q=80',},{imageUrl:'https://images.unsplash.com/photo-1486899430790-61dbf6f6d98b?auto=format&fit=crop&w=1002&q=80',},{imageUrl:'https://images.unsplash.com/photo-1510942201312-84e7962f6dbb?auto=format&fit=crop&w=1050&q=80',},
]function changeSlide(direction) {if (direction === 'up') {activeSlideIndex.value = (activeSlideIndex.value + 1) % leftSlides.length} else {activeSlideIndex.value =(activeSlideIndex.value - 1 + leftSlides.length) % leftSlides.length}
}
</script>

🔍 重点效果实现

✅ 全屏容器布局

我们使用了以下结构创建全屏容器:

<div class="relative flex h-screen w-screen overflow-hidden">

这样可以确保整个组件占满浏览器视口,同时防止滚动条出现。

💡 左右区域联动滑动

通过 transform: translateY(...) 来实现滑动动画:

transform: `translateY(${-(index - activeSlideIndex) * 100}%)`

左侧向上滑动时,文字向上;右侧向下,图片向上,形成“联动”视觉效果。

🎮 按钮控制滑动方向

通过两个按钮分别控制上一张和下一张:

function changeSlide(direction) {if (direction === 'up') {activeSlideIndex.value = (activeSlideIndex.value + 1) % leftSlides.length} else {activeSlideIndex.value =(activeSlideIndex.value - 1 + leftSlides.length) % leftSlides.length}
}

实现了循环切换功能,避免索引越界。


🎨 TailwindCSS 样式重点讲解

类名作用
flex h-screen w-screen全屏 Flex 容器
overflow-hidden防止内容溢出
absolute inset-0绝对定位,覆盖父容器
transition-all duration-500 ease-in-out平滑动画过渡
bg-cover, bg-center, bg-no-repeat图片自适应背景
text-white, text-4xl文字样式
rounded-l-md, p-4, hover:text-black按钮样式
top-1/2 -translate-y-1/2居中垂直定位按钮

这些 TailwindCSS 类帮助我们快速构建了一个美观、响应式的全屏轮播组件。


📁 数据分离建议(可选)

你可以将 leftSlidesrightSlides 提取到单独的 JSON 文件中,便于维护和国际化:

// slides.js
export const leftSlides = [{ title: 'Flying eagle', description: 'in the sunset', bgColor: '#FFB866' },...
]

并在组件中导入:

import { leftSlides, rightSlides } from '@/data/slides'

📁 常量定义 + 组件路由

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

{id: 26,title: 'Double Vertical Slider',image: 'https://50projects50days.com/img/projects-img/26-double-vertical-slider.png',link: 'DoubleVerticalSlider',},

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

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


🏁 总结

Vue 3 和 TailwindCSS 的全屏垂直轮播组件不仅实现了左右联动的滑动效果,还展示了如何通过响应式数据驱动 UI 变化。

适合用于需要高视觉表现力的网页场景,如企业主页、产品介绍页、摄影作品展示等。

你可以进一步扩展此组件的功能包括:

  • ✅ 自动播放(定时切换)
  • ✅ 支持键盘上下键切换
  • ✅ 添加分页指示器(圆点或数字)
  • ✅ 支持触摸滑动(移动端适配)
  • ✅ 将组件封装为 <AppCarousel /> 可复用组件

👉 下一篇,我们将完成ToastNotification组件,一个非常有趣的气泡消息通知。🚀

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

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

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

相关文章

mysql join语句、全表扫描 执行优化与访问冷数据对内存命中率的影响

文章目录join执行逻辑Index Nested_Loop Join&#xff08;NLJ&#xff09;MMR(Mutli-Range Read) 优化BKA(Batched Key Access)算法Simple Nested_Loop JoinBlock Nested-Loop Join&#xff08;BLJ&#xff09;join buffer 一次放不下 驱动表join buffer优化的影响&#xff1a;…

【LeetCode100】--- 1.两数之和【复习回滚】

题目传送门 解法一&#xff1a;暴力枚举&#xff08;也是最容易想到的&#xff09; class Solution {public int[] twoSum(int[] nums, int target) {int n nums.length;for(int i 0; i < n; i){for(int j i1; j<n; j){if(nums[i] nums[j] target){return new int…

opencv提取png线段

import cv2 import matplotlib.pyplot as plt import numpy as np# 读取图像 image cv2.imread(./data/1.png) if image is None:print("无法读取图像文件") else:# 转换为灰度图像gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)# 使用Canny边缘检测edges cv2.Can…

计算机网络:概述层---计算机网络概念解析

计算机网络的概念详解 &#x1f4c5; 更新时间&#xff1a;2025年07月6日 &#x1f3f7;️ 标签&#xff1a;计算机网络 | 网络基础 | 互联网 | TCP/IP | 路由器 文章目录前言一、计算机网络的发展历程二、什么是计算机网络&#xff1f;1. 计算机网络的基本功能2. 计算机网络的…

springMVC04-Filter过滤器与拦截器

一、Filter&#xff08;过滤器&#xff09;和 Interceptor&#xff08;拦截器&#xff09;在 SpringMVC 中&#xff0c;Filter&#xff08;过滤器&#xff09;和 Interceptor&#xff08;拦截器&#xff09;都是对请求和响应进行预处理和后处理的重要工具&#xff0c;但它们存在…

STM32第十九天 ESP8266-01S和电脑实现串口通信(2)

1&#xff1a;UDP 传输UDP 传输不不区分 server 或者 client &#xff0c;由指令 ATCIPSTART 建⽴立传输。 1. 配置 WiFi 模式 ATCWMODE3 // softAPstation mode 响应 : OK 2. 连接路路由器器 ATCWJAP"SSID","password" // SSID and password of router 响…

大健康IP如何用合规运营打破“信任危机”|创客匠人

一、行业乱象下的信任裂痕当前大健康领域私域直播乱象频发&#xff0c;部分机构利用“假专家义诊”“限量抢购”等话术&#xff0c;将低成本保健品高价卖给老人&#xff0c;甚至有技术公司提供“全链路坑老方案”&#xff0c;加剧行业信任危机。这种短视行为不仅损害消费者权益…

MySQL(122)如何解决慢查询问题?

解决慢查询问题通常涉及到多种技术和方法&#xff0c;以确保数据库查询的高效性和响应速度。以下是详细步骤和示例代码&#xff0c;阐述如何解决慢查询问题。 一. 慢查询的常见原因 缺少索引&#xff1a;查询未使用索引或索引未优化。查询不当&#xff1a;查询语句本身书写不合…

esp32在vscode中仿真调试

此方法可以用在具有usb serial jtag功能的esp32芯片用&#xff0c;支持型号&#xff1a; ESP32-C3 ESP32-S3 ESP32-C6 ESP32-H2 ESP32-C5 USB Serial JTAG功能介绍&#xff1a; 从硬件角度&#xff1a; 它是ESP32芯片内置的硬件功能 不是一个独立的物理接口 是通过USB接口实…

蓝桥云课 矩形切割-Java

目录 题目链接 题目 解题思路 代码 题目链接 竞赛中心 - 蓝桥云课 题目 解题思路 找最大的正方形就是大边-n个小边&#xff0c;直至相等或者小于1 代码 import java.util.Scanner; // 1:无需package // 2: 类名必须Main, 不可修改public class Main {public static voi…

PostgreSQL 锁等待监控,查找等待中的锁

直接贴SQLWITH RECURSIVE l AS (SELECT pid, locktype, mode, granted, ROW(locktype,database,relation,page,tuple,virtualxid,transactionid,classid,objid,objsubid) objFROM pg_locks ), pairs AS (SELECT w.pid waiter, l.pid locker, l.obj, l.modeFROM l wJOIN l ON l.…

Elasticsearch 字符串包含子字符串:高级查询技巧

作者&#xff1a;来自 Elastic Justin Castilla 想要获得 Elastic 认证&#xff1f;看看下一次 Elasticsearch Engineer 培训什么时候开始吧&#xff01; Elasticsearch 拥有大量新功能&#xff0c;可以帮助你为你的使用场景构建最佳的搜索解决方案。深入了解我们的示例 noteb…

Vue、Laravel 项目初始化命令对比 / curl 命令/ CORS 机制总结与案例

前言一个疑问衍生出另一个疑问再衍生出又一个疑问&#xff0c;于是有了这篇文章。一、Vue 项目初始化命令 基于 Vite 创建 Vue 项目 命令&#xff1a;npm create vitelatest my-project -- --template vue适用场景&#xff1a;需轻量级、高速开发环境关键点&#xff1a;使用 Vi…

Jenkins 流水线配置

Jenkinsfile dsl文件:pipeline {// 指定任务在哪个集群节点执行agent any// 声明全局变量environment {keyvalueAPPLICATION_NAMEspringboot-demo // 项目名称HOST_PORT7777 // 宿主机暴露服务端口CONTAINER_PORT8080 // 容器内部服务端口…

服务器重装后如何“复活”旧硬盘上的 Anaconda 环境?—— 一次完整的排错与恢复记录

目录 摘要 一、 背景&#xff1a;熟悉的陌生人 二、 问题浮现&#xff1a;一次次失败的尝试 问题一&#xff1a;source activate 失效&#xff0c;被写死的旧路径 问题二&#xff1a;官方安装器修复失败&#xff0c;神秘的“进程池损坏” 问题三&#xff1a;核心脚本也“背…

Redis的多并发实际业务场景下的使用分析:布隆过滤器

文章目录前言什么是布隆过滤器项目中引入布隆过滤器与缓存结合的最佳实践场景&#xff1a;高并发用户访问商品详情页&#xff08;防止缓存穿透&#xff09;总结&#xff1a;前言 okok 我们已经学完了 所有的redis中的常用的数据结构 下面就是进阶 我会用一系列的例子 去讲解 如…

【AI】人工智能领域关键术语全解析

一、前言 人工智能&#xff08;AI&#xff09;作为当今最热门的技术领域之一&#xff0c;正在深刻改变着我们的生活和工作方式。然而&#xff0c;对于初学者或非技术背景的人士来说&#xff0c;理解AI领域的专业术语可能是一项挑战。本文旨在全面解析人工智能领域的关键术语&a…

【Linux基础知识系列】第四十三篇 - 基础正则表达式与 grep/sed

在Linux系统中&#xff0c;正则表达式是一种强大的文本处理工具&#xff0c;广泛用于文本搜索、替换和批量处理。通过掌握基础正则表达式的语法&#xff0c;结合grep和sed命令&#xff0c;用户可以高效地完成复杂的文本处理任务。无论是数据分析师、软件开发者还是系统管理员&a…

SIMATIC S7-1200的以太网通信能力:协议与资源详细解析

SIMATIC S7-1200的以太网通信能力&#xff1a;协议与资源解析 在工业自动化领域&#xff0c;PLC的通信能力往往直接影响着整个控制系统的灵活性与高效性。西门子SIMATIC S7-1200系列PLC作为一款广泛应用的中小型控制器&#xff0c;其强大的以太网通信功能是其核心优势之一。本文…

什么是高防 IP?从技术原理到实战部署的深度解析

目录 前言 一、高防 IP 的定义与核心价值 二、高防 IP 的技术原理与架构 2.1 流量牵引技术 2.2 流量清洗引擎 2.3 回源机制 三、高防 IP 的核心防护技术详解 3.1 DDoS 攻击防御技术 3.2 高防 IP 的弹性带宽设计 四、实战&#xff1a;基于 Linux 的高防 IP 环境配置 …