javascript - 带有 transitionend 的动画队列

标签 javascript css

我已经选择了 4 个 DOM 元素,并希望使用 transitionend 事件一个接一个地制作动画。最终我希望 translate3d()xy 值是动态的,因此这是在 JS 中完成的,而不仅仅是使用 CSS @keyframe 动画之类的东西。

我目前有此工作代码,但感觉可能有更好的方法。任何指针都会很棒。谢谢!

var formComponents = document.querySelectorAll('.form-component');
formComponents[0].style.transitionDelay = '2s';
formComponents[0].style.webkitTransform = 'translate3d(550px, -250px, 0)';
formComponents[0].addEventListener('transitionend', function(e) {
  formComponents[1].style.webkitTransform = 'translate3d(315px, -250px, 0)';
  formComponents[1].addEventListener('transitionend', function(e) {
    formComponents[2].style.webkitTransform = 'translate3d(150px, -250px, 0)';
    formComponents[2].addEventListener('transitionend', function(e) {
      formComponents[3].style.webkitTransform = 'translate3d(-125px, -250px, 0)';
    }, false);
  }, false);
}, false);
<div class="form-component"></div>
<div class="form-component"></div>
<div class="form-component"></div>
<div class="form-component"></div>

最佳答案

我相信您可以使用将 transitionend 事件链接在一起的 .reduce() 函数来完成您想要的。在我的示例中,我只是切换了一个类,但您可以在元素上设置显式转换,而不是使用 .reduce()index 参数计算您想要的定位>。请考虑以下事项:

const transformer = document.getElementById("transformer"),
  targets = document.getElementsByClassName("changable");

const firstEl = targets[0];

if (firstEl) {
  Array.from(targets).slice(1).reduce((prev, el) => {
    prev.addEventListener("transitionend", e => {
      el.classList.toggle("change");
    });
    return el;
  }, firstEl);

  transformer.addEventListener("click", e => {
    targets[0].classList.toggle("change");
  });
}
.changable {
  display: inline-block;
  transition: transform 200ms ease;
}

.change {
  transform: scale(1.5);
}
<p><span class="changable">Lorem Ipsum</span> <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span>  <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span></p>
<button id="transformer" type="button">Transform</button>

这是一个示例,它关闭数组的索引以根据当前元素在要转换的所有元素的数组中的位置缩放当前元素:

const transformer = document.getElementById("transformer"),
  targets = document.getElementsByClassName("changable");

const firstEl = targets[0];

if (firstEl) {
  Array.from(targets).slice(1).reduce((prev, el, idx, arr) => {
    prev.addEventListener("transitionend", e => {
      el.style.transform = `scale(${(((idx+1) / arr.length)+1) *2})`;
    });
    return el;
  }, firstEl);

  transformer.addEventListener("click", e => {
    firstEl.style.transform = "scale(2)";
  });
}
.changable {
  display: inline-block;
  transition: transform 200ms ease;
}
<p><span class="changable">Lorem Ipsum</span> <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span>  <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span> <span class="changable">dolumn deloris</span></p>
<button id="transformer" type="button">Transform</button>

关于javascript - 带有 transitionend 的动画队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48648545/

相关文章:

javascript - 如何在 vs code 中完全删除 prettier code-formatter 插件?

javascript - Cypress cucumber ^ ParseError : Unexpected token

javascript - 如何发起和处理 POST 请求

HTML 数独表,左侧标记为 A-I,字母间距不均匀

html - 如何在选定字段之间添加水平线

javascript - 设置 asp :RadioButton Text from javascript

javascript - 在 React Native 中创建一个简单的标签格式化程序

jquery - 使用媒体查询或创建 JQuery 函数来添加少量 CSS 会更好吗?

html - 为什么我的 <ul> 没有居中或向左浮动?

html - CSS 拼图 : How to add background-image and set height/width on empty span?