【问题标题】:CSS slider with arrows using animation使用动画的带有箭头的 CSS 滑块
【发布时间】:2018-07-07 08:06:18
【问题描述】:

我正在尝试实现仅 CSS 的滑块。
hovering 左右箭头时,滑块必须滑动。当然。

我尝试使用animation-play-stateanimation-fill-mode(以保持位置)和animation-direction,但我无法完全发挥作用。

  • animation-play-state: paused 开头,hover 箭头将其更改为running
  • 在右箭头的hover 上,一切正常。我们可以悬停、离开、再次悬停。
  • 但是,只要我hover 左箭头(将animation-direction 更改为reverse),它就坏了。

简化的 sn-p

.wrapper {
  overflow: hidden;
  position: relative;
  width: 500px;
}

.arrows {
  z-index: 2;
  position: absolute;
  top: 0;
  height: 100%;
  background: #ddd;
  opacity: 0.66;
}

.arrows:hover {
  opacity: 1;
}

.arrow-l {
  left: 0;
}

.arrow-r {
  right: 0;
}

.sliding {
  height: 160px;
  width: 2000px;
  background: linear-gradient(to bottom right, transparent 49.9%, gray 50.1%);
  animation: slide 2s linear;
  animation-play-state: paused;
  animation-fill-mode: both;
}

.arrows:hover~.sliding {
  animation-play-state: running;
}

.arrow-l:hover~.sliding {
  animation-direction: reverse;
}

@keyframes slide {
  0% {
    transform: translate(0px, 0);
  }
  100% {
    transform: translate(-1500px, 0);
  }
}
<div class="wrapper">
  <div class="arrows arrow-l">[ ← ]</div>
  <div class="arrows arrow-r">[ → ]</div>
  <div class="sliding"></div>
</div>

有人可以帮助我了解正在发生的事情,并纠正这种不良行为吗?

【问题讨论】:

  • 改变方向会改变整个动画,不会简单地通过保持当前状态来改变当前方向
  • 嘿@TemaniAfif,谢谢。你知道纠正它的方法吗?
  • 当你的动画停止时,它就停止了。它不会通过反转方向重新开始。当你把它设置为无限时,它会起作用:jsfiddle.net/eL6ygf51/8 但是当然,动画将是无限的,所以你必须找到一种方法来调整它。

标签: css css-animations css-transforms


【解决方案1】:

这里的主要问题是改变方向会保持动画的当前状态,但它会考虑新的方向。举个简单的例子:

假设您有一个从left:0left:100% 的动画。如果您首先运行动画直到left:80%,然后将方向更改为反转,您将拥有left:20%

为什么?

因为使用默认方向,您达到了动画的 80% (left:80%),而反向方向的相同动画的 80% 只是 left:20%

将鼠标悬停在reverse上,您会看到框的位置正在跳跃以切换到考虑新方向的新状态。很明显,当动画结束时,您将在第一个和最后一个状态之间切换:

.sliding {
  width:100px;
  height:100px;
  background:red;
  left:0%;
  position:relative;
  animation:slide 5s linear forwards;
  animation-play-state:paused;
}
.arrows {
  margin:20px;
}

.arrow-r:hover~.sliding {
  animation-play-state: running;
}

.arrow-l:hover~.sliding {
  animation-direction: reverse;
}

@keyframes slide {
  0% {
    left: 0%;
  }
  100% {
    left: 100%;
  }
}
<div class="wrapper">
  <div class="arrows arrow-r">move normal</div>
  <div class="arrows arrow-l">reverse !!</div>
  <div class="sliding"></div>
</div>

由于这是动画的默认行为,因此无法解决此问题,但您可以依靠过渡来获得类似的效果。诀窍是使用您增加/减少的持续时间来创建所需的效果。

这是一个想法:

.wrapper {
  overflow: hidden;
  position: relative;
  width: 500px;
}

.arrows {
  z-index: 2;
  position: absolute;
  top: 0;
  height: 100%;
  background: #ddd;
  opacity: 0.66;
}

.arrows:hover {
  opacity: 1;
}

.arrow-l {
  left: 0;
}

.arrow-r {
  right: 0;
}

.sliding {
  height: 160px;
  width: 2000px;
  background: linear-gradient(to bottom right, transparent 49.9%, gray 50.1%);
  transition:all 2000s linear; /*This will block the current state*/
}
.arrow-r:hover ~ .sliding {
  transform: translate(-1500px, 0);
  transition:all 2s;
}

.arrow-l:hover ~ .sliding {
  transform: translate(0px, 0);
  transition:all 2s;
}
<div class="wrapper">
  <div class="arrows arrow-l">[ ← ]</div>
  <div class="arrows arrow-r">[ → ]</div>
  <div class="sliding"></div>
</div>

【讨论】:

  • 在您的示例中,反向没有动画,这是有意的吗?
  • @Sirence 是的,它的目的是;)显示方向如何影响状态并使其清晰
  • 你能发布工作版本吗?我也对这个问题很感兴趣。
  • 我认为您的解决方案存在一个小问题:假设我们向右滚动 10%,这将花费“正确”的时间,但是当我们向左滚动时,它需要“正确”时间的 10 倍。 ⋅⋅⋅我不知道有没有办法纠正。也许有一个缓动功能可以让它不那么引人注目?
  • @TakitIsy 是的,因为默认是ease,我改成linear,应该会更好
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-13
  • 2019-12-25
  • 1970-01-01
  • 1970-01-01
  • 2022-08-13
  • 1970-01-01
相关资源
最近更新 更多