1

我正在尝试修改 Coda-Slider 2.0 (http://www.ndoherty.biz/tag/coda-slider/) 以使用基于百分比的宽度,而不是硬编码的像素宽度,以允许流体调整大小。当我尝试回到面板 1 时,除了 IE7 中的一个小故障(Firefox 没有表现出这种行为)之外,我已经让它工作得非常好。

当我运行 coda-slider 2.0 附带的默认 index.html 时,在 IE7 中一切正常。然后,我将图像替换为默认文本,并且效果也很好。然后我更改了 CSS 和 JS 以使用百分比宽度 - 这很好用,除了当我尝试返回第一个面板时 - 当我这样做时,比如说,从面板 4,而不是平滑地动画回到面板 1 视图立即跳到面板 1 和面板 2 之间的中间,然后动画回到面板 1。

这可以在我设置的测试站点上看到:

http://www.lootcorp.com/animateissue/

我正在使用的修改后的 Coda-Slider JS 文件的来源如下。请注意,我删除了所有不必要的代码以简化调试。

问题与这条线有关:

offset = - (panelWidth*z) + "%";

我想也许动画不喜欢将“0%”作为值输入,所以我尝试在选择面板 1 时输入“0”和“0px” - 结果相同。最终结果是正确的 - 最终 div 正确定位在 margin-left: 0,但我不知道为什么在这样做之前它会跳到面板 1 和 2 之间的中间位置。(面板 4 到 3 或 2 的动画效果很好)。我尝试使用 'left' 而不是 'margin-left' 得到相同的结果。

错误还是愚蠢的,被忽视的错误?任何意见是极大的赞赏!!

js文件来源:

    $(function(){
    // Remove the coda-slider-no-js class from the body
    $("body").removeClass("coda-slider-no-js");
    // Preloader
    $(".coda-slider").children('.panel').hide().end().prepend('<p class="loading">Loading...<br /><img src="images/ajax-loader.gif" alt="loading..." /></p>');
});

var sliderCount = 1;

$.fn.codaSlider = function(settings) {

    settings = $.extend({
        autoHeight: true,
        autoHeightEaseDuration: 1000,
        autoHeightEaseFunction: "easeInOutExpo",
        autoSlide: false,
        autoSlideInterval: 7000,
        autoSlideStopWhenClicked: true,
        crossLinking: true,
        dynamicArrows: true,
        dynamicArrowLeftText: "&#171; left",
        dynamicArrowRightText: "right &#187;",
        dynamicTabs: true,
        dynamicTabsAlign: "center",
        dynamicTabsPosition: "top",
        externalTriggerSelector: "a.xtrig",
        firstPanelToLoad: 1,
        panelTitleSelector: "h2.title",
        slideEaseDuration: 1000,
        slideEaseFunction: "easeInOutExpo"
    }, settings);

    return this.each(function(){


        var slider = $(this);


        var panelCount = slider.find(".panel").size();

        var panelWidth = 100;
        var panelContainerWidth = "400%";

        var navClicks = 0; // Used if autoSlideStopWhenClicked = true

        // Surround the collection of panel divs with a container div (wide enough for all panels to be lined up end-to-end)
        $('.panel', slider).wrapAll('<div class="panel-container"></div>');
        // Specify the width of the container div (wide enough for all panels to be lined up end-to-end)
        $(".panel-container", slider).css({ width: panelContainerWidth });

        // Specify the current panel.
        // If the loaded URL has a hash (cross-linking), we're going to use that hash to give the slider a specific starting position...
        if (settings.crossLinking && location.hash && parseInt(location.hash.slice(1)) <= panelCount) {
            var currentPanel = parseInt(location.hash.slice(1));
            var offset = - (panelWidth*(currentPanel - 1)) + "%";
            $('.panel-container', slider).css({ marginLeft: offset });
        // If that's not the case, check to see if we're supposed to load a panel other than Panel 1 initially...
        } else if (settings.firstPanelToLoad != 1 && settings.firstPanelToLoad <= panelCount) { 
            var currentPanel = settings.firstPanelToLoad;
            var offset = - (panelWidth*(currentPanel - 1)) + "%";
            $('.panel-container', slider).css({ marginLeft: offset });
        // Otherwise, we'll just set the current panel to 1...
        } else { 
            var currentPanel = 1;
        };



        // If we need a dynamic menu
           if (settings.dynamicTabs) {
            var dynamicTabs = '<div class="coda-nav" id="coda-nav-' + sliderCount + '"><ul></ul></div>';
            switch (settings.dynamicTabsPosition) {
                case "bottom":
                    slider.parent().append(dynamicTabs);
                    break;
                default:
                    slider.parent().prepend(dynamicTabs);
                    break;
            };
            ul = $('#coda-nav-' + sliderCount + ' ul');
            // Create the nav items
            $('.panel', slider).each(function(n) {
                ul.append('<li class="tab' + (n+1) + '"><a href="#' + (n+1) + '">' + $(this).find(settings.panelTitleSelector).text() + '</a></li>');                                               
            });
            navContainerWidth = slider.width() + slider.siblings('.coda-nav-left').width() + slider.siblings('.coda-nav-right').width();
            ul.parent().css({ width: navContainerWidth });
            switch (settings.dynamicTabsAlign) {
                case "center":
                    ul.css({ width: ($("li", ul).width() + 2) * panelCount });
                    break;
                case "right":
                    ul.css({ float: 'right' });
                    break;
            };
        };

        // If we need a tabbed nav
        $('#coda-nav-' + sliderCount + ' a').each(function(z) {
            // What happens when a nav link is clicked
            $(this).bind("click", function() {
                navClicks++;
                $(this).addClass('current').parents('ul').find('a').not($(this)).removeClass('current');
                if (z == 0) {
                    offset = "+0px";
                } else {
                    offset = - (panelWidth*z) + "%";
                }
                alert("Offset = " + offset);
        //      alterPanelHeight(z);
                currentPanel = z + 1;
                $('.panel-container', slider).animate({ marginLeft: offset }, settings.slideEaseDuration, settings.slideEaseFunction);
                if (!settings.crossLinking) { return false }; // Don't change the URL hash unless cross-linking is specified
            });
        });


        // Specify which tab is initially set to "current". Depends on if the loaded URL had a hash or not (cross-linking).
        if (settings.crossLinking && location.hash && parseInt(location.hash.slice(1)) <= panelCount) {
            $("#coda-nav-" + sliderCount + " a:eq(" + (location.hash.slice(1) - 1) + ")").addClass("current");
        // If there's no cross-linking, check to see if we're supposed to load a panel other than Panel 1 initially...
        } else if (settings.firstPanelToLoad != 1 && settings.firstPanelToLoad <= panelCount) {
            $("#coda-nav-" + sliderCount + " a:eq(" + (settings.firstPanelToLoad - 1) + ")").addClass("current");
        // Otherwise we must be loading Panel 1, so make the first tab the current one.
        } else {
            $("#coda-nav-" + sliderCount + " a:eq(0)").addClass("current");
        };


        // Kill the preloader
        $('.panel', slider).show().end().find("p.loading").remove();
        slider.removeClass("preload");

        sliderCount++;

    });
};
4

1 回答 1

4

你有什么理由使用超过 2 年的 jQuery 1.3.2 吗?对于一个不到 5 年历史的图书馆来说,这已经很多了

使用 jQuery 的当前稳定版本 1.5.1,你有同样的问题吗?

你确定IE使用标准模式和最新的渲染引擎来渲染你的页面吗?

使用此元标记:

<meta http-equiv="X-UA-Compatible" content="IE=Edge" />

看看你使用最新的稳定版本的jQuery是否有同样的问题。自 1.3 版以来,它发生了很大变化。

于 2011-03-10T22:05:15.363 回答