50天50個小項目 (Vue3 + Tailwindcss V4) ? | DoubleVerticalSlider(雙垂直滑塊)

📅 我們繼續 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 環境配置 …