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

CSS实现Hover触发指定元素translateX位移的轮播交互问题

CSS轮播自定义Hover交互效果问题

现有代码

HTML

<section id="lakeSlider" class="carousel vcenter-item py-5">
    <div>
        <div class="carousel__container">
            <div class="carousel-item carousel-index1">
                <div class="card">
                    <img class="carousel-item__img img-fluid" src="./assets/images/cards/oserenfloatingcardimageindex2.png" alt="" />
                    <div class="card-body pb-0">
                        <h5 class="text-center card-title">Mila Hubert</h5>
                        <p class="card-text text-center">Sales Manager</p>
                    </div>
                </div>
            </div>
            <div class="carousel-item carousel-index2">
                <div class="card">
                    <img class="carousel-item__img img-fluid" src="./assets/images/cards/oserenfloatingcardimageindex2.png" alt="" />
                    <div class="card-body pb-0">
                        <h5 class="text-center card-title">Boris Komnenov</h5>
                        <p class="card-text text-center">Marketing Manager</p>
                    </div>
                </div>
            </div>
            <div class="carousel-item carousel-index3">
                <div class="card">
                    <img class="carousel-item__img img-fluid" src="./assets/images/cards/oserenfloatingcardimage.png" alt="" />
                    <div class="card-body pb-0">
                        <h5 class="text-center card-title">Joshua Rubens</h5>
                        <p class="card-text text-center">CEO</p>
                        <div class="cardbodydownarrow text-center m-0 p-0"><img src="./assets/images/icon/oserendownarrowpix.png" alt=""></div>
                    </div>
                </div>
            </div>
            <div class="carousel-item carousel-index4">
                <div class="card">
                    <img class="carousel-item__img img-fluid" src="./assets/images/cards/oserenfloatingcardimageindex2.png" alt="" />
                    <div class="card-body pb-0">
                        <h5 class="text-center card-title">Anna Jimenez</h5>
                        <p class="card-text text-center">Product Designer</p>
                    </div>
                </div>
            </div>
            <div class="carousel-item carousel-index5">
                <div class="card">
                    <img class="carousel-item__img img-fluid" src="./assets/images/cards/oserenfloatingcardimageindex2.png" alt="" />
                    <div class="card-body pb-0">
                        <h5 class="text-center card-title">Ben Hubert</h5>
                        <p class="card-text text-center">Programmer</p>
                    </div>
                </div>
            </div>
        </div>
    </div>
</section>

CSS

/* lakeSlider */

#lakeSlider .carousel {
    width: 100%;
    padding: 30px;
    padding-top: 80px;
    position: relative;
    -webkit-box-sizing: border-box;
    box-sizing: border-box;
}

#lakeSlider .carousel__container {
    margin: 70px 0px;
    padding-bottom: 10px;
    display: flex;
    flex-wrap: wrap;
    justify-content: center;
    align-items: center;
}

#lakeSlider .categories__title {
    color: rgb(77, 55, 102);
    font-size: 28px;
    position: absolute;
    padding-left: 30px;
}

#lakeSlider .carousel-item {
    width: 280px;
    margin: 50px 5px;
    overflow: hidden;
    display: inline-block;
    cursor: pointer;
    -webkit-transition: 1000ms all;
    transition: 1000ms all;
}

#lakeSlider .carousel-index1, #lakeSlider .carousel-index2 {
    -webkit-transform-origin: center left;
    transform-origin: center left;
}

#lakeSlider .carousel-index4, #lakeSlider .carousel-index5 {
    -webkit-transform-origin: center right;
    transform-origin: center right;
}

#lakeSlider .carousel-index3 {
    -webkit-transform-origin: center center;
    transform-origin: center center;
}

@media (min-width:960px) {
    #lakeSlider .carousel-item:hover~.carousel-item {
        -webkit-transform: translate3d(100px, 0, 0);
        transform: translate3d(100px, 0, 0);
    }

    #lakeSlider .carousel__container:hover .carousel-item {
        opacity: 0.3;
    }
}

@media (min-width:960px) {
    #lakeSlider .carousel__container:hover .carousel-item:hover {
        -webkit-transform: scale(1.3);
        transform: scale(1.3);
        opacity: 1;
    }
}

@media (max-width:960px) {
    #lakeSlider .carousel__container:hover .carousel-item:hover {
        opacity: 1;
    }
}

#lakeSlider .card-body {
    background-color: #2699FB;
    color: white;
}

#lakeSlider .card-body h5 {
    font-family: 'Poppins', sans-serif;
    font-weight: 400;
}

#lakeSlider .card-body p {
    font-family: 'Poppins', sans-serif;
    font-size: 14px;
    font-weight: 100;
}

当前效果

当hover任意卡片时,该卡片右侧的所有元素会向右移动100px。

需求效果

  • 当hover左侧前两个元素(第1、2个)时,所有右侧元素向右移动100px;
  • 当hover中间元素(第3个)时,前两个元素向左移动100px,后两个元素向右移动100px;
  • 当hover右侧后两个元素(第4、5个)时,所有左侧元素向左移动100px。

尝试过的无效代码

@media (min-width:960px) {
    #lakeSlider .carousel-index4:hover~.carousel-index1 {
        -webkit-transform: translate3d(100px, 0, 0);
        transform: translate3d(100px, 0, 0);
    }
}

解决方案

问题核心在于CSS的通用兄弟选择器(~)只能选中当前元素之后的兄弟元素,无法选中之前的。要实现选中前面的元素,可使用CSS的:has()选择器(目前主流浏览器已支持),通过父容器判断子元素的hover状态,进而控制其他子元素的样式。

替换原有媒体查询中的交互代码,使用以下CSS:

@media (min-width:960px) {
    /* 基础状态:容器hover时所有非hover元素透明度降低 */
    #lakeSlider .carousel__container:hover .carousel-item {
        opacity: 0.3;
    }
    /* hover元素本身放大且不透明 */
    #lakeSlider .carousel__container:hover .carousel-item:hover {
        transform: scale(1.3);
        opacity: 1;
    }

    /* 1. hover第1/2个元素时,右侧所有元素右移 */
    #lakeSlider .carousel__container:has(.carousel-index1:hover) .carousel-item:nth-child(n+2),
    #lakeSlider .carousel__container:has(.carousel-index2:hover) .carousel-item:nth-child(n+3) {
        transform: translate3d(100px, 0, 0);
    }

    /* 2. hover中间元素时,前两个左移,后两个右移 */
    #lakeSlider .carousel__container:has(.carousel-index3:hover) .carousel-item:nth-child(-n+2) {
        transform: translate3d(-100px, 0, 0);
    }
    #lakeSlider .carousel__container:has(.carousel-index3:hover) .carousel-item:nth-child(n+4) {
        transform: translate3d(100px, 0, 0);
    }

    /* 3. hover第4/5个元素时,左侧所有元素左移 */
    #lakeSlider .carousel__container:has(.carousel-index4:hover) .carousel-item:nth-child(-n+3),
    #lakeSlider .carousel__container:has(.carousel-index5:hover) .carousel-item:nth-child(-n+4) {
        transform: translate3d(-100px, 0, 0);
    }
}

说明

  • :has(.carousel-index1:hover) 表示当父容器中包含hover状态的.carousel-index1元素时,应用后续样式;
  • nth-child(n+2) 选中第2个及之后的元素,nth-child(-n+2) 选中第2个及之前的元素,精准控制需要移动的元素范围;
  • 保留原有过渡动画,确保交互过程平滑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 00:55:04