如何用纯 JavaScript 制作淡出效果

IT技术 javascript fadeout
2021-02-24 06:45:12

我正在尝试div使用纯 JavaScript为 a 制作淡出效果

这是我目前使用的:

//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

6个回答

最初当没有设置不透明度时,该值将是一个空字符串,这将导致您的算术失败。也就是说,"" < 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;
}
<div id="target">Click to fade</div>

在进行算术和比较时,一个空字符串似乎被 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?
2021-04-17 06:45:12
@Anakin 已修复,在这种情况下,这是因为我知道它以 1 开头,但如果它以 0.91 开头,则会失败。
2021-04-26 06:45:12
@EwaldBos 不是每个人都希望它停止占用空间。您也可以将其从 DOM 中移除。
2021-04-28 06:45:12
如果您在执行期间切换页面,则此代码段会在未定义的淡入淡出目标上失败。在尝试访问它之前,您应该检查 null 淡入淡出目标。
2021-04-29 06:45:12
只需更改fadeTarget.style.opacity < 0.1fadeTarget.style.opacity == 0
2021-05-01 06:45:12

就在今天早上,我在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函数中的第二个参数来更改淡入淡出的速度

我更喜欢 OP 的代码,看起来 vanilla-js 试图赢得混淆上下文。不过我喜欢那个网站
2021-04-25 06:45:12
我可能会说一个小型化竞赛,在 64 kbit/s 和更低的移动互联网速度仍然很常见的时候,缩小一些东西是很好的。
2021-04-26 06:45:12
好奇你怎么能重写这个以淡入淡出?
2021-04-30 06:45:12
@My1 不要缩小您在答案中发布的内容,而是让缩小器对生产代码执行此操作
2021-05-11 06:45:12

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

event.target.style.transition = '0.8s';
event.target.style.opacity = 0;
这个线程是旧的。那时,我只是为了学习目的而这样做。在实际使用中,我也没有看到应该通过 CSS 转换实现的原因。
2021-04-15 06:45:12
CSS过渡有效,在现实生活中甚至更好。但是,我想要一个纯基于 javascript 的动画。
2021-04-30 06:45:12
为什么@阿纳金?CSS 比 JS 计时器高效得多。
2021-05-08 06:45:12

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

查看

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

虽然这是一个有效的观点,但这应该是一个评论,OP 想知道他们的代码有什么问题,它非常接近工作
2021-04-17 06:45:12
@JuanMendes :- 我是新来的。我没有足够的积分来添加评论。我只能在我的问题和答案中发表评论。
2021-04-21 06:45:12

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;
}
<div id="target">Click to fade</div>