【问题标题】:How to make fadeOut effect with pure JavaScript如何使用纯 JavaScript 制作淡出效果
【发布时间】:2015-05-15 01:24:01
【问题描述】:

我正在尝试使用 纯 JavaScriptdiv 制作淡出效果。

这是我目前正在使用的:

//Imagine I want to fadeOut an element with id = "target"
function fadeOutEffect()
{
 var fadeTarget = document.getElementById("target");
 var fadeEffect = setInterval(function() {
  if (fadeTarget.style.opacity < 0.1)
  {
   clearInterval(fadeEffect);
  }
  else
  {
   fadeTarget.style.opacity -= 0.1;
  }
 }, 200);
}

div 应该会平滑地淡出,但它会立即消失。

怎么了?我该如何解决?

jsbin

【问题讨论】:

  • 您是否在代码中看到 9 个显示 jsbin 的错误?
  • 还要检查fadeTarget.style.opacity 的值,如果你不手动设置style - 它是空的
  • 真的吗?我的 jsbin 没有任何错误。
  • 您的 jsbin 显示 9 错误,例如:第 27 行:需要一个条件表达式,而是看到一个赋值。
  • 我的 jsbin 的控制台是空的。

标签: javascript fadeout


【解决方案1】:

最初,当没有设置不透明度时,该值将是一个空字符串,这将导致您的算术失败。也就是说,"" &lt; 0.1 == true 和您的代码进入 clearInterval 分支。

您可以将其默认为 1,它会起作用。

function fadeOutEffect() {
    var fadeTarget = document.getElementById("target");
    var fadeEffect = setInterval(function () {
        if (!fadeTarget.style.opacity) {
            fadeTarget.style.opacity = 1;
        }
        if (fadeTarget.style.opacity > 0) {
            fadeTarget.style.opacity -= 0.1;
        } else {
            clearInterval(fadeEffect);
        }
    }, 200);
}

document.getElementById("target").addEventListener('click', fadeOutEffect);
#target {
    height: 100px;
    background-color: red;
}
&lt;div id="target"&gt;Click to fade&lt;/div&gt;

在进行算术和比较时,空字符串似乎被 JavaScript 视为 0(即使在 CSS 中它将该空字符串视为完全不透明)

> '' < 0.1
> true

> '' > 0.1
> false


> '' - 0.1
> -0.1

更简单的方法 我们现在可以使用CSS transitions 以更少的代码实现淡出

const target = document.getElementById("target");

target.addEventListener('click', () => target.style.opacity = '0');
// If you want to remove it from the page after the fadeout
target.addEventListener('transitionend', () => target.remove());
#target {
    height: 100px;
    background-color: red;
    transition: opacity 1s;
}
<p>Some text before<p>
<div id="target">Click to fade</div>
<p>Some text after</p>

【讨论】:

  • 补充:为什么不透明度停在0.1而不是0?
  • 只需将fadeTarget.style.opacity &lt; 0.1 更改为fadeTarget.style.opacity == 0
  • @Anakin 已修复,在这种情况下,这是因为我知道它以 1 开头,但如果它以 0.91 开头就会失败。
  • 如果您在执行期间切换页面,此 sn-p 在未定义的 fadeTarget 上失败。您应该在尝试访问之前检查 null fadeTarget。
  • @EwaldBos 并不是每个人都希望它停止占用空间。您也可以将其从 DOM 中移除。
【解决方案2】:

就在今天早上我在http://vanilla-js.com找到了这段代码,非常简单、紧凑、快速:

var s = document.getElementById('thing').style;
s.opacity = 1;
(function fade(){(s.opacity-=.1)<0?s.display="none":setTimeout(fade,40)})();

您可以通过更改setTimeOut 函数中的第二个参数来更改淡入淡出的速度。

var s = document.getElementById('thing').style;
s.opacity = 1;
(function fade(){(s.opacity-=.1)<0?s.display="none":setTimeout(fade,40)})();
#thing {
  background: red;
  line-height: 40px;
}
&lt;div id="thing"&gt;I will fade...&lt;/div&gt;

【讨论】:

  • 我更喜欢 OP 的代码,看起来 vanilla-js 试图赢得混淆上下文。不过我喜欢那个网站
  • 我可能更愿意说一个小型化竞赛,在 64 kbit/s 及更低的移动互联网速度仍然很普遍的时代,缩小东西是件好事。
  • @My1 不要缩小您在答案中发布的内容,而是让缩小器对生产代码执行此操作
  • 想知道如何重写它以淡入?
【解决方案3】:

看起来你可以用另一种方式来做(我可能错了)。

event.target.style.transition = '0.8s';
event.target.style.opacity = 0;

【讨论】:

  • CSS 过渡效果很好,在现实生活中效果更好。但是,我想要一个纯基于 javascript 的动画。
  • 为什么选择@Anakin? CSS 比 JS 计时器高效得多。
  • 这个帖子太旧了。那时,我这样做只是为了学习目的。在实际使用中,我看不出有什么理由应该通过 CSS 过渡来实现。
【解决方案4】:

您可以使用 CSS 转换属性,而不是在 javascript 中执行 vai timer。与您正在做的事情相比,这更注重性能。

检查

http://fvsch.com/code/transition-fade/test5.html#test3

【讨论】:

  • 这是一个有效的观点,这应该是一个评论,OP 想知道他们的代码有什么问题,它非常接近工作
  • @JuanMendes :- 我是新来的。我没有足够的积分来添加 cmets。我只能在我的问题和答案中发表评论。
【解决方案5】:

function fadeOutEffect() {
    var fadeTarget = document.getElementById("target");
    var fadeEffect = setInterval(function () {
        if (!fadeTarget.style.opacity) {
            fadeTarget.style.opacity = 1;
        }
        if (fadeTarget.style.opacity > 0) {
            fadeTarget.style.opacity -= 0.1;
        } else {
            clearInterval(fadeEffect);
        }
    }, 200);
}

document.getElementById("target").addEventListener('click', fadeOutEffect);
#target {
    height: 100px;
    background-color: red;
}
&lt;div id="target"&gt;Click to fade&lt;/div&gt;

【讨论】:

    【解决方案6】:

    除了接受的答案之外,我们现在还有WAAPI,它基本上将动画 API 添加到 JavaScript。

    例如,

    /**
     * @returns {Object}
    */
    function defaultFadeConfig() {
      return {      
          easing: 'linear', 
          iterations: 1, 
          direction: 'normal', 
          fill: 'forwards',
          delay: 0,
          endDelay: 0
        }  
    }
    
    /** 
     * @param {HTMLElement} el
     * @param {number} durationInMs
     * @param {Object} config
     * @returns {Promise}
     */
    async function fadeOut(el, durationInMs, config = defaultFadeConfig()) {  
      return new Promise((resolve, reject) => {         
        const animation = el.animate([
          { opacity: '1' },
          { opacity: '0', offset: 0.5 },
          { opacity: '0', offset: 1 }
        ], {duration: durationInMs, ...config});
        animation.onfinish = () => resolve();
      })
    }
    
    /** 
     * @param {HTMLElement} el
     * @param {number} durationInMs
     * @param {Object} config
     * @returns {Promise}
     */
    async function fadeIn(el, durationInMs, config = defaultFadeConfig()) {
      return new Promise((resolve) => {         
        const animation = el.animate([
          { opacity: '0' },
          { opacity: '0.5', offset: 0.5 },
          { opacity: '1', offset: 1 }
        ], {duration: durationInMs, ...config});
        animation.onfinish = () => resolve();
      });
    }
    
    window.addEventListener('load', async ()=> {
      const el = document.getElementById('el1');  
      for(const ipsum of "Neque porro quisquam est qui dolorem ipsum quia dolor \uD83D\uDE00".split(' ')) {
        await fadeOut(el, 1000);  
        el.innerText = ipsum;
        await fadeIn(el, 2000);
      }
    });
    .text-center {
      text-align: center;
    }
    &lt;h1 id="el1" class="text-center"&gt;...&lt;/h1&gt;

    【讨论】:

      【解决方案7】:

      我的解决方案

      function fadeOut(selector, timeInterval, callback = null) {
      
          var fadeTarget = document.querySelector(selector);
      
          let time = timeInterval / 1000;
          fadeTarget.style.transition = time + 's';
          fadeTarget.style.opacity = 0;
          var fadeEffect = setInterval(function() {
      
              if (fadeTarget.style.opacity <= 0)
              {
                  clearInterval(fadeEffect);
                  if (typeof (callback) === 'function') {
                      callback();
                  }
              }
          }, timeInterval);
      }
      

      【讨论】:

        猜你喜欢
        • 2014-09-12
        • 2021-12-06
        • 1970-01-01
        • 1970-01-01
        • 2021-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-02-20
        相关资源
        最近更新 更多