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

Splide Slide循环模式下设置perPage后元素点击失效问题

Splide垂直循环滑块点击失效问题解决

问题说明

使用Splide实现垂直向下(ttb)的循环滑块时,首次加载的5个元素可正常点击,但第二次循环的元素从顶部出现后,首次循环中仍处于可见状态的元素无法点击,当前屏幕上的5个可见元素里可能仅1个能点击。

解决方案

这个问题的核心是Splide的loop模式会自动克隆幻灯片实现无缝滚动,克隆的幻灯片未绑定原有的点击事件,或是克隆元素的DOM层级覆盖原元素导致点击被拦截。推荐采用以下可靠方案:

方案1:事件委托绑定点击逻辑

放弃在单个<SplideSlide>内绑定onClick,改为在父容器上通过事件委托监听点击,利用事件冒泡获取点击的图片资源。这种方式对原幻灯片和克隆幻灯片都生效,能确保所有可见图片都可点击。

修改后的完整代码:

import React from "react";
import styled from "styled-components";
import { Splide, SplideSlide } from '@splidejs/react-splide';
import { AutoScroll } from '@splidejs/splide-extension-auto-scroll';
import "@splidejs/splide/dist/css/splide.min.css";

const StyledBanner = styled.div`
    margin: 0% 0px 0% 10%;

    img{
        height: 70%;
        cursor: pointer; /* 添加上手型光标,提示元素可点击 */
    }
`

function Banner({ comics, cover1, cover2, cover3, cover4, cover5, setSelectedImage }) {
    // 通过事件委托处理所有图片点击
    const handleBannerClick = (e) => {
        if (e.target.tagName === 'IMG') {
            setSelectedImage(e.target.src);
        }
    };

    return (
        <StyledBanner onClick={handleBannerClick}>
            <Splide
                className="splide"
                aria-label="My Slide"
                options={{
                    type: 'loop',
                    direction: 'ttb',
                    throttle: 1,
                    height: '75vh',
                    drag: true,
                    focus: 'top',
                    perPage: 5,
                    arrows: false,
                    autoScroll: {
                        speed: -0.1,
                        pauseOnHover: false,
                        pauseOnFocus: false,
                    },
                }}
                extensions={{ AutoScroll }}
            >
                <SplideSlide>
                    <img src={cover1} alt="Image 1" />
                </SplideSlide>
                <SplideSlide>
                    <img src={cover2} alt="Image 2" />
                </SplideSlide>
                <SplideSlide>
                    <img src={cover3} alt="Image 3" />
                </SplideSlide>
                <SplideSlide>
                    <img src={cover4} alt="Image 4" />
                </SplideSlide>
                <SplideSlide>
                    <img src={cover5} alt="Image 5" />
                </SplideSlide>
            </Splide>
        </StyledBanner>
    );
}

export default Banner;

方案2:调整克隆元素层级(可选)

若问题是克隆元素的z-index高于原元素导致点击被拦截,可通过CSS强制设置层级:

/* 原幻灯片设置更高层级 */
.splide__slide:not(.splide__slide--clone) {
    z-index: 2;
}
/* 克隆幻灯片设置较低层级 */
.splide__slide--clone {
    z-index: 1;
}

注意:这种方式可靠性低于事件委托,因为Splide的克隆逻辑可能动态调整DOM结构,层级设置可能失效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 19:37:28