【问题标题】:Animation: Fade in when creating an element and fade out when deleting动画:创建元素时淡入,删除时淡出
【发布时间】:2020-07-28 12:46:26
【问题描述】:

我遇到了以下情况。

我有一个按钮,其作用类似于普通切换。当我点击“动画”按钮时,我希望<p>This is new Div</p> 淡入,当我再次点击Animate 按钮时,这个<p> 应该淡出。

我怎样才能做到这一点?

const main = document.getElementById('main');
const btn = document.getElementById('btn');

let show = false;
btn.addEventListener('click', () => {
  if(show) {
    const newDiv = document.getElementById("new-div");
    newDiv.remove();
    show = false;
  } else {
    const newDiv = document.createElement('div');
    newDiv.id = "new-div";
    newDiv.innerHTML = "<p>This is new Div</p>";
    main.appendChild(newDiv);
    show = true;
  }
})
#new-div {
  transition: all 2s ease-in-out;
}
<div id="main">
  <button id="btn">Animate</button>
</div>

我实际上正在构建一个画廊布局应用程序,它需要在单击图像时淡入+全屏显示,然后在单击时淡出到其原始位置。由于会有很多图片,我想用JS来动态处理这个。

目前最大的障碍是实现fade-out,因为该元素正在被删除。

【问题讨论】:

  • 你的动画在哪里?
  • 这能回答你的问题吗? CSS transition fade in
  • @OmriAttiya,我想不出任何合适的动画,所以没有包含它。没有上面提到的问题没有回答我的问题,我正在寻找 fade infade out 实现
  • 它是相同的,因为您将它用于所有转换。阅读有关转换及其工作原理的更多信息
  • 我已经为这个问题找到了一个潜在的解决方案:jsfiddle.net/0g5cbun6 但是animationend 事件监听器对浏览器的支持是什么?我不明白caniuse.com 说什么

标签: javascript html css fade


【解决方案1】:

根据您的信息,我制作了一个精致的版本,请参阅下面的小提琴和代码:https://jsfiddle.net/Kenvdb/8nsbp16o/

JavaScript:

const main = document.getElementById('main');
const btn = document.getElementById('btn');

let toggledDiv = null;

btn.addEventListener('click', () => {
  if (!toggledDiv) {
    show();
  } else {
    hide();
  }
})

const show = () => {
  toggledDiv = document.createElement('div');
  toggledDiv.id = "content";
  toggledDiv.style.opacity = "1";
  toggledDiv.innerHTML = "<p>This is new Div</p>";

  main.appendChild(toggledDiv);
}

const hide = () => {
  toggledDiv.style.animation = "fade-out 0.5s ease-in";
  toggledDiv.style.opacity = "0";
  toggledDiv.addEventListener('animationend', remove);
  toggledDiv.addEventListener('webkitAnimationEnd', remove);
}

const remove = () => {
  toggledDiv.remove();
  toggledDiv = null;
};

CSS:

#content {
  opacity: 0;
  animation: fade-in 0.5s ease-in;
}

@keyframes fade-in {
    0% { opacity: 0; }
    100% { opacity: 1; }
}

@keyframes fade-out {
    0% { opacity: 1; }
    100% { opacity: 0; }
}

HTML:

<div id="main">
  <button id="btn">Animate</button>
</div>

【讨论】:

  • 这个问题怎么回答?
  • 嘿,我实际上正在构建一个画廊应用程序,它需要上述独特的问题陈述。我想通过JS添加和删除我的div并添加动画
【解决方案2】:

您需要先将不透明度设置为 0。然后您可以应用关键帧动画。 否则,该元素没有可转换的内容。

见下文。

#new-div {
  opacity: 1;
  animation: fadeIn 2s ease-in-out;

}

@keyframes fadeIn {
  from {
    opacity: 0;
  }
}

【讨论】:

  • 嘿,我已经收到了。问题是你现在如何实现fade out?由于元素被删除(参见我的 JS 代码),动画似乎不适用于淡出。
【解决方案3】:

有几种方法可以做到这一点。您可以使用style 属性设置新添加元素的不透明度:

const main = document.getElementById('main');
const btn = document.getElementById('btn');

let show = false;
let fading = false;
btn.addEventListener('click', () => {
  if (fading) return;
  if (show) {
    const newDiv = document.getElementById("new-div");
    newDiv.style = "opacity: 0"; // start the fade
    fading = true;
    window.setTimeout(function() {
      fading = false; // disable showing/hiding while fading
      newDiv.remove(); // remove after fade completed
      show = false;
    }, 2000);
  } else {
    show = true;
    const newDiv = document.createElement('div');
    newDiv.id = "new-div";
    newDiv.innerHTML = "<p>This is new Div</p>";
    main.appendChild(newDiv);
    window.setTimeout(function() {
      newDiv.style = "opacity: 1"; // Start fading after a minimal time
    });
  }
})
#new-div {
  transition: all 2s ease-in-out;
  opacity: 0;
}
<div id="main">
  <button id="btn">Animate</button>
</div>

或者你可以使用jQuery,大大减少了代码:

$("#btn").on('click', () => {
  var newDiv = $("#new-div");
  if (newDiv.length) {
    newDiv.stop().fadeOut(2000, function() {
      newDiv.remove();
    });
  } else {
    $(`<div id='new-div'>
       <p>This is new Div</p>
       </div`).appendTo("#main").hide().fadeIn(2000);
  }
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="main">
  <button id="btn">Animate</button>
</div>

【讨论】:

  • 嗨,顺便说一句,在您的香草 JS 答案中,淡出动画仅起作用。我需要的是两者 - 淡入和淡出。提前致谢。
  • 我想在 vanilla JS 中实现这个。
  • 我找到了解决这个问题的潜在方法:jsfiddle.net/0g5cbun6,你能帮我支持animationend事件监听器吗?
【解决方案4】:

您可以简单地使用 jQuery 中的 fadeIn()fadeOut() 方法。

下面是一个例子:

let alreadyClicked = false;

$("#btn").click(function() {
   if(alreadyClicked == false) {
      $("p").remove(); //Remove the paragraph if already created.
      $("#main").append("<p style='display: none;'>Hello, world!</p>"); //Create a paragraph.
      $("p").fadeIn(); //Show it by fading it in.
      alreadyClicked = true;
   } else {
      $("p").fadeOut();  //Fade it out
      alreadyClicked = false;
   }
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div id="main">
  <button id="btn">Animate</button>
</div>

【讨论】:

  • 为什么要使用大型库来只淡入/淡出一个 div?
  • @KennyDope jQuery 是一个大型库吗?!
  • 是的,只是淡化它,恕我直言,您应该始终考虑添加到 http 请求的代码量和大小..
  • 对不起,我没有提到,我正在寻找香草 JS 的答案。顺便谢谢。
  • @cdadityang 你真的在寻找 VanillaJS anwser 吗?
猜你喜欢
  • 2011-07-14
  • 2019-01-01
  • 2016-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多