【问题标题】:Recreating aniamtion / side scroll slideshow重新创建动画/侧滚动幻灯片
【发布时间】:2021-04-21 16:13:57
【问题描述】:

我正在尝试重新创建动画/侧滚动效果。效果来自https://elrond.com/#partners,它位于合作伙伴部分。缓慢移动的圆圈。我试图重新创建它,但是在整个周末我的头撞在我的桌子上之后,我无法重新创建它。所以我在这里寻求帮助。

我做了一个小代码笔来显示我现在的位置。

    .slide-wrapper{
  max-width: 800px; 
  height: 30vh;
  position: relative;
  margin: 0 auto;
  transform: translate3d(0,0,0);  
  outline: red;
}

.slider{   
  position: absolute;
  top: 0;
  left: 0;
  height: 200px;
  display:flex;
  transform: translate3d(0,0,0); 
  animation: scroll 15s infinite linear;  
}

.slider:last-child  .slide{
  background-color: steelblue;
  animation: scroll 13s infinite linear;
  margin-top: 5rem;  
}

.slide{  
  background-color:orangered;
  height:50px;
  width:50px;
  margin: 1rem 6rem;  
  
}

@keyframes scroll {  
  100%{transform: translateX(-66.6666%)}
}

https://codepen.io/tijmenjacobs/pen/LYxrvKq

我的主要问题如下:

  • 如何循环播放动画?现在,当动画完成后,它会传送回原来的位置并重新启动。
  • 我想知道如何定位这些圆圈。我应该处理 JS 来随机分配圆圈还是应该硬编码位置?就像他们在原版上所做的那样。

希望大家帮忙!

提前致谢!

【问题讨论】:

  • 在你给出的例子中,它们有两个相邻的.slider元素
  • 要获得连续滑动,您需要(至少)两个副本,具体取决于您对其中一个至少与视口一样宽的信心。
  • 您好,感谢您的 cmets!我更新了 Codepen,但仍然有口吃。有什么好主意可以解决吗? :)

标签: javascript css animation


【解决方案1】:

要获得所需的效果,您需要两个相同的滑块彼此相邻(slider-mainslider-copy 在 sn-p)。

我使用CSS variables 来更容易计算偏移量和空格。幻灯片之间的偏移量基于每行的数量 (--slides-per-row)。这些是在 HTML 中设置的,因此您可以轻松地在其他地方重复使用滑块。

/* Basic reset */
* {
  padding: 0;
  margin: 0;
  box-sizing: border-box;
}

body > * + * {
  margin-top: 2em;
}

/* Slider styling */

.sliders {
  display: flex;
}

.slider {
  --slide-offset: calc(100vw / var(--slides-per-row, 4)); /* --slides-per-row is set via HTML and uses 4 if nothing is provided */
  --slide-size: 5rem;
  flex: 0 0 100vw;
  animation: scroll 10s linear infinite;
}

.slider-row {
  display: flex;
}

/* Offset every odd row */
.slider-row:nth-child(2n+1) {
  transform: translateX(
    calc((var(--slide-offset) / 2 + var(--slide-size) / 2) * -1)
  );
  margin-bottom: 2rem;
}

.slide {
  width: var(--slide-size);
  height: var(--slide-size);
  margin: 0 0 0 var(--slide-offset);
  background: steelblue;
  font-size: 2rem;
  color: white;
  /* Center content */
  display: flex;
  align-items: center;
  justify-content: center;
}

@keyframes scroll {
  100% {
    transform: translateX(-100%);
  }
}
<h2>4 slides per row</h2>
<div class='sliders' style='--slides-per-row: 4'>
  <div class='slider slider-main'>
    <div class='slider-row'>
      <div class='slide'>1</div>
      <div class='slide'>2</div>
      <div class='slide'>3</div>
      <div class='slide'>4</div>
    </div>
    <div class='slider-row'>
      <div class='slide'>5</div>
      <div class='slide'>6</div>
      <div class='slide'>7</div>
      <div class='slide'>8</div>
    </div>
  </div>
  
  <div class='slider slider-copy'>
    <div class='slider-row'>
      <div class='slide'>1</div>
      <div class='slide'>2</div>
      <div class='slide'>3</div>
      <div class='slide'>4</div>
    </div>
    <div class='slider-row'>
      <div class='slide'>5</div>
      <div class='slide'>6</div>
      <div class='slide'>7</div>
      <div class='slide'>8</div>
    </div>
  </div>
</div>

<h2>2 slides per row</h2>
<div class='sliders' style='--slides-per-row: 2'>
  <div class='slider slider-main'>
    <div class='slider-row'>
      <div class='slide'>1</div>
      <div class='slide'>2</div>
    </div>
    <div class='slider-row'>
      <div class='slide'>3</div>
      <div class='slide'>4</div>
    </div>
    <div class='slider-row'>
      <div class='slide'>5</div>
      <div class='slide'>6</div>
    </div>
    <div class='slider-row'>
      <div class='slide'>7</div>
      <div class='slide'>8</div>
    </div>
  </div>
  
  <div class='slider slider-copy'>
    <div class='slider-row'>
      <div class='slide'>1</div>
      <div class='slide'>2</div>
    </div>
    <div class='slider-row'>
      <div class='slide'>3</div>
      <div class='slide'>4</div>
    </div>
    <div class='slider-row'>
      <div class='slide'>5</div>
      <div class='slide'>6</div>
    </div>
    <div class='slider-row'>
      <div class='slide'>7</div>
      <div class='slide'>8</div>
    </div>
  </div>
</div>

【讨论】:

  • 你最好的!非常感谢。迫不及待想在我的代码中使用它。
猜你喜欢
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 2015-08-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
相关资源
最近更新 更多