【问题标题】:Hover FadeIn FadeOut悬停 淡入 淡出
【发布时间】:2009-11-05 19:02:59
【问题描述】:

我正在尝试创建一个悬停动作,它会带来彩色图像,并且一旦悬停被移除,它就会淡出回到原来的图像。

目前它会淡出图像,然后淡入新图像。无论我是否悬停,它都会保持原位。

//Loop through the images and print them to the page
   for (var i=0; i < totalBoxes; i++){
    $.ajax({
     url: "random.php?no=",
     cache: false,
     success: function(html) {
      // following line I originally suggested, but let's make it better...
      //$('#bg').append(html).fadeIn('slow');
      // also note the fine difference between append and appendTo.
      var $d = $(html).hide().appendTo('#bg').fadeIn('slow');
      $('img', $d).hover(function() {
       var largePath = $(this).attr("rel");
       $(this).fadeOut("slow", function() {
        $(this).attr({ src: largePath }).fadeIn("slow");
       });
      });
     }
    });
   }

更新:

请看一下这个链接:

http://www.yellostudio.co.uk/temp/index.php#

我正在尝试让图像在翻转时交叉淡入并在淡出时淡出...

任何人都可以帮忙,我很近,我花了好几个小时试图解决这个问题......

【问题讨论】:

  • 所以你想让黑白图像在鼠标悬停时变成彩色,然后在鼠标悬停时返回?现在它正在切换,然后在鼠标悬停时淡出并重新显示。
  • 是的,完全正确,coreyward...我觉得我对这个我讨厌的人造成了很多悲伤...
  • 既然你想要交叉淡入淡出,只需淡化你的正面图像。不用担心黑白图像会褪色。
  • 我将您的两个重复问题合并为一个。将来,当您有新信息时,请编辑您的问题,以便我们将所有信息保存在一个地方。谢谢,欢迎来到 SO。
  • 安迪——我用你应该需要的所有代码更新了我的答案——检查一下。

标签: jquery hover fadein fadeout


【解决方案1】:

hover() 接受两个函数参数,一个用于mouseover,另一个用于mouseout。你只提供了第一个。您需要提供第二个来撤消mouseout 上的图像交换。

如果您希望fadeOutfadeIn 并发,请不要将fadeIn 放在fadeOut 的回调中。只需将它们分开声明即可:

$(this).fadeOut("slow");
$(this).attr({ src: largePath }).fadeIn("slow");

按照您的方式,fadeInfadeOut 完成之前不会启动。这样,它们将同时开始和结束。

【讨论】:

  • 在一个元素上应用两个并发动画不会提供交叉淡入淡出效果。您的代码将开始淡出,但不是一直淡出,然后在淡出和淡出时立即更改图像。
  • 您好,没有惊喜,感谢您的帮助....屏幕...您能对此有所了解吗?再次感谢
  • 哦,对不起。 joshperry 是对的:只有当您有两个图像并且它们绝对位于彼此之上时才有效。
  • 我通过“rel”调用它有什么不同吗?
【解决方案2】:

我认为您需要存储原始图像路径(这是您想要在悬停时淡出的路径,对),然后在悬停时恢复它。

var $d = $(html).hide().appendTo('#bg').fadeIn('slow');
$('img', $d).hover(function() {
    var largePath = $(this).attr("rel");
    $(this).data('orig', $(this).attr('src') );
    $(this).fadeOut("slow", function() {
         $(this).attr({ src: largePath }).fadeIn("slow");
     });
},function() {
    var origPath = $(this).data('orig');
    $(this).fadeOut("slow", function() {
         $(this).attr({ src: origPath }).fadeIn("slow");
     });
});

假设“亮”的图片作为src属性,你使用opacity来实现效果。

var $d = $(html).hide().appendTo('#bg');
$('img',$d).css('opacity',0.33);
           .hover( function() {
               $(this).fadeTo('slow',1.0);
            }, function() {
               $(this).fadeTo('slow',0.33);
            });

【讨论】:

  • 嘿,谢谢 tvanfosson,您建议的代码我刚刚测试过并且可以正常工作,但是如果您有时间检查链接我会很感激...
  • 我没有想到这一点,但是您需要等到 fadeOut 完成后才能替换 src 属性。否则,在淡出完成之前,您最终会得到完全不透明的新图像(闪光灯)。通过将更改移动到 fadeOut 回调中来做到这一点。此外,您是否考虑过使用相同的“明亮”图像在悬停时简单地调整 50% 和 100% 之间的不透明度,而不是在明暗图像之间切换。这可能是您正在寻找的“交叉淡入淡出”效果。
【解决方案3】:

我可以建议:http://colorpowered.com/blend/

它会做你想做的事。


编辑: 好吧,首先,我肯定会更改代码的 ajax 部分,让它通过 json 返回所有图像(更好的是我会在后端执行此操作,但是,我不确定您的网站如何设置)。无论如何,看起来你正在不必要地淡出你的其他图像。只需将彩色图像放置在具有绝对定位的其他图像之上。也许您的代码可能看起来像这样:

Javascript:

$.ajaxSetup({cache:false});
$('.hoverImg').live('mouseover',function() {
   $hovered = $(this);
   var colorPath = $hovered.attr("rel");
   var rndId = Math.floor(Math.random()*100000);
   var $colorImg = $('<img />');
   $colorImg
       .hide()
       .addClass("fader")
       .attr('src',colorPath)
       .attr('id','img_'+rndId)
       .css({position:'absolute',zIndex:10});
   $hovered.css({zIndex:9}).data('overImgId',rndId).before($colorImg);
   $('#img_'+rndId).stop().fadeIn("slow");
});
$('.hoverImg').live('mouseout',function() {
    var rndId = $(this).data('overImgId')
    $('#img_'+rndId).stop().fadeOut("slow");
});
$.getJSON('random.php',{numBoxes:totalBoxes},function(json) {
    if(json.length > 0) {
        $.each(json,function(i,val) {
            $(val).hide().appendTo('#bg').find('img').addClass('hoverImg');
        });
    }
});

PHP:

<?php //random.php (really simplified, probably)
if(isset($_GET['numBoxes']) && !empty($_GET['numBoxes'])) {
    /*
        Get all the html stuff you need into an array...
        Could look something like:
        $imgs = array(
            '<div><img src="foo.jpg" rel="color_foo.jpg" /></div>',
            '<div><img src="bar.jpg" rel="color_bar.jpg" /></div>'
        );
    */
    echo json_encode($imgs);
}

这应该基本上可以工作。那里可能有一些错别字和东西,但据我所知,它应该可以工作。当然,根据您的情况,您可能需要调整/更改其中的一些内容。

祝你的项目好运!

重要编辑:我忘记在 PHP 代码中添加一个关键部分。我在&lt;img&gt; 标签中添加了“rel”属性。

【讨论】:

  • 谢谢你,它看起来真的很有用,但我希望只是修改我的代码,因为我知道我快到了...... :@) 我希望!
  • 哇,这与我所拥有的完全不同。我会试一试,看看我会怎么做。我在 json 方面没有任何经验
  • jquery blend 插件是你的吗?我刚刚给你发了一封电子邮件。
  • 我想付钱给你添加你的解决方案,虽然我觉得它的工作速度很慢,而且我希望它的淡入效果只是工作。当我使用 rel 属性来引用另一张图像时,淡入淡出工作完美,但我无法让交叉淡入淡出发生....
  • 不,我没有制作我链接到的混合插件。这是一个相当不错的。我在本网站上为您提供的任何解决方案都不需要任何形式的付款。我上面提供的内容对您不起作用吗?
【解决方案4】:

您可以使用一些额外的代码来做到这一点。将淡入图像放在淡出图像的顶部,不透明度设置为 0。将悬停代码添加到淡入图像(它在顶部,因此它会获取事件)。

$('#top-image').hover(function() {
$(this).stop().fadeTo(1000, 1);
$('#bottom-image').stop().fadeTo(1000, 0);
},
function() {
$(this).stop().fadeTo(1000, 0);
$('#bottom-image').stop().fadeTo(1000, 1);
});

两个图像都淡入淡出,并且通过使用 stop() 函数,快速进出鼠标不会导致一系列重复的动画。

【讨论】:

  • 您是否有兴趣通过付款让这件事为我工作?
  • 我不确定如何将上述代码添加到我已有的代码中!
  • 这只是示例代码,我只是随便写的。如果您仍然卡住,请随时与我联系...
  • 只是尝试来自 anotehr 用户的另一种解决方案......现在迷失在这一切中:)
【解决方案5】:

如果要进行交叉淡入淡出,您需要两张图像,一张淡入,一张同时淡出。看看有这个效果的page I did。我写的插件就在页面源码中,大家可以看看。这两个图像需要有position: absolute;,以便它们在交叉淡入淡出时占据页面的相同区域。

正如 No Surprises 所说,您只是为鼠标悬停提供了对 hover 的回调,而不是鼠标取消悬停,您可以在此处交叉淡入淡出回到原始状态。

此代码可能有效,记住 CSS 中的绝对定位,并且您可能希望将 CSS 类添加到 backImg,并且图像必须位于订阅悬停事件的离散父元素中:

for (var i=0; i < totalBoxes; i++){
    $.ajax({
        url: "random.php?no=",
        cache: false,
        success: function(html) {
            $(html)
                .hide()
                .appendTo('#bg')
                .fadeIn('slow')
                .children('img').each(function() {
                    var img = $(this);
                    var largePath = img.attr("rel");
                    var backImg = $("<img src='" + largePath + "'/>");
                    img.after(backImg);

                    img.parent().hover(
                        function() { // over
                            backImg.stop().fadeIn("slow");
                            img.stop().fadeOut("slow");
                        },
                        function() { // out
                            backImg.stop().fadeOut("slow");
                            img.stop().fadeIn("slow");
                        }
                    );
                });
        }
    });
}

【讨论】:

  • 你能告诉我如何修改我的代码以加入鼠标吗?它使用 rel 属性来拉入新图像。
  • joshperry,感谢您对此的帮助...我真的花了好几个小时...我已经上传了代码,所以您可以看到发生了什么...不幸的是它不起作用。
  • 我添加了可能对你有用的代码,但我仍然建议在 KyleFarris 的回答中使用更通用的混合插件。
  • 对不起,我很乐意为您提供更多帮助,不幸的是,这不是一个咨询网站,它是一个问答网站,旨在帮助大多数了解底层技术的人。我的答案中的代码很少在剪切粘贴的情况下工作,并且让提问者有责任塑造解决方案以适应他们的具体实施。
  • 我现在已经更新了它,它已经到了那里,只是交叉淡入淡出位......它在悬停开始时闪烁而不是在顶部淡入......谢谢乔希!跨度>
【解决方案6】:

我在这里发现了一个问题...

var backImg = $("<img src='" + largePath + "'/>");

这不是一个有效的选择器。试试这个:

var backImg = $('img[src="' + largePath + '"]');

您不想在选择器中使用 ,属性选择器语法应如下所示:[attr="value"]
您应该注意,我在代码中颠倒了 ' 和 " 的使用 - 我就是这样做的,它在语法上是相同的。您选择的引号没有任何问题。

【讨论】:

  • 感谢您的输入,我找不到任何对 backImg 的引用
【解决方案7】:

好的,感谢大家的帮助...我到了某个地方...我并不完全满意,因为它比我最初预期的要慢,因为我现在加载两个图像,与一个图像相对...使用 rel 属性让它更快,因为我只在悬停时加载图像......

但是感谢大家,这里有一个解决方案...

          //Loop through the images and print them to the page
        for (var i=0; i < totalBoxes; i++){
            $.ajax({
                url: "random.php?no=",
                cache: false,
                success: function(html) {

                    var $d = $(html).hide().appendTo('#bg').fadeIn('slow');
                    $('#colour img').css("opacity", 0);
                    $('img', $d).hover(function() { 
                        $(this).stop().fadeTo(700, 1);
                    },function() {
                        $(this).stop().fadeTo(700, 0);
                    });

                }
            });
        }

我的 php 打印...

<div class="pf-box">
    <a href="#">
    <div class="black"><img src="'.$image_folder.'/'.$image_name.'.jpg" alt="'.$image_name.'" border="0" /></div>
    <div class="colour"><img src="'.$image_folder.'/'.$image_name.'-c.jpg" alt="'.$image_name.'" border="0" /></div>
    </a>
  </div>

【讨论】:

  • 你觉得哪个部分慢?初始加载还是悬停?
  • 加载速度很慢,因为我加载了两个图像......在我尝试加载一个之前,然后使用 rel 属性加载第二个,只有当它悬停时,它会在一个之后更平滑地淡入淡出另一个在您第一次加载页面时。
  • 如果你想让初始淡入更快,那么只需将fadeTo(700,1) 更改为更快的fadeTo(100,1)
  • 不抱歉,我的意思是当它将图像附加到页面时,我让它淡入...所以它循环通过拉取和随机图像,然后使用淡入淡出附加到页面。之前它真的很快,但现在它很笨重,因为我从随机页面带来了两张图片,而不是在悬停时引用 rel 属性来交换图片......
  • 啊,所以这是您担心的初始页面加载——因为我不会遍历您的 ajax 调用。这开销太大了。调用一次 ajax 并让它返回一个包含所有可能图像的数组,然后在 javascript 中重复地从该数组中提取随机图像。
【解决方案8】:

在您的样式表中添加:

.colour {
  display:none;
}

然后将你的成功函数改为:

var $d = $(html).hide().appendTo('#bg').fadeIn('slow');
$('.pf-box', $d).hover(function() {
  $('.colour', $(this)).fadeIn("slow");      
},function() {
  $('.colour', $(this)).fadeOut("slow");      
});

更新

要解决加载缓慢的问题,您需要让 PHP 返回一个包含所有图像的对象,例如(假设它称为 images.php - 将下面的代码放在 &lt;?php ?&gt; 中)(您想要使用 json_encode() 但他使用的是旧版本的 PHP):

header('Content-type: application/json');
echo '{
  {'black' : 'url', 'colour' : 'url'},
  {'black' : 'url2', 'colour' : 'url2'}
}';

然后在你想要的javascript中:

//generate all the boxes
$.get('images.php',function(data){
  for (var i=0; i < totalBoxes; i++){
      var randomImage = data[Math.floor(Math.random() * data.length)];
      $('<div class="pf-box"><img class="black" src="' + randomImage['black'] + '" /><img class="colour" src="' + randomImage['colour'] + '" /></div>').hide().appendTo('#bg').fadeIn('slow').filter('.colour').css("opacity", 0);
  }
 },'json');

 //add the hover behavior to all the elements
 $('.pf-box').hover(function() {
   $('.colour',$(this)).stop().fadeTo(700, 1);
 },function() {
   $('.colour',$(this)).stop().fadeTo(700, 0);
 });

这段代码应该可以工作...但我还没有测试过。可能有错别字。但这就是它的要点。

【讨论】:

  • 谢谢亚伦,我试过你的方法,不幸的是它没有用。我在下面求助于我的答案......虽然它现在真的很笨重......对它不满意:“(
  • 好吧,这看起来很有希望,它是否会遍历数组然后不管返回多少?所以如果我做了一个调整大小的函数,它会遍历同一个数组并添加更多?
  • 我已经尝试过了,但它没有定义源...我在 firebug yellostudio.co.uk/temp/indexV2.php 中检查了它
  • 您的 images.php 页面出现解析错误:第 3 行 /home/sites/yellostudio.co.uk/public_html/temp/images.php 中出现“语法错误,意外 ':'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-19
  • 2018-02-17
  • 2015-09-02
相关资源
最近更新 更多