Búsqueda de sitios web

javascript - div de desplazamiento infinito CSS


Hola, estoy intentando hacer que el div se desplace con una animación CSS simple.

El problema es que no se repite bien, porque hay un pequeño destello antes de reiniciar el desplazamiento.

AQUÍ ESTÁ EL CÓDIGO: https://jsfiddle.net/by6tx4o0/2/

.c{
  position:relative;
  background:red;
  max-height:200px;
  float:left;
  width:300px;
  height:300px;
  overflow:hidden;
  overflow-y:auto;
}
.card-home{
  position:absolute;
  margin:20px;
	top:0;
  	animation: scroll 10s linear 1s infinite;
}
span {
  min-width:300px;
  min-height:40px;
  display:block;
  color:white;
  margin:5px;
  background:blue;
}
@keyframes scroll {
	100% { top: -100%; }
}
<div class="c">sssss
<div class="card-home">
  <span>1</span>
  <span>2</span>
  <span>3</span>
  <span>4</span>
  <span>5</span>
  <span>6</span>
  <span>7</span>
  <span>8</span>
</div>
</div>

¿Qué tengo que hacer para que esto sea suave al hacer un bucle?

gracias

Respuesta #1

Hmm, uno complicado y necesitará algunos valores codificados si quieres que sea puro CSS, pero aquí está la idea:

.c{
  position:relative;
  background:red;
  max-height:225px;  /*height to show an exact number of spans  - in this case span is 45px (40 height plus 5 margin as margins collapse) and we are showing 5 spans to start */
  float:left;
  width:315px;
  height:225px;
  overflow:hidden;
  overflow-y:auto;
}
.card-home{
  position:absolute;
	top:0;
  	animation: scroll 10s linear 1s infinite;
}
span {
  min-width:290px;
  min-height:40px;
  display:block;
  color:white;
  margin:5px;
  background:blue;
}
@keyframes scroll {
	100% { top: -360px; }  /* top is the number of spans (in this case 8) multiplied by span height (45px as described above)*/
}
<div class="c">
<div class="card-home">
  <span>1</span>
  <span>2</span>
  <span>3</span>
  <span>4</span>
  <span>5</span>
  <span>6</span>
  <span>7</span>
  <span>8</span>
  <!-- copy the number of spans displayed at the beggining onto the end -->
  <span>1</span>
  <span>2</span>
  <span>3</span>
  <span>4</span>
  <span>5</span>
</div>
</div>

También propondría mover ese texto ssss fuera del desplazador para que el margen superior de 20px con el que comenzaste no interfiera con el desplazador

Respuesta #2

Si quieres que se desplace suavemente hacia arriba una vez que la animación haya terminado, una cosa que podrías hacer es simplemente modificar un poco tu animación, de modo que en lugar de terminar en la parte inferior, termine en la parte superior (ese es el estado original, así que no habrá ningún "salto" cuando la animación se reinicie).

Puedes hacer esto de la siguiente manera:

  • Desplazándose hasta el fondo usando el 95% del tiempo de la animación.
  • Usando el 5% restante para desplazarse hacia arriba.

Los cambios en el código serían realmente simples, y no requerirían ningún JavaScript:

@keyframes scroll {
    95% { top: -100%; }
    100% { top:0; }
}

Esta demostración muestra el resultado:

.c{
  position:relative;
  background:red;
  max-height:200px;
  float:left;
  width:300px;
  height:300px;
  overflow:hidden;
  overflow-y:auto;
}
.card-home{
  position:absolute;
  margin:20px;
  top:0;
  animation: scroll 10s linear 1s infinite;
}
span {
  min-width:300px;
  min-height:40px;
  display:block;
  color:white;
  margin:5px;
  background:blue;
}
@keyframes scroll {
  95% { top: -100%; }
  100% { top:0; }
}
<div class="c">sssss
<div class="card-home">
  <span>1</span>
  <span>2</span>
  <span>3</span>
  <span>4</span>
  <span>5</span>
  <span>6</span>
  <span>7</span>
  <span>8</span>
</div>
</div>