【问题标题】:Javascript fade in/out effect freezes when hovering quickly over images快速悬停在图像上时,Javascript淡入/淡出效果冻结
【发布时间】:2014-10-03 03:02:24
【问题描述】:

我在玩纯 JavaScript,所以我创建了一个小的淡入/淡出对象,以调整图像不透明度 onmouseoveronmouseout。当鼠标悬停和鼠标悬停动作精确时,淡出效果很好:

  1. 从白色背景开始移动光标
  2. 将鼠标悬停在图片上
  3. 将鼠标悬停在白色背景上

问题是,一旦我开始“自然”地将鼠标从一个图像移动到另一个图像,渐变(或者更确切地说是脚本本身)就会冻结。

我不确定这是动画速度问题,还是我在实现中遗漏了一些东西。

如果有人有时间看一看,我会很感激同行检查,这样我就可以解决问题并学习新东西。

这是一个小提琴:http://jsfiddle.net/6bd3xepe/

谢谢!

【问题讨论】:

  • 好吧,据我所知,问题线是'if (element_opacity.toFixed(2)
  • 是的,这就是失败的部分。非常感谢。
  • 我相信真正失败的部分是,当您尝试在图像上进行这种自然运动时,淡出会被以下淡入淡出取消,因此淡出也不会发生。 .
  • 对。我为淡入和淡出创建了单独的间隔属性(更新的小提琴:jsfiddle.net/6bd3xepe/5)。效果要好得多,但是光标移动的高速仍然可以杀死它。
  • 不错。我可能会建议尽量不要使用“that”。肯定有一种简单的方法可以避免这种情况。在这种情况下,不传递匿名函数来设置超时,而是将变亮/变暗封装在您也绑定“this”的函数中。

标签: javascript fadein opacity fadeout


【解决方案1】:

在我看来,FADER 有一个 INTERVAL,每个 IMG 都需要一个。 My jsfiddle fixes this。我为每个带有“圆顶”内容的 IMG 添加了一个 ALT 属性,以规避处理非猫图像的 jsfiddle .. 忽略该部分 - 在下面注释掉。 设计存在一些基本问题 - 跟踪对象和引用是关键。 “this”和“that”的使用对当前的实现没有帮助(参见 cmets to OP)。另外,另一方面,恕我直言,“toFixed(2)”的使用并不是真正需要的,您可以将“o = o + 0.1”缩短为“o += 0.1”。

JS:

var fader = {

    target: document.getElementsByTagName('img'),
    interval: [],
    speed: 25,
    default_opacity: 1,

    init: function() {
        this.bindEvents();
    },

    // Get element's opacity and increase it up to 1
    fadeIn: function(element) {
        var element_opacity = this.getOpacity(element),
            that = this,
            idx = element.getAttribute('data-idx');
        console.log("fI: "+idx+" "+element_opacity);
        this.default_opacity = element_opacity.toFixed(2);

        this.interval[idx] = setInterval(function() {
            if (element_opacity.toFixed(2) < 1) {
                element_opacity = element_opacity + 0.1;
                element.style.opacity = element_opacity.toFixed(2);
            } else {
                clearInterval(that.interval[idx]);
            }
        }, that.speed);
    },

    // Get current opacity and decrease it back to the default one
    fadeOut: function(element) {
        var element_opacity = this.getOpacity(element),
            that = this,
            idx = element.getAttribute('data-idx');
        console.log("fO: "+idx+" "+element_opacity);
        this.interval[idx] = setInterval(function() {
            if (element_opacity.toFixed(2) > that.default_opacity) {
                element_opacity = element_opacity - 0.1;
                element.style.opacity = element_opacity.toFixed(2);
            } else {
                clearInterval(that.interval[idx]);
                element.removeAttribute('style');
            }
        }, that.speed);
    },

    // Get opacity of an element using computed styles
    getOpacity: function(element) {
        var styles = window.getComputedStyle(element),
            opacity = parseFloat(styles.getPropertyValue('opacity'));
        return opacity;
    },

    bindEvents: function() {
        var that = this, count = 0;
        for (var i in this.target) {   
            // the whole "dome" is just a fsfiddle hack - otherwise it sees 7 images instead of 4!
            //if( this.target[i].alt == "dome" ){
            console.log("COUNT: "+count);
            this.target[i].setAttribute('data-idx',count);
            this.target[i].onmouseover = function() {
                that.fadeIn(this);
            }
            this.target[i].onmouseout = function() {
                that.fadeOut(this);
            }
            count++;
            //}
        }
    }

};

fader.init();

【讨论】:

  • 这看起来很有希望并且按预期工作。当然,我想当有人开始在整个屏幕上疯狂移动光标时,没有简单的方法可以防止淡入/淡出效果中断。无论如何,谢谢!
  • 我很确定这是由于对“default_opacity”的混淆造成的......但我的第二把小提琴(jsfiddle.net/6bd3xepe/6)更疯狂......没有冻结但几乎看起来是......抱歉,但我现在该睡觉了,所以我将把重新设计留给你。
  • 确实如此。 default_opacity 全局是我一开始就不喜欢的东西。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 1970-01-01
  • 2015-09-02
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
相关资源
最近更新 更多