css marin-right on:last-of-type不仅适用于Safari和iOS

mzsu5hc0  于 2023-10-21  发布在  iOS
关注(0)|答案(1)|浏览(125)

我有一个英雄形象的水平滑块。在iOS(和Safari)上,看起来最后一张图像没有考虑margin-right: $custom-offset;的margin-right。第二个英雄图像也应该居中,就像第一个英雄图像一样。

当我在DOM中选择第一个元素和flexbox(.contract-slider)时,你会看到以下内容:

当我进入下一个元素时

代码如下:

.custom-slider__container {
  width: 100%;
}

.custom-slider {
  scroll-behavior: smooth;
  display: flex;
  gap: var(--custom-spacing-03);
  align-items: stretch;
  width: 100%;
  height: 241.5px;
  overflow: auto;
  scroll-snap-type: x mandatory;
  pointer-events: auto;
  -ms-overflow-style: none; /* IE and Edge */
  scrollbar-width: none; /* Firefox */
  &::-webkit-scrollbar {
    display: none;
  }
}

$custom-width: min(320px, 65%);
$custom-offset: calc(50% - ($custom-width / 2));

.custom-contract {
  display: flex;
  align-items: center;
  min-width: $custom-width;
  height: 100%;
  cursor: pointer;
  scroll-snap-stop: always;
  scroll-snap-align: center;

  &:first-of-type {
    margin-left: $custom-offset;
  }

  &:last-of-type {
    margin-right: $custom-offset;
  }

  .custom-contract__content {
    user-select: none;
    transition: var(--custom-animation-timing-small) ease all;
    transform: scale(0.8);
  }

  .custom-contract__image {
    aspect-ratio: 800 / 500;
  }

  &--active {
    transform: none;

    .custom-contract__content {
      transform: none;
    }
  }
}
<div class="custom-slider__container">
  <div
    ref="sliderContainer"
    class="custom-slider"
  >
    <div
      v-for="(customContract, index) in customContracts"
      :key="customContract.Id"
      :ref="($el) => { customContractRefs[customContract.Id] = $el }"
      class="custom-contract"
      :class="{
        'custom-contract--active':
          customContract.driverId === mostCenteredCustomContract
      }"
      :aria-label="custom-label"
      @click="doSomething()"
    >
      <div class="custom-contract__content">
        <img>
      </div>
    </div>
  </div>
</div>

我已经尝试了以下方法

  • &:last-of-type更改为&:last-child
  • &:last-of-type之后添加了一个伪元素:
.contract::after {
  margin-right: $offset;
}

以上都不起作用。为什么我的保证金权利没有出现?是因为flexbox在safari/iOS上的工作方式吗?

liwlm1x9

liwlm1x91#

Safari似乎无法将合并滚动捕捉与边距结合起来。
你可以做的是使用::before::after伪类和一些flexbox技巧向容器添加边距。这意味着您可以放弃SCSS计算。

.custom-slider::before,
.custom-slider::after {
  flex: 0 0 50%;
content: '';
}

相关问题