0

我在 SOF 社区的帮助下编写了一个简单的滑块。现在我正在尝试添加一些精美的动画。滑块可以处理:水平和垂直滑动。当 slideDown 完全正常工作时,我遇到了 slideUp 效果的问题。当我单击要向上滑动的项目的图标时,下一个项目会显示而没有任何动画。

我的代码:

self.nextItem = function()
{
    if(self.obj.activeElement.is(':last-child')) 
    {
        $('li.active', self.obj).removeClass('active');

        if(self.obj.settings.animation === "horizontal")
        {
            $('li', self.obj).first().toggle("slide", { direction: "left" }, 1000, function() {
                $(this).addClass('active').removeAttr("style")
            });
        }
        else
        {
            $('li', self.obj).first().slideUp('slow', function() {
                $(this).addClass('active').removeAttr("style")
            });
        }
    } 
    else 
    {
        self.obj.find("li").removeClass("active");

        if(self.obj.settings.animation === "horizontal")
        {
            self.obj.activeElement.next().toggle("slide", { direction: "left" }, 1000, function() {
                $(this).addClass('active').removeAttr("style")
            });
        }
        else 
        {
            self.obj.activeElement.next().slideUp('slow', function() {
                $(this).addClass('active').removeAttr("style")
            });
        }
    }
},

单击下一个/上一个寻呼机图标时,每个下一个和上一个项目都被隐藏。滑块的全部代码(不支持动画)在这里。起初我不知道我需要制作动画,因此项目由 CSS 显示/隐藏(.active { display: block}),因此我必须删除内联样式。

HTML 很简单:

   <ul>
        <li></li>
        <li></li>
    </ul>

我使用 slideDown 效果(代码的其他部分),效果很好。

编辑:

起初我认为包含整个代码不是一个好主意,所以我只放置了我认为有问题的部分。但如果你想要这里是完整版:

var MiniSlider = function(objId, settings)
{
this.obj = $("#" + objId);
var self = this;

self.obj.settings = {
    items: $("ul li", self.obj).length,
    autoChangeTime: 8000,
    animation: 'horizontal'
};

if(settings instanceof Object)
{
    $.extend(self.obj.settings, settings);
}

self.obj.activeElement = null;

self.pagerNext = self.obj.find("i.next");
self.pagerPrev = self.obj.find("i.prev");



self.pagerNext.on("click", function() {

    self.obj.activeElement = $('li.active', self.obj);

    if(self.obj.settings.items > 0)
    {
        self.nextItem();
    }
});
self.pagerPrev.on("click", function() 
{
    self.obj.activeElement = $('li.active', self.obj);

    if(self.obj.settings.items > 0)
    {
        self.prevItem();
    }
});
self.obj.parent().on('mouseenter mouseleave', function(e) {
    if (e.type == 'mouseenter') 
    {
        $(this).addClass('stop');
    }
    else 
    {
        $(this).removeClass('stop'); 
    }
});

self.prevItem = function()
{
    if(self.obj.activeElement.is(':first-child')) 
    {
        self.obj.activeElement.removeClass('active');

        if(self.obj.settings.animation === "horizontal")
        {
            $('li', self.obj).last().toggle("slide", { direction: "right" }, 1000, function() {
                $(this).addClass('active').removeAttr("style")
            });
        }
        else
        {
            $('li', self.obj).last().slideDown('slow', "linear", function() {
                $(this).addClass('active').removeAttr("style")
            });
        }
    }
    else 
    {
        self.obj.find("li").removeClass("active");

        if(self.obj.settings.animation === "horizontal")
        {
            self.obj.activeElement.prev().toggle("slide", { direction: "right" }, 1000, function() {
                $(this).addClass('active').removeAttr("style")
            });
        }
        else
        {
            self.obj.activeElement.prev().slideDown('slow', "linear", function() {
                $(this).addClass('active').removeAttr("style")
            });
        }
    }
},
self.nextItem = function()
{
    if(self.obj.activeElement.is(':last-child')) 
    {
        $('li.active', self.obj).removeClass('active');

        if(self.obj.settings.animation === "horizontal")
        {
            $('li', self.obj).first().toggle("slide", { direction: "left" }, 1000, function() {
                $(this).addClass('active').removeAttr("style")
            });
        }
        else
        {
            $('li', self.obj).first().slideUp('slow', function() {
                $(this).addClass('active').removeAttr("style")
            });
        }
    } 
    else 
    {
        self.obj.find("li").removeClass("active");

        if(self.obj.settings.animation === "horizontal")
        {
            self.obj.activeElement.next().toggle("slide", { direction: "left" }, 1000, function() {
                $(this).addClass('active').removeAttr("style")
            });
        }
        else 
        {
            self.obj.activeElement.next().slideUp('slow', function() {
                $(this).addClass('active').removeAttr("style")
            });
        }
    }
},
setInterval(function() {
    if(self.obj.settings.items > 0 && !self.obj.parent().hasClass("stop"))
    {
        self.pagerNext.click();
    }
}, self.obj.settings.autoChangeTime);

};

CSS:

div div.block-content.mini-slider ul li {
    display:none;
}
.block-content.mini-slider ul li.active {
    display:block;
}
4

1 回答 1

1

问题是这样的:

self.obj.activeElement.next().slideUp('slow', function() {
      $(this).addClass('active').removeAttr("style")
});

SlideUp用于隐藏元素,而不是用于显示。这段代码清楚地隐藏了下一个元素。但是下一个元素已经隐藏了。这段代码self.obj.activeElement.next().slideUp('slow'实际上什么都不做。

隐藏完成后,将active类添加到它以显示为块。这就是为什么它没有动画显示的原因。因为您显示它的代码实际上是:

$(this).addClass('active').removeAttr("style")
于 2013-07-06T12:26:44.977 回答