如何使用JavaScript和CSS进行淡入和淡出

Raf*_*fał 53 javascript css xhtml

我想让HTML div标签淡入淡出.

我有一些淡出的代码,但是当我淡入时,div的不透明度保持在0.1并且不会增加.

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

 <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
 <head>
    <title>Fade to Black</title>
    <script type="text/javascript">
        //<![CDATA[
        function slidePanel(elementToSlide, slideSource)
        {
            var element = document.getElementById(elementToSlide);

            if(element.up == null || element.up == false) {
                setTimeout("fadeOut(\"" + elementToSlide + "\")", 100);
                element.up = true;
                slideSource.innerHTML = "Bring it down";
            } else {
                setTimeout("fadeIn(\"" + elementToSlide + "\")", 100);
                element.up = false;
                slideSource.innerHTML = "Take it up";
            }
        }

        function fadeIn(elementToFade)
        {
            var element = document.getElementById(elementToFade);

            element.style.opacity += 0.1;
            if(element.style.opacity > 1.0) {
                element.style.opacity = 1.0;
            } else {
                setTimeout("fadeIn(\"" + elementToFade + "\")", 100);
            }
        }

        function fadeOut(elementToFade)
        {
            var element = document.getElementById(elementToFade);

            element.style.opacity -= 0.1;
            if(element.style.opacity < 0.0) {
                element.style.opacity = 0.0;
            } else {
                setTimeout("fadeOut(\"" + elementToFade + "\")", 100);
            }
        }
        //]]>
    </script>
 </head>
 <body>
    <div>
        <div id="slideSource"
              style="width:150px; height:20px;
                    text-align:center; background:green"
             onclick="slidePanel('panel', this)">
            Take It up
        </div>
        <div id="panel"
              style="width:150px; height:130px;
                    text-align:center; background:red;
                    opacity:1.0;">
            Contents
        </div>
    </div>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

我做错了什么,淡出和淡出元素的最佳方法是什么?

Ibu*_*Ibu 114

这是一种淡出元素的更有效方法:

function fade(element) {
    var op = 1;  // initial opacity
    var timer = setInterval(function () {
        if (op <= 0.1){
            clearInterval(timer);
            element.style.display = 'none';
        }
        element.style.opacity = op;
        element.style.filter = 'alpha(opacity=' + op * 100 + ")";
        op -= op * 0.1;
    }, 50);
}
Run Code Online (Sandbox Code Playgroud)

你可以反过来淡入淡出

setInterval或setTimeout不应该将字符串作为参数

谷歌eval的邪恶知道为什么

这是一种更有效的元素淡入方式.

function unfade(element) {
    var op = 0.1;  // initial opacity
    element.style.display = 'block';
    var timer = setInterval(function () {
        if (op >= 1){
            clearInterval(timer);
        }
        element.style.opacity = op;
        element.style.filter = 'alpha(opacity=' + op * 100 + ")";
        op += op * 0.1;
    }, 10);
}
Run Code Online (Sandbox Code Playgroud)

  • +1为更少的eval和非依赖解决方案:) (12认同)
  • @DanDascalescu,因为你正在评论一个7岁的答案! (5认同)
  • 截至2015年,我将使用[requestAnimationFrame](http://idiallo.com/javascript/using-requestanimationframe)并使用setTimeout作为后备. (4认同)

Gb0*_*b01 54

这是Seattle Ninja解决方案的简化运行示例.

var slideSource = document.getElementById('slideSource');

document.getElementById('handle').onclick = function () {
  slideSource.classList.toggle('fade');
}
Run Code Online (Sandbox Code Playgroud)
#slideSource {
  opacity: 1;
  transition: opacity 1s; 
}

#slideSource.fade {
  opacity: 0;
}
Run Code Online (Sandbox Code Playgroud)
<button id="handle">Fade</button> 
<div id="slideSource">Whatever you want here - images or text</div>
Run Code Online (Sandbox Code Playgroud)


Ita*_*agi 23

为什么这样对自己?

jQuery的:

$("#element").fadeOut();
$("#element").fadeIn();
Run Code Online (Sandbox Code Playgroud)

我认为这更容易.

www.jquery.com

  • 因为当你只想淡入淡出的东西时,你不想等待一个巨大的脚本加载. (68认同)
  • 使用错误的连接,你会发现差异.@ItaiSagi (7认同)
  • 太棒了,我不知道你能用jQuery轻松做到这一点 (4认同)
  • 为什么这样对自己.当天最好的评论:) (4认同)
  • 相信我,我只是将我的整个 jQuery 代码更改为 vanilla JS,并将所有 jQuery 动画更改为 CSS3。你会注意到不同之处......所有的 CSS3 动画都是 GPU 加速的,这使得它们非常流畅...... (3认同)

Sea*_*nja 10

这是我尝试使用Javascript和CSS3动画所以HTML:

 <div id="handle">Fade</div> 
 <div id="slideSource">Whatever you want images or  text here</div>
Run Code Online (Sandbox Code Playgroud)

带过渡的CSS3:

div#slideSource {
opacity:1;
-webkit-transition: opacity 3s;
-moz-transition: opacity 3s;     
transition: opacity 3s; 
}

div#slideSource.fade {
opacity:0;
}
Run Code Online (Sandbox Code Playgroud)

Javascript部分.检查className是否存在,如果存在,则添加类和转换.

document.getElementById('handle').onclick = function(){
    if(slideSource.className){
        document.getElementById('slideSource').className = '';
    } else {
        document.getElementById('slideSource').className = 'fade';
    }
}
Run Code Online (Sandbox Code Playgroud)

只需点击它就会淡入淡出.我建议使用JQuery作为Itai Sagi提到的.我遗漏了Opera和MS,所以我建议使用prefixr在css中添加它.这是我第一次发布stackoverflow,但它应该工作正常.


Raf*_*fał 8

好的,我已经解决了

element.style.opacity = parseFloat(element.style.opacity) + 0.1;
Run Code Online (Sandbox Code Playgroud)

应该用来代替

element.style.opacity += 0.1;
Run Code Online (Sandbox Code Playgroud)

与...相同

element.style.opacity = parseFloat(element.style.opacity) - 0.1;
Run Code Online (Sandbox Code Playgroud)

代替

element.style.opacity -= 0.1;
Run Code Online (Sandbox Code Playgroud)

因为不透明度值存储为字符串,而不是float.我仍然不确定为什么添加有效.