jQuery:同时fadeIn + fadeOut

时间:2011-09-08 18:04:30

标签: javascript jquery

我正在为我的朋友设计一个小型投资组合网站,我很难尝试使fadeIn + fadeOut效果正常工作。图像滑动+褪色,然而,在渐变之间存在长时间延迟,您可以暂时看到背景。我正在使用的滑块基于以下教程:

http://www.sohtanaka.com/web-design/automatic-image-slider-w-css-jquery/

我对原始代码所做的唯一更改是在图像滑动时为图像添加标题和(尝试添加)淡入淡出效果。

的Javascript

$(".image_reel").fadeIn(500).delay(0).fadeOut(500);
    $(".image_reel").animate({
        left: -image_reelPosition
    }, 500);
    $(".image_reel").delay(0).fadeIn(500);

此处的代码可以在教程网站的rotate函数中找到。

所以,正如我上面所说的,这里的代码成功地淡化和滑动图像,然而,你可以暂时看到背景。

任何帮助都会非常欣赏我如何让一张图像淡出而另一张图像同时在中消失

3 个答案:

答案 0 :(得分:3)

我过去所做的是有两个重叠的div,以及替代的fadein / fadeout,动态加载当前不可见的div中的下一个图像。

以下是我用来完成它的代码:

var FeatureRotator = (function($,global) {
    var self = {},
        currentFeature = 0,
        images = [],
        imageData = [],
        imagePrefix = "/images/",
        timer = null,        
        totalImages = 0,
        initialFeature = 0,
        interval,
        blendSpeed;


    function setVisibleImage(iid) {
        $("#img1").attr('src',images[iid].src).css('opacity',1);
        $("#img2").css('opacity',0);
        $(".active").removeClass("active");
        $("#f"+iid).addClass("active");
    }

    function setCurrentImage(id) {
        currentFeature = id;
        setVisibleImage(id);
    }

    function doHoverIn(obj) {
        var position = global.parseInt(obj.target.attributes.position.value,10);

        if (currentFeature === position) {
            self.pause();
        } else {
            setCurrentImage(global.parseInt(position, 10));
            self.pause();
        }
    }

    function doHoverOut() {
        self.unpause();
    }

    self.init = function(options,callback) {
        var i = 0,
            tempImg = null,
            element = null,
            img1 = null,
            img2 = null;

        interval = options.interval || 5000;
        blendSpeed = options.blendSpeed || 500;
        element = options.element;
        initialFeature = options.initialFeature || 0;
        imagePrefix = options.imagePrefix;
        imageData = options.imageData || [];
        img1 = $("<img/>").attr('id','img1').css('cursor','pointer');
        img2 = $("<img/>").attr('id','img2').css('cursor','pointer').css('opacity','0').css('margin-top',-options.height);
        img1.click(function() {
            window.location = imageData[currentFeature].link;
        });
        img2.click(function() {
            window.location = imageData[currentFeature].link;
        });
        $(element).append(img1).append(img2);

        totalImages = imageData.length; //2;//$(".feature").size();

        for (i = 0;i < totalImages; i++) {
            tempImg = new global.Image();
            tempImg.src = imagePrefix + imageData[i].image;            //"feature_" + i + ".png";
            images.push(tempImg);


            $("#f"+i).css('background-image','url("'+imagePrefix+"feature_"+i+"_thumb.png"+'")')
                     .hover(doHoverIn, doHoverOut)
                     .attr('position',i);
        }

        setVisibleImage(initialFeature);

        if (options.autoStart) {
            self.start();
        }
        if (typeof callback === "function") {
            callback();
        }
    };

    function updateImage() {        
        var active = global.parseInt($("#img1").css('opacity'),10) === 1 ? "#img1" : "#img2",
            nextFeature = (currentFeature === totalImages-1 ? 0 : currentFeature+1);

        if (active === "#img1") {
            $("#img2").attr('src',images[nextFeature].src);

            $("#img2").fadeTo(blendSpeed, 1);            
            $("#img1").fadeTo(blendSpeed, 0);
        } else {
            $("#img1").attr('src',images[nextFeature].src);            
            $("#img1").fadeTo(blendSpeed, 1);            
            $("#img2").fadeTo(blendSpeed, 0);
        }

        $("#f"+currentFeature).removeClass("active");
        $("#f"+nextFeature).addClass("active");

        currentFeature = nextFeature;
    }



    self.start = function() {
        currentFeature = initialFeature;
        setVisibleImage(currentFeature);
        timer = global.setInterval(function(){
            updateImage();
        }, interval);
    };

    self.stop = function() {
        global.clearTimeout(timer);
    };

    self.pause = function() {
        global.clearTimeout(timer);
    };

    self.unpause = function() {
        timer = global.setInterval(function(){
            updateImage();
        }, interval);
    };


    return self;
}(this.jQuery, this));

请注意,要使其按原样运行还需要更多功能。您感兴趣的主要部分是updateImage()

答案 1 :(得分:1)

我能想到的最直接的解决方案是将image包裹在spanfadeIn image本身,然后fadeOut { {1}}。

在效果之前或之后短暂“闪烁”的元素是我以前见过的,它通常只会影响某些浏览器,并且与JavaScript实现有关。确保使用最新版本的jQuery来改善crossbrowser效果。

答案 2 :(得分:1)

您似乎没有实际滑动:只是淡出。因此,我认为获得所需效果的方法是一次显示两个图像。

假设您当前正在显示图像1,并且您想要淡入图像2.您可以提供图像1 z-index: 0;你给图像2 z-index: 1并淡入。在淡入淡出结束时的回调你将图像1设置为display:noneopacity: 0,你可以重置图像2的z-index到0。

如果用户非常快速地点击按钮,那么棘手的一点将会解决当前淡入淡出的问题。考虑到衰落的速度有多快,您可能希望保留一个等待转换,并在完成最后一个转换之前完成第一个转换。