CSS - анимация всего ul, а не только первая строка, когда новый элемент входит - PullRequest
0 голосов
/ 29 августа 2018

Взгляните на этот простой JsFiddle, который я сделал , который анимирует новые элементы, которые входят в список.

Однако анимация влияет только на первую строку, а не на все строки. Я сделал цвета случайными, чтобы вы могли видеть «скачки» в других строках при вставке нового элемента.

Есть ли способ сделать так, чтобы это влияло на все строки только с помощью CSS?

@keyframes enter {
  0% {
    transform: translateX(-100%);
    margin-left: calc(var(--w) * -1);
  }
  100% {
    transform: translateX(0px);
    margin-left: 0
  }
}

Это моя анимация, и это мой элемент списка:

.slidepush li {
  --w: 50px;
  width: var(--w);
  height: 50px;
  background-color: red;
  vertical-align: top;


  border: 0;
  padding: 0;
  margin: 0;
  display: inline-block;
}

.enter {
  animation: enter 1s;
}

Создан простой класс, который управляет ul и реализует add:

class SlidePush {

    constructor(ulElement) {
    this.element = ulElement;
  }

  add(item) {
    this.element.prepend(item.addClass('enter'));
  }
}

const sp = new SlidePush($(".slidepush"));

setInterval(() => {//
  var colors = ['red', 'blue', 'green', 'black'];
  var color = colors[Math.floor(Math.random() * colors.length)];
  sp.add($("<li style='background-color:" + color +" !important;'></li>"));
}, 1000);

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Не могли бы вы попробовать следующий код.

class SlidePush {

  constructor(ulElement) {
    this.element = ulElement;
  }

  add(item) {
    $('.slidepush li').removeClass('enter');
    $('.slidepush li').removeClass('push');
    $('.slidepush li:nth-child(4n+1)').addClass('push');
    this.element.prepend(item.addClass('enter'));
  }
}

const sp = new SlidePush($(".slidepush"));

setInterval(() => { //
  var colors = ['red', 'blue', 'green', 'black'];
  var color = colors[Math.floor(Math.random() * colors.length)];
  sp.add($("<li style='background-color:" + color + " !important;'></li>"));
}, 1000);
div {
  --w: 200px;
  max-width: var(--w);
}

.slidepush {
  list-style: none;
  border: 0;
  padding: 0;
  margin: 0;
  display: table;
}

.slidepush li {
  --w: 50px;
  width: var(--w);
  height: 50px;
  background-color: red;
  vertical-align: top;
  border: 0;
  padding: 0;
  margin: 0;
  display: inline-block;
}

.enter {
  animation-name: enter;
  animation-duration: 1s;
  animation-fill-mode: forwards;
}

.push {
  animation-name: push;
  animation-duration: 1s;
  animation-fill-mode: forwards;
}

@keyframes push {
  0% {
    margin-left: calc(var(--w) * -1);
  }
  100% {
    margin-left: 0
  }
}

@keyframes enter {
  0% {
    transform: translateX(-100%);
  }
  100% {
    transform: translateX(0px);
  }
}
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
<div>
  <ul class="slidepush">

  </ul>
</div>
0 голосов
/ 29 августа 2018

Вы можете добавить анимацию с учетом nth-child, так что вы всегда добавляете первый в каждой строке. Вы также должны удалить анимацию после того, как это будет сделано, чтобы иметь возможность добавить ее снова к тому же элементу, когда он достигнет следующей строки.

class SlidePush {

	constructor(ulElement) {
  	this.element = ulElement;
  }
  
  add(item) {
  	this.element.prepend(item);
    $('.slidepush li:nth-child(4n+1)').addClass('enter');
    setTimeout(function(){ $('.slidepush li:nth-child(4n+1)').removeClass('enter') }, 1000);
  }
}

const sp = new SlidePush($(".slidepush"));

setInterval(() => {//
var colors = ['red', 'blue', 'green', 'black'];
var color = colors[Math.floor(Math.random() * colors.length)];
sp.add($("<li style='background-color:" + color +" !important;'></li>"));
}, 1200);
div {
--w: 200px;
  max-width: var(--w);
}


.slidepush {
  list-style: none;
  border: 0;
  padding: 0;
  margin: 0;
  display: table;
  }

.slidepush li {
  --w: 50px;
  width: var(--w);
  height: 50px;
  background-color: red;
  vertical-align: top;

  
  border: 0;
  padding: 0;
  margin: 0;
  display: inline-block;
}
      
.enter {
  animation: enter 1s;
  position:relative;
  z-index:-1;
}
      
@keyframes enter {
  0% {
    transform: translateX(-100%);
    margin-left: calc(var(--w) * -1);
  }
  100% {
    transform: translateX(0px);
    margin-left: 0;
  }
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div>
  <ul class="slidepush">

  </ul>
</div>
...