【问题标题】:CSS transition causing briefly causing white spaceCSS过渡导致短暂导致空白
【发布时间】:2023-03-08 00:29:01
【问题描述】:

链接到笔http://codepen.io/mikeCaley/pen/VpYrEq

转换按我想要的方式进行,除非您将鼠标从一侧快速移动到另一侧,您会看到右侧出现空白。

我不明白为什么这是因为所有 div 的转换速度都是一样的。

我想出的唯一解决方法是匹配背景颜色,但是我需要一个更强大的解决方案(并且还想知道为什么会这样)

<div class="slider-wrap">
  <div class="placeholder p1"></div>
  <div class="placeholder p2"></div>
  <div class="placeholder p3"></div>
</div>

body,
html {
  height: 100%;
  margin: 0;
  padding: 0;
}

.slider-wrap {
  position: relative;
  width: 100%;
  max-width: 1200px;
  height: 100%;
  margin: 0 auto;
  font-size:0;
  outline: solid black 0.1px;
  box-sizing: border-box;
}

.placeholder {
  position: relative;
  display: inline-block;
  height: 100%;
  width: 33.3333%;
  background-color: black;
  background-size: cover;
  background-position: 41% 0px;
  background-repeat: no-repeat;
  transition: width 0.4s linear;
}

.p1 {
  background-image: url(https://riverisland.scene7.com/is/image/RiverIsland/C20170224_P1_Spring_970x500_2_DNT?$retina$);
  left:0;
}

.p2 {
  background-image: url(https://riverisland.scene7.com/is/image/RiverIsland/C20170224_P1_Spring_970x500_1_DNT?$retina$);
}

.p3 {
  background-image: url(https://riverisland.scene7.com/is/image/RiverIsland/C20170224_P1_Spring_970x500_3_DNT?$retina$);
}

.slider-wrap:hover .p1,
.slider-wrap:hover .p2,
.slider-wrap:hover .p3 {
  width:30%;
}

.slider-wrap .p1:hover {
  width: 40%;
}
.slider-wrap .p2:hover {
  width: 40%;
}
.slider-wrap .p3:hover {
  width: 40%;
}

谢谢

【问题讨论】:

  • 您的 codepen 的代码与您的问题不同。这是在代码笔中,但不是问题: .slider-wrap:hover .p1, .slider-wrap:hover .p2, .slider-wrap:hover .p3 { width:30%; }
  • 似乎还有一个问题。当您将鼠标悬停在右边框上时,怎么会出现一个大的空白。无需将鼠标悬停在其他部分上即可发生这种情况。
  • 一定是抄错了。我已将边框更改为轮廓,这样就不会再发生了

标签: css css-transitions transition transitions


【解决方案1】:

手风琴右侧出现空白的原因是由于转换和以下代码。

.slider-wrap:hover .p1,
.slider-wrap:hover .p2,
.slider-wrap:hover .p3 {
  width:30%;
}

由于过渡时间为 0.4 秒,因此用户可以将鼠标悬停在每个滑块环绕 p# 上,并在 0.4 秒内触发其到 width:30% 的过渡。这将导致每个滑块环绕的宽度过渡重叠,并且它们的总宽度在 90% 到 100% 之间。

要解决这个问题,您需要确保 p# 的宽度之和不小于 100%。

一种解决方案是使用 flexbox。通过将.slider-wrap 设置为display: flex 并设置每个孩子的flex-grow: 1.slider-wrap 中的任何多余空间都将被填充。

body,
html {
  height: 100%;
  margin: 0;
  padding: 0;
}

.slider-wrap {
  display:flex;
  width: 100%;
  max-width: 1200px;
  height: 100%;
  margin: 0 auto;
  font-size:0;
  outline: solid black 0.1px;
  box-sizing: border-box;
}

.placeholder {
  position: relative;
  display: inline-block;
  height: 100%;
  width: 33.3333%;
  background-color: black;
  background-size: cover;
  background-position: 41% 0px;
  background-repeat: no-repeat;
  transition: width 0.4s linear;
  flex-grow:1;
}

.p1 {
  background-image: url(https://riverisland.scene7.com/is/image/RiverIsland/C20170224_P1_Spring_970x500_2_DNT?$retina$);
  left:0;
}

.p2 {
  background-image: url(https://riverisland.scene7.com/is/image/RiverIsland/C20170224_P1_Spring_970x500_1_DNT?$retina$);
}

.p3 {
  background-image: url(https://riverisland.scene7.com/is/image/RiverIsland/C20170224_P1_Spring_970x500_3_DNT?$retina$);
}

.slider-wrap:hover .p1,
.slider-wrap:hover .p2,
.slider-wrap:hover .p3 {
  width:30%;
}

.slider-wrap .p1:hover {
  width: 40%;
}
.slider-wrap .p2:hover {
  width: 40%;
}
.slider-wrap .p3:hover {
  width: 40%;
}
<div class="slider-wrap">
  <div class="placeholder p1"></div>
  <div class="placeholder p2"></div>
  <div class="placeholder p3"></div>
</div>

【讨论】:

  • 让我知道这是否适合您,或者您是否有任何理由不想使用 flexbox?
  • 太漂亮了,谢谢。只是没想到要使用它,当我学习 CSS 时,flex box 还没有真正出现。需要复习一下
  • 很高兴为您提供帮助。 Flexbox 非常强大且使用起来非常有趣。如果你想了解更多,CSS Tricks 有一篇很棒的文章。 css-tricks.com/snippets/css/a-guide-to-flexbox
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-26
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多