javascript – CSS – 动画整个ul而不只是新项目进入时的第一行

看一下this simple JsFiddle I made,它会动画进入列表的新项目.

但是,动画仅影响第一行,而不影响所有行.
我使颜色随机,所以当插入新项目时,您实际上可以看到其他行上的“跳跃”.

有没有办法让它只用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;
}

Ceated一个管理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($("
  • 最佳答案
    考虑到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','black'];
    var color = colors[Math.floor(Math.random() * colors.length)];
    sp.add($("
  • 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;
      }
    }