嗨咿我是illumi,習慣Tailwind的你是否也曾經被 Swiper 的官方範例搞得頭昏腦脹?要寫一堆 CSS、還要手動建立每個 SwiperSlide,超級麻煩!我幫你改好啦~ 直接貼上就行!
import React, { useRef, useState } from 'react';
// Import Swiper React components
import { Swiper, SwiperSlide } from 'swiper/react';
// Import Swiper styles
import 'swiper/css';
import 'swiper/css/pagination';
import './styles.css';
// import required modules
import { Pagination } from 'swiper/modules';
export default function App() {
return (
<>
<Swiper
direction={'vertical'}
pagination={{
clickable: true,
}}
modules={[Pagination]}
className="mySwiper"
>
<SwiperSlide>Slide 1</SwiperSlide>
<SwiperSlide>Slide 2</SwiperSlide>
<SwiperSlide>Slide 3</SwiperSlide>
<SwiperSlide>Slide 4</SwiperSlide>
<SwiperSlide>Slide 5</SwiperSlide>
<SwiperSlide>Slide 6</SwiperSlide>
<SwiperSlide>Slide 7</SwiperSlide>
<SwiperSlide>Slide 8</SwiperSlide>
<SwiperSlide>Slide 9</SwiperSlide>
</Swiper>
</>
);
}
還要引入額外的 CSS 檔案:
import 'swiper/css/pagination';
import './styles.css'; // 還要自己寫 CSS!
// 資料和UI分離,用陣列管理
const slides = [
{
img: "",
title: "",
},
// 要新增幻燈片?直接加到陣列就好!
];
// 用 map 渲染,乾淨俐落
{slides.map((slide, idx) => (
<SwiperSlide key={idx}>
<img src={slide.img} alt={slide.title} />
</SwiperSlide>
))}
import { Swiper, SwiperSlide } from "swiper/react";
import "swiper/css";
import { Autoplay, Pagination } from "swiper/modules";
// 資料結構化管理
const slides = [
{
img: "",
title: "",
},
{
img: "",
title: "",
},
{
img: "",
title: "",
},
];
const WebSlider = () => {
return (
<div className="flex flex-col items-center justify-center font-bold bg-white/50 shadow-md backdrop-blur rounded-lg z-50 border-blue-200 border-2 overflow-hidden">
{/* 附上用 Tailwind 做瀏覽器風格的標題列 ,可刪掉 */}
<div className="flex gap-2 bg-gradient-to-r from-cyan-500 to-violet-200 px-4 py-2 w-full rounded-t-lg">
<div className="rounded-full bg-white w-3 h-3"></div>
<div className="rounded-full bg-white w-3 h-3"></div>
<div className="rounded-full bg-white w-3 h-3"></div>
</div>
{/* 垂直滑動 + 自動播放 */}
<Swiper
direction="vertical"
loop={true}
autoplay={{
delay: 2500,
disableOnInteraction: false,
}}
modules={[Autoplay, Pagination]}
grabCursor={true}
className="aspect-video"
>
{/* 用 map 渲染,告別重複程式碼 */}
{slides.map((slide, idx) => (
<SwiperSlide key={idx}>
<div className="flex flex-col shadow-md h-full items-center justify-center overflow-hidden">
<img
src={slide.img}
alt={slide.title}
className="h-full object-cover"
/>
</div>
</SwiperSlide>
))}
</Swiper>
</div>
);
};
export default WebSlider;
const slides = [
{
img: "/path/to/image",
title: "標題",
description: "描述",
},
];
優點:
className="bg-white/50 shadow-md backdrop-blur rounded-lg"
優點:
{slides.map((slide, idx) => (
<SwiperSlide key={idx}>
{/* 內容 */}
</SwiperSlide>
))}
優點:
direction="vertical"
npm install swiper
# 或
yarn add swiper
slides
陣列的內容direction="horizontal" // 改成 horizontal
autoplay={{
delay: 1000, // 改成 1 秒
disableOnInteraction: false,
}}
modules={[Autoplay]}
grabCursor={true}
loop={true}
醬就完成了!我們明天見囉~