【问题标题】:Why does "($(this).css('opacity')==.3)" not work?为什么“($(this).css('opacity')==.3)”不起作用?
【发布时间】:2014-11-02 21:29:00
【问题描述】:

我正在尝试在 jquery 中创建一个 if 语句来检查不透明度是否为 .3,但它没有 工作。

if ($(this).css('opacity')==.3) {$(this).fadeTo(500,1);}

我是否错误地格式化了不透明度?我也尝试了0.3 无济于事。

背景:

我正在使用淡入淡出效果,当您滚动经过对象时它会淡入,而当您向上滚动时它会淡出。

myfunkyside 在这里向我展示了如何做到这一点:Fade In on Scroll Down, Fade Out on Scroll Up - based on element position in window

myfunkyside 的原创 jsfiddle:http://jsfiddle.net/b7qnrsrz/1/

在这种情况下,淡入淡出从 0 不透明度变为 1 并返回。我想从 .3 到 1 再返回。

我尝试替换

if (objectBottom < windowBottom) {
    if ($(this).css('opacity')==0) {$(this).fadeTo(500,1);}
} else { //object goes out of view (scrolling up)
    if ($(this).css('opacity')==1) {$(this).fadeTo(500,0);}
}

if (objectBottom < windowBottom) {
    if ($(this).css('opacity')==.3) {$(this).fadeTo(500,1);}
} else { //object goes out of view (scrolling up)
    if ($(this).css('opacity')==1) {$(this).fadeTo(500,.3);}
}

但它不起作用。这是我对 jsfiddle 的尝试:http://jsfiddle.net/b7qnrsrz/3/

感谢您查看此内容!

【问题讨论】:

  • console.log($(this).css('opacity'))?这可能是因为浮点数应该仔细比较
  • @zerkms 0.300000011920929
  • 我很确定要编辑 CSS 值,你必须使用 $(selector).css('prop', 'value')(如果是数字,则不带引号)
  • 试试toFixed。 IE。 $(this).css("opacity").toFixed(2); 舍入到小数点后 2 位
  • @Firedrake969 我认为他不是在编辑,而是在检查。问题似乎不完全是 3。ArtOfCode 的解决方案可能会解决它。

标签: javascript jquery css


【解决方案1】:

问题在于 JavaScript 中的浮点数并不总是严格意义上的 .3.5,一些其他数字也会添加到末尾。试着把第一个条件放在最上面,如果它是假的,就跳到另一个,因为理论上,你不应该有其他状态。

我还建议将 $(this) 分配给一个变量,以防止 jQuery 不得不创建相同元素的实例 3 次。

var $this = $(this),
    opacity = $this.css('opacity');
if (objectBottom < windowBottom){
    if (opacity != 1) $this.stop().fadeTo(500,1);
}
else if (opacity == 1) $this.stop().fadeTo(500,.3);

我还添加了.stop(),因为如果有人出于某种原因快速上下滚动,元素上的动画队列可能会填满并由于所有淡入淡出的动画仍在队列中而导致脉冲效果。 Stop 通过清除队列中的动画来防止这种情况发生,从而立即执行以下动画。

还有,这个

$(window).scroll(function() {fade();});

可以缩短为

$(window).scroll(fade);

工作示例:

$(window).on("load",function() {
    function fade() {
        $('.fade').each(function() {
            var objectBottom = $(this).offset().top + $(this).outerHeight(),
                windowBottom = $(window).scrollTop() + $(window).innerHeight(),
                $this = $(this),
                opacity = $this.css('opacity');
            
            if (objectBottom < windowBottom){
                if (opacity != 1) $this.fadeTo(500,1);
            }
            else if (opacity == 1) $this.fadeTo(500,.3);
        });
    }
    fade();
    $(window).scroll(fade); //Fade in elements during scroll
});
.fade {
    margin: 50px;
    padding: 50px;
    background-color: lightgreen;
    opacity: .3;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.1/jquery.min.js"></script>
<div>
    <div class="fade">Fade In 01</div>
    <div class="fade">Fade In 02</div>
    <div class="fade">Fade In 03</div>
    <div class="fade">Fade In 04</div>
    <div class="fade">Fade In 05</div>
    <div class="fade">Fade In 06</div>
    <div class="fade">Fade In 07</div>
    <div class="fade">Fade In 08</div>
    <div class="fade">Fade In 09</div>
    <div class="fade">Fade In 10</div>
</div>

【讨论】:

    【解决方案2】:

    只需使用 javascript Math 即可获得一位小数的不透明度值:

    if (Math.round($(this).css('opacity') * 10) / 10 == .3) {
      $(this).fadeTo(500,1);
    }
    

    【讨论】:

    • @miminographite 如果您将使用此解决方案,那么您将能够使用不同的不透明度选项,因为 if else 只会给您 2 个选项...只是希望您牢记这一点 ;)跨度>
    【解决方案3】:

    浮点数可能不精确,如需了解更多信息,请转至floating-point-gui.de

    您需要做的是使用“epsilon”:您的期望值和实际值之间可接受的差异范围。

    abs(VALUE) - COMPARE < EPSILON
    

    所以你的比较应该是:

    Math.abs($(this).css('opacity')) - .3 < 0.01
    

    对于 0.01 可接受的错误。这可能更具体,但我认为这种情况下没有必要。

    【讨论】:

    • 你应该把左边换成一个绝对值。
    【解决方案4】:

    您可以按照其他人所说的去做,或者由于您只处理两种情况(阳性/阴性测试),您可以使用==1!=1,而不是==.3。另外,它是 jQuery,请确保使用 .stop() 与过渡/动画。

    http://jsfiddle.net/b7qnrsrz/16/

    【讨论】:

    • 你的函数需要更多的逻辑。每次滚动时,您都在调用该函数,该函数正在堆叠事件(并添加时间)。使用stop(true,true) 通常是一个答案,但是您不希望动画立即完成。因此,您需要代码来检测当前动画,而不是堆叠它们,而是在动画超出窗口范围时更改动画。
    • 这似乎是最简单的解决方案。谢谢!由于动画延迟,我对其进行了一些修改,因此我取出了 if 语句的“.stop()”,它似乎完全按预期工作。 jsfiddle
    • 我把它们放在那里的原因是当你快速上下滚动时。试一试,注意当你这样做时会发生什么。没关系,我以为你把它从两者中取出,而你似乎只从其中取出它,所以它可能会起作用。
    【解决方案5】:

    你可以这样做:

        $('.fade').each(function () {
            /* Check the location of each desired element */
            var objectBottom = $(this).offset().top + $(this).outerHeight();
            var windowBottom = $(window).scrollTop() + $(window).innerHeight();
    
            var opacityPercentage = parseInt($(this).css("opacity") * 100);
            /* If the object is completely visible in the window, fade it in */
            if (objectBottom < windowBottom) { //object comes into view (scrolling down)
                if (opacityPercentage == 30) {
                    $(this).fadeTo(500, 1);
                }
            } else { //object goes out of view (scrolling up)
                if (opacityPercentage == 100) {
                    $(this).fadeTo(500, 0.3);
                }
            }
        });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-04-18
      • 1970-01-01
      • 2022-12-13
      • 2015-09-30
      • 2011-11-21
      • 2021-12-25
      • 1970-01-01
      • 2015-12-05
      相关资源
      最近更新 更多