【问题标题】:How to limit the number of total animated drop cubes and make them animate by their added order?如何限制动画掉落立方体的总数并使其按添加的顺序进行动画处理?
【发布时间】:2021-05-29 01:28:06
【问题描述】:

当我们点击这个添加按钮时,我们将添加一个新的立方体,它会立即掉落,但是如果我们很快点击它,将会有太多的立方体掉落。我想限制动画掉落方块的总数。

例如,即使我们非常快速地点击按钮并在页面中添加了 10 个立方体,也只有两个立方体掉落,其他的必须等到它们完成。

例如,当立方体 1 和立方体 2 完成时,第 3 和第 4 个立方体将开始下降。

我在想也许我们可以有一个动画立方体总数的全局变量,++ 和 -- 当一个新的立方体开始和结束动画时,使用 setInterval 来检查变量是否小于 2,但是这个无法根据立方体创建顺序制作动画。我可以知道如何解决这个问题吗?非常感谢!

var btn = document.getElementById('add');
var container = document.getElementById('cubes-container');
var cubeId = 0;
btn.addEventListener('click', addCube);

var currentAnimateCount = 0;

function dropCube(cube) {
  var pos = 0;
  let intervalId = setInterval(function() {
    if (pos == 200) {
      clearInterval(intervalId);
    } else {
      pos++;
      cube.style.top = pos + "px";

    }
  }, 1);

}

function addCube() {
  let cube = document.createElement('div');
  let cubeContainer = document.createElement('div');
  cube.className = 'cube';
  cube.id = cubeId;
  cube.innerHTML = cube.id;
  cubeId++;
  cubeContainer.className = 'cube-container';
  cubeContainer.append(cube);
  container.append(cubeContainer);
  let pos = 0;
  dropCube(cube)


}
#cubes-container {
  display: grid;
  grid-template-columns: repeat(10, 1fr);
}

.cube-container {
  position: relative;
  height: 30px;
}

.cube {
  width: 30px;
  height: 30px;
  background-color: orange;
  text-align: center;
  display: grid;
  align-items: center;
  justify-items: center;
  position: absolute;
}
<button id="add">add new</button>
<div id="cubes-container">
</div>

【问题讨论】:

  • 嗨,您愿意等待多少个立方体,并且您是否会在某个时候移除它们(删除它们)?您可能会发现查看 CSS 动画也很有帮助。
  • @AHaworth @A Haworth 嗨!非常感谢你的回复!我希望最多只有两个立方体在动画,所有其他的都在等待。如果我很快点击添加按钮,我可能会同时添加 10 个立方体,但只有前两个在下降,它们完成后,立方体 3 和 4 开始下降,然后在立方体 3 和 4 完成后,立方体 5 和 6开始下降。即使在我不断单击添加按钮的同时,它们也始终遵循此顺序。我现在不打算删除它们。
  • 不要让它持续太久,否则如果您继续创建但不删除,您可能会用完存储(虽然需要很长时间)。

标签: javascript css animation


【解决方案1】:

考虑以下示例。它使用 jQuery 与 JavaScript。也可以编写类似的脚本。

$(function() {
  function addCube(target) {
    var i = $(".cube").length;
    var container = $("<div>", {
      class: "cube-container"
    }).appendTo(target);
    $("<div>", {
      class: "cube",
      id: "cube-" + i
    }).html(i).appendTo(container);
    return container;
  }

  function dropCube(cube) {
    $(cube).addClass("falling").animate({
      top: "200px"
    }, 2000, function() {
      $(cube).removeClass("falling");
      if (cubes.length && $(".falling").length < 2) {
        dropCube(cubes.shift());
      }
    });
  }

  var cubes = [];

  $("#add").click(function() {
    cubes.push(addCube("#cubes-container"));
    if ($(".falling").length < 2) {
      dropCube(cubes.shift());
    }
  });
});
/*
var btn = document.getElementById('add');
var container = document.getElementById('cubes-container');
var cubeId = 0;
btn.addEventListener('click', addCube);

var currentAnimateCount = 0;

function dropCube(cube) {
  var pos = 0;
  let intervalId = setInterval(function() {
    if (pos == 200) {
      clearInterval(intervalId);
    } else {
      pos++;
      cube.style.top = pos + "px";
    }
  }, 1);

}

function addCube() {
  let cube = document.createElement('div');
  let cubeContainer = document.createElement('div');
  cube.className = 'cube';
  cube.id = cubeId;
  cube.innerHTML = cube.id;
  cubeId++;
  cubeContainer.className = 'cube-container';
  cubeContainer.append(cube);
  container.append(cubeContainer);
  let pos = 0;
  dropCube(cube)
}
*/
#cubes-container {
  display: grid;
  grid-template-columns: repeat(10, 1fr);
}

.cube-container {
  position: relative;
  height: 30px;
}

.cube {
  width: 30px;
  height: 30px;
  background-color: orange;
  text-align: center;
  display: grid;
  align-items: center;
  justify-items: center;
  position: absolute;
  top: 0;
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<button id="add">add new</button>
<div id="cubes-container"></div>

使用数组,您可以.shift() 数组的第一项。此外,为掉落的物品添加一个类别可以让您计算哪些物品正在掉落。我喜欢使用 Animate,因为它允许在动画完成时进行回调,因此您可以检查下一个项目。

JavaScript 更新

var btn = document.getElementById('add');
var container = document.getElementById('cubes-container');
var cubes = [];
btn.addEventListener('click', function(event) {
  cubes.push(addCube());
  if (document.getElementsByClassName("falling").length < 2) {
    dropCube(cubes.shift());
  }
});

function dropCube(cube) {
  var pos = 0;
  cube.classList.add("falling");
  var intervalId = setInterval(function() {
    if (pos == 200) {
      clearInterval(intervalId);
      cube.classList.remove("falling");
      if (document.getElementsByClassName("falling").length < 2 && cubes.length) {
        dropCube(cubes.shift());
      }
    } else {
      pos++;
      cube.style.top = pos + "px";
    }
  }, 1);
}

function addCube() {
  let cube = document.createElement('div');
  let cubeContainer = document.createElement('div');
  cube.className = 'cube';
  cube.id = document.getElementsByClassName("cube").length;
  cube.innerHTML = cube.id;
  cubeContainer.className = 'cube-container';
  cubeContainer.append(cube);
  container.append(cubeContainer);
  return cubeContainer;
}
#cubes-container {
  display: grid;
  grid-template-columns: repeat(10, 1fr);
}

.cube-container {
  position: relative;
  height: 30px;
}

.cube {
  width: 30px;
  height: 30px;
  background-color: orange;
  text-align: center;
  display: grid;
  align-items: center;
  justify-items: center;
  position: absolute;
  top: 0;
}
<button id="add">add new</button>
<div id="cubes-container"></div>

【讨论】:

  • 非常感谢您的帮助!那阵法厉害了!如果我使用纯 javaScript 和 setInterval 之类的东西,有没有办法知道哪些完成下落动画并触发其他人下落?
  • @xixi 我也回去做了一个 JS 例子。 jQuery 只是 JavaScript 的一个框架,所以如果你可以在 jQuery 中实现;你可以把它写回 JavaScript。
  • 非常感谢您的帮助!我不能投票,因为它说我“需要至少 15 个声望才能投票”,但我点击了“接受这个答案”。真的非常感谢你!这个方法太神奇了!为什么我就想不出这么神奇的方法呢~我真的需要学习更多关于如何正确使用JavaScript的知识!谢谢!
  • @xixi 有很多很好的教程和方法可以学习更多的脚本方法。您还将在 Stack Overflow 上看到很多很好的示例。很快,您将开始看到可以改进代码的地方并了解如何更好地使用它。
  • 非常感谢 Twisty :D 我会努力学习更多关于前端的知识!
猜你喜欢
  • 2015-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-12
相关资源
最近更新 更多