swiper-导航按钮位置不居中显示问题分析

◆ 问题描述

使用swiper时,如下图,发现导航按钮在【区域2】中,而不是预期中【区域1】居中位置。

◆ 问题分析

看下我的html代码,导航按钮的div标签也设置没问题。

        <div class="mySwiper4-2">
            <div class="swiper-wrapper">
                <div class="swiper-slide"><h2>Slide 1</h2></div>
                <div class="swiper-slide"><h2>Slide 2</h2></div>
                <div class="swiper-slide"><h2>Slide 3</h2></div>
                <div class="swiper-slide"><h2>Slide 4</h2></div>
                <div class="swiper-slide"><h2>Slide 5</h2></div>
                <div class="swiper-slide"><h2>Slide 6</h2></div>
                <div class="swiper-slide"><h2>Slide 7</h2></div>
                <div class="swiper-slide"><h2>Slide 8</h2></div>
                <div class="swiper-slide"><h2>Slide 9</h2></div>
            </div>
            <div class="swiper-button-next"></div>
            <div class="swiper-button-prev"></div>
        </div>

仔细观察导航样式,发现position默认设置absolute绝对定位,如下代码:

.swiper-button-next,.swiper-button-prev {
    position: absolute;
    top: var(--swiper-navigation-top-offset,50%);
    width: calc(var(--swiper-navigation-size)/ 44 * 27);
    height: var(--swiper-navigation-size);
    margin-top: calc(0px - (var(--swiper-navigation-size)/ 2));
    z-index: 10;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    /* color:var(--swiper-navigation-color,var(--swiper-theme-color)); */
}

依 CSS知识: position: absolute; 会使元素脱离正常的文档流,并且它的定位是相对于最近的已定位(position 值不为 static,如 relativeabsolutefixed 或 sticky)祖先元素。如果直接父元素的 position 属性值为 static(这是默认值),那么子元素会继续向上查找具有定位属性的祖先元素,直到找到最近的已定位祖先元素为止,并相对于该祖先元素进行定位。

如上图,由于我直接父元素没有设置position,所以继续找到其祖先元素<div id=”swiperHistory”>,就按这个区域定位导航按钮了。其导航位置也在这个【区域3】中间。

◆ 问题解决

定位到原因,所以把导航按钮修改成符合预期效果,只要在父元素设置position为相对定位即可。修改代码如下:

<div class="mySwiper4-2" style="position: relative">

再次测试,如上图所示,导航按钮符合预期效果了。