【问题标题】:Vanilla JS animation?香草JS动画?
【发布时间】:2020-01-06 13:45:18
【问题描述】:

就像问题一样,我有一个代码:

$(document).on('click', '.link-fade', function (event) {
event.preventDefault();
var link = this;
$('body').fadeOut(function () {
location.href = link.href;
});
});

它是使用 Jquery 库编写的,但我想在没有它的情况下编写它(我知道你必须使用 addEventlistener 等和 XHR,但我不知道如何使用 XHR)如何在没有 Jquery 的情况下编写此代码?

这是 CSS 代码(动画):

body {
-webkit-animation: fadeIn 1s ease-in;
animation: fadeIn 1s ease-in;
}

@-webkit-keyframes fadeIn {
0% {
opacity: 0;
}
100% {
opacity: 1;
}
}

【问题讨论】:

  • 不,你不需要使用 XMLHttpRequest 来制作动画
  • 我建议考虑对不透明度和动画为 0 的类使用 css 规则,然后使用 JS 切换该类。这是 imo 简单动画的最佳解决方案。

标签: javascript jquery css animation


【解决方案1】:

您可以使用transitionopacity CSS 属性。

首先在您的页面上定义以下 CSS:

body { transition: opacity 400ms }

这将确保如果您更改 body 的 opacity,它将具有淡入淡出效果。

通过监听transitionend 事件,您可以在过渡结束后执行预期的导航操作。

最后,可以通过在事件处理程序中添加类检查来完成事件委托:如果事件没有发生在“link-fade”类的元素上,则退出处理程序:

document.addEventListener('click', function (event) {
    if (!event.target.classList.contains("link-fade")) return; 
    event.preventDefault();
    var link = event.target;
    document.body.style.opacity = 0;
    document.body.addEventListener("transitionend", function () {
        location.href = link.href;
    });
});

注意:this,在事件处理程序中,将是 document。点击的元素是event.target

【讨论】:

  • 谢谢,我已经找到答案了,这段代码也不错,谢谢你的帮助:)
  • 我测试了代码,代码将我重定向到/未定义的页面...怎么了?
  • 您确定link.href 已定义吗?我测试了这段代码,它对我来说很好。如果你能制作一个小提琴来证明这个问题,我会很高兴看到它。
  • 错误重定向的错误已经消失了,我不知道发生了什么......
  • 我还有一个想法,但是如果您使用 XHR 向服务器发送请求(我在页面上有一个深色主题,并且在加载另一个之间有中断时看起来并不算太多)页面“白屏”),所以最好使用 XHR,这样页面转换不会导致“闪烁”。
【解决方案2】:

点击后为fadeOut body创建动画并将其应用于类.fade-out-body的body,然后你可以阻止点击重定向(e.preventDefault())将该类添加到fadeOut body,等待动画完成,然后你可以更改页面的位置(就像您现在在 jQuery 中所做的那样)。加载时,您可以添加上面编写的动画,它们应该一起工作(点击后淡出,加载时淡入)。

function fadeOutRedirect(e) {
    e.preventDefault();
    /* Add class - it should fade out body */
    document.body.classList.add('fade-out-body');

    /* After 1000ms redirect to the new subpage */
    const newLocation = e.target.src 
    setTimeout(function(){ 
        location.href = newLocation;    
    }, 1000);

}

var fadeOutLinks = document.querySelectorAll('.link-fade');
Array.prototype.forEach.call(fadeOutLinks, function (el, i) {
    el.addEventListener('click', fadeOutRedirect);
});

这不是最佳解决方案 - 因为我们并没有真正加载内容只是延迟它,但要避免它,您需要使用 XHR。但它是一个类似于 jQuery 中使用的解决方案。

【讨论】:

  • 谢谢,一夜之间就想着不用XHR了,解决方法帮我看懂了这段代码:)再次感谢。
  • 这个解决方案的问题是它没有实现 OP 在 jQuery 中的事件委托。即使稍后添加新内容触发,jQuery 版本仍将处理点击——这就是进行事件委托的整个想法。此代码不会处理添加到文档中的任何新内容。其次,等待 1000ms 并不是真正等待动画完成,这是 jQuery 版本真正做的事情。实际动画持续时间取决于加载和绘制事件。 setTimeout 相同
猜你喜欢
  • 2019-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多