【问题标题】:Staggered, sequential animation with delay具有延迟的交错顺序动画
【发布时间】:2022-01-25 07:12:21
【问题描述】:

我有 5 个空白框,我希望它们每 1 秒按顺序填满。我该怎么做呢?我的 JS 错误,无法正常工作。

let blankSquare = document.querySelectorAll(".square");

function fillUp() {
  setInterval(() => {
    blankSquare.classList.add(".fill")
  }, 1000)
}


blankSquare.addEventListener("fillUp");
.square {
  margin: 1vh;
  height: 3vh;
  width: 3vh;
  background-color: none;
  border: solid 2px grey;
}

.fill {
  background-color: grey;
}
<div class="squares">
  <div class="square"></div>
  <div class="square"></div>
  <div class="square"></div>
  <div class="square"></div>
  <div class="square"></div>
</div>

【问题讨论】:

  • blankSquare.classList.add(".fill") 试试不带“.”首先
  • @ThomasG2201 blankSquare 是一个集合而不是一个元素,因此涉及到几个问题

标签: javascript html


【解决方案1】:

使用 CSS 的交错动画

这是一个示例,您不一定需要 JavaScript,而只是一个包含 CSS var(变量)的 style 属性,例如 style="--anim=N" where N 是从0N 的索引,animation-delay 属性使用 CSS calc()

.square {
  height: 3vh;
  aspect-ratio: 1;
  border: solid 2px grey;
  animation: fill 0.3s calc(var(--anim) * 1s) forwards;
}

@keyframes fill {
  to { background: grey; }
}
<div class="squares">
  <div class="square" style="--anim:0"></div>
  <div class="square" style="--anim:1"></div>
  <div class="square" style="--anim:2"></div>
  <div class="square" style="--anim:3"></div>
  <div class="square" style="--anim:4"></div>
</div>

如果您不想手动硬编码style 属性,只需添加此 JS:

const ELS = (sel, el) => (el || document).querySelectorAll(sel);
ELS(".square").forEach((el, i) => el.style.setProperty("--anim", i));

使用 JavaScript 的交错动画

给定一个 JavaScript 函数,您可以使用它来决定何时开始交错动画:

递归中使用setTimeout而不是setInterval fillUp 函数接受参数 1:元素集合,2:起始索引。
每次下一个递归函数调用都会传递一个递增的索引

const fillUp = (els, i = 0) => {
  els[i].classList.add("fill");
  i += 1;
  if (i < els.length) setTimeout(() => fillUp(els, i), 1000);
};

fillUp(document.querySelectorAll(".square"));
.square {
  height: 3vh;
  aspect-ratio: 1;
  border: solid 2px grey;
}

.fill {
  background-color: grey;
}
<div class="squares">
  <div class="square"></div>
  <div class="square"></div>
  <div class="square"></div>
  <div class="square"></div>
  <div class="square"></div>
</div>

相关文章/资源:

【讨论】:

  • 每天学习新东西。我没有尽可能多地跟上 css 动画,--anim 非常酷。该变量的名称是任意的,所以style="--foo:3calc(var(--foo) * 1s) 可以工作吗?
  • @charlietfl 确切地说,这绝对是任意的。 --this-is-my-index--foo,随便。它只需要以-- 为前缀并与var() 一起使用,例如:--red-deep: #c11; color: var(--red-deep); developer.mozilla.org/en-US/docs/Web/CSS/…developer.mozilla.org/en-US/docs/Web/CSS/var()
  • 好像是这样,谢谢 Roko
【解决方案2】:

您可以将项目的索引存储在变量中,并在区间内递增。

let blankSquare = document.querySelectorAll(".square");

let index = 0;

function fillUp() {
  setInterval(() => {
    blankSquare[index++].classList.add("fill")
  }, 1000)
}


fillUp()
.square {
  margin: 1vh;
  height: 3vh;
  width: 3vh;
  background-color: none;
  border: solid 2px grey;
}

.fill {
  background-color: grey;
}
<div class="squares">

  <div class="square"></div>
  <div class="square"></div>
  <div class="square"></div>
  <div class="square"></div>
  <div class="square"></div>

</div>

【讨论】:

  • 这不可避免地会遇到cannot access property "classList" of undefined 异常(具体的错误消息取决于浏览器)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-08-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多