v10.1.0 中的幻灯片插槽

2023 年 8 月 1 日

问题

所有最新版本的 Safari 浏览器都存在一个错误 (#6650),即无法正确对传递给插槽中的自定义元素进行 3D 转换。

这会导致使用 3D 变换的 Swiper 效果(例如 Cube、Coverflow 和(可能)Creative Effect)出现错误的外观。

<swiper-container effect="cube">
  <!-- "perspective" prop can't be applied to these slides -->
  <swiper-slide>Slide 1</swiper-slide>
  <swiper-slide>Slide 2</swiper-slide>
  <swiper-slide>Slide 3</swiper-slide>
</swiper-container>

解决方案

在 Swiper v10.1.0 中,我们引入了幻灯片插槽来解决此问题。在这种情况下,我们不会将幻灯片放入 swiper-container 中,而只放入其内容

<swiper-container effect="cube">
  <!-- Content goes to the first slide (with index 0) -->
  <div slot="slide-0">Slide 1</div>
  <!-- Content goes to the second slide (with index 1) -->
  <div slot="slide-1">Slide 2</div>
  <!-- Content goes to the third slide (with index 2) -->
  <div slot="slide-2">Slide 3</div>
</swiper-container>

Swiper 组件将动态检查传递的幻灯片插槽元素的数量,并自动创建所需数量的幻灯片。对要使用的幻灯片插槽数量没有限制。

但在这种情况下,我们需要重新考虑幻灯片的样式,因为我们没有直接在 DOM 中幻灯片元素,而幻灯片本身现在位于影子 DOM 中。

因此建议使用幻灯片内容的一些自定义包装器,例如

<swiper-container effect="cube">
  <!-- Content goes to the first slide (with index 0) -->
  <div slot="slide-0" class="slide-content">
    <img class="slide-image" src="path/to/slide-image.jpg" />
    <div class="slide-title">Slide 1</div>
  </div>
  <!-- Content goes to the second slide (with index 1) -->
  <div slot="slide-1" class="slide-content">
    <img class="slide-image" src="path/to/slide-image.jpg" />
    <div class="slide-title">Slide 2</div>
  </div>
  <!-- Content goes to the third slide (with index 2) -->
  <div slot="slide-2" class="slide-content">
    <img class="slide-image" src="path/to/slide-image.jpg" />
    <div class="slide-title">Slide 3</div>
  </div>
  ...
</swiper-container>
<style>
  /* make sure slide content takes all available slide size */
  .slide-content {
    width: 100%;
    height: 100%;
    position: relative;
  }
  /* slide image */
  .slide-image {
    position: absolute;
    left: 0;
    top: 0;
    width: 100%;
    height: 100%;
    object-fit: cover;
  }
  /* slide title */
  .slide-title {
    color: #fff;
    position: absolute;
    left: 32px;
    bottom: 32px;
    font-weight: bold;
    font-size: 32px;
  }
</style>

现在一切都正常工作(在 Safari 中)

P.S.

并且一如既往,如果您喜欢 Swiper,请通过捐赠或认捐来支持该项目

并查看我们的高级项目

您的支持对我们意义重大!