Jquery 动画仅适用于一个元素

Posted

技术标签:

【中文标题】Jquery 动画仅适用于一个元素【英文标题】:Jquery animation works for only one element 【发布时间】:2014-08-27 19:03:58 【问题描述】: 该功能会阻止下面的图像褪色。 现在,仅适用于第二个元素 (div.logo),我怎样才能让它同时适用于两个或多个?

我想我应该得到结果列表中每个元素的边框。怎么样?

任何帮助将不胜感激

演示:http://jsfiddle.net/2ZxwY/

JS:

function displayThese(selectorString) 
    var $heading = $(selectorString);
    var h1top = $heading.position().top;
    var h1bottom = h1top + $heading.height();
    var h1left = $heading.position().left;
    var h1right = h1top + $heading.width();

    var divs = $('li').filter(function () 
        var $e = $(this);
        var top = $e.position().top;
        var bottom = top + $e.height();
        var left = $e.position().left;
        var right = left + $e.width();

        return top > h1bottom || bottom < h1top || left > h1right || right < h1left;
    );
    return divs;


(function fadeInDiv() 
    var divsToChange = displayThese('h1, div.logo');
    var elem = divsToChange.eq(Math.floor(Math.random() * divsToChange.length));
    if (!elem.is(':visible')) 
        elem.prev().remove();
        elem.animate(
            opacity: 1
        , Math.floor(Math.random() * 1000), fadeInDiv);
     else 

        elem.animate(
            opacity: (Math.random() * 1)
        , Math.floor(Math.random() * 1000), function () 
            window.setTimeout(fadeInDiv);
        );
    

)();

$(window).resize(function () 
    // Get items that do not change    
    var divs = $('li').not(displayThese());
    divs.css(
        opacity: 0.3
    );
);

【问题讨论】:

【参考方案1】:

首先你应该在文档加载结束时执行fadeInDiv()函数,因为在你的小提琴中,位置被计算为内联(所有'li'的顶部和底部相同)。

另一方面,在获取选择器的位置和维度时,它会获取第一个元素的属性。所以它不适用于你的例子。您只需要传递一个元素。

您需要做的是遍历匹配 selectorString 的元素,过滤不在这些元素后面的“li”元素列表。

function displayThese(selectorString) 
    var divs = $('li');

   // iterate through elements in selector filtering <li> elements
   $(selectorString).each( function( index, value ) 
       var $heading = $(this);
       var h1top = $heading.position().top;
       var h1bottom = h1top + $heading.height();
       var h1left = $heading.position().left;
       var h1right = h1top + $heading.width();   

     divs = divs.filter(function () 
         var $e = $(this);
         var top = $e.position().top;
         var bottom = top + $e.height();
         var left = $e.position().left;
         var right = left + $e.width();

         // return just the elements non touching the selectors
         return !(top < h1bottom && bottom > h1top && 
                 left < h1right && right > h1left);
     );
 );

  return divs;

在调整大小时,您必须停止当前动画并再次启动淡入淡出方法:

$(window).resize(function ()     
    $('li').stop();
    $('li').css("opacity", "0.3");
    fadeInDiv();    
);

这是fiddle

【讨论】:

非常感谢!它应该以相反的方式工作。所以图像会淡入淡出,但元素下方的图像不应该淡出 动画功能也没有了 我需要图像保持淡入淡出!你能帮忙吗? 你也可以看看resize功能吗?我应该执行fadeInDiv();在那里?它似乎加速了? 干得好顺便说一句,只需要看看调整大小是否也有效

以上是关于Jquery 动画仅适用于一个元素的主要内容,如果未能解决你的问题,请参考以下文章

jquery .each 仅适用于第一个元素

jQuery ID 选择器仅适用于第一个元素

更流畅的 Jquery 动画

JQuery 在嵌套元素上查找没有选择器的文本节点仅适用于 .contents() 和 filter()

jQuery背景按钮动画适用于Chrome和IE8,但不适用于Firefox或IE9 [重复]

使用 .each() 可调整大小的 jquery ui 仅适用于第一个孩子