You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现React中横向与纵向Swiper滑块的双向联动切换?

实现横向与纵向Swiper滑块双向关联

你需要实现两个Swiper滑块的双向同步:点击横向滑块的幻灯片时,纵向滑块切换到对应项;滑动纵向滑块时,横向滑块同步激活对应项。以下是具体实现步骤和修改后的代码:

核心实现思路

  • 同时保存两个Swiper的实例,方便互相控制
  • 给横向滑块的每个幻灯片添加点击事件,触发纵向滑块跳转至对应索引
  • 监听纵向滑块的slideChange事件,同步横向滑块的激活位置
  • 配置横向滑块的幻灯片可见性监听,确保激活项正确高亮

修改后的完整代码片段

import { useState } from 'react';
import { Swiper, SwiperSlide } from 'swiper/react';
import 'swiper/css';
import 'swiper/css/scrollbar';
import SwiperCore, { Scrollbar, Pagination, Navigation } from 'swiper';

// 注册需要的模块
SwiperCore.use([Scrollbar, Pagination, Navigation]);

// 假设你的list数据已定义
const list = [
  // 示例数据项,可替换为你的实际数据
  { id: 1, title: '步骤1', content: '内容1' },
  { id: 2, title: '步骤2', content: '内容2' },
  { id: 3, title: '步骤3', content: '内容3' },
];

export default function App() {
  const [thumbsSwiper, setThumbsSwiper] = useState(null);
  const [mainSwiper, setMainSwiper] = useState(null);

  // 横向滑块点击事件:跳转到纵向对应索引
  const handleThumbClick = (index) => {
    if (mainSwiper && !mainSwiper.destroyed) {
      mainSwiper.slideTo(index);
    }
  };

  // 纵向滑块切换时,同步横向滑块的激活位置
  const handleMainSlideChange = () => {
    if (thumbsSwiper && !thumbsSwiper.destroyed) {
      const activeIndex = mainSwiper.activeIndex;
      thumbsSwiper.slideTo(activeIndex);
    }
  };

  return (
    <div className="app-container">
      {/* 横向滑块(顶部导航) */}
      <Swiper
        scrollbar={{ hide: true }}
        modules={[Scrollbar, Pagination, Navigation]}
        onSwiper={setThumbsSwiper}
        mousewheel={true}
        slidesPerView={4}
        watchSlidesProgress={true}
        watchSlidesVisibility={true}
        className="swiper-top"
      >
        {list.map((item, index) => (
          <SwiperSlide 
            key={item.id}
            onClick={() => handleThumbClick(index)}
          >
            <div className="d-flex flex-column items-center cursor-pointer">
              <span className="d-block bg-light rounded-full w-5 h-5 mx-auto "></span>
              <small className="d-block mb-0 mt-1">{item.title}</small>
            </div>
          </SwiperSlide>
        ))}
      </Swiper>

      {/* 纵向滑块(主内容区) */}
      <Swiper
        modules={[Pagination, Navigation]}
        slidesPerView={1}
        autoHeight={true}
        updateOnWindowResize={true}
        mousewheel={true}
        direction={'vertical'}
        className="swiper-main"
        onSwiper={setMainSwiper}
        onSlideChange={handleMainSlideChange}
      >
        {list.map((item) => (
          <SwiperSlide key={item.id}>
            {/* 你的Step组件,支持不同高度 */}
            <div className="p-4" style={{ minHeight: `${150 + index * 50}px`, backgroundColor: '#f5f5f5' }}>
              <h3>{item.title}</h3>
              <p>{item.content}</p>
            </div>
          </SwiperSlide>
        ))}
      </Swiper>
    </div>
  );
}

关键修改点说明

  • 新增mainSwiper状态保存纵向滑块实例,用于横向滑块点击时控制跳转
  • 给横向的SwiperSlide添加onClick事件,调用handleThumbClick方法,通过mainSwiper.slideTo(index)精准跳转到对应幻灯片
  • 纵向滑块添加onSlideChange事件,触发handleMainSlideChange,通过thumbsSwiper.slideTo(activeIndex)同步横向滑块位置
  • 横向滑块添加watchSlidesProgress和watchSlidesVisibility配置,确保当前激活的幻灯片自动添加swiper-slide-visible和swiper-slide-active类,方便样式高亮
  • 移除了原代码中的Thumbs模块依赖,因为这里需要的是双向同步控制,而非缩略图的默认关联逻辑

内容的提问来源于stack exchange,提问作者user3178479

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 07:15:06