【问题标题】:jQuery to slide a div right to left slides the div out of windowjQuery 从右向左滑动 div 将 div 滑出窗口
【发布时间】:2013-08-19 21:04:51
【问题描述】:

我创建了一个从右向左滑动的滑块。我正在更改 margin-right 以使幻灯片正常工作。

根据要求,我有一个树形视图,当用户单击任何节点时,它会打开一个包含一些控件的滑动对话框。当用户单击任何节点时,它应该首先关闭先前打开的对话框,然后打开当前选定节点的对话框。当用户单击节点时,我能够完成这项工作,对话框打开,当用户再次单击同一节点或滑块按钮时,对话框隐藏。但是不知何故,当用户单击任何其他节点时隐藏的代码无法正常工作。它将滑块按钮和对话框移开,我什么也看不到。

我使用了以下代码:

if($('#slider-button').css("margin-right") == "400px") {
    $(sliderDialog).animate({"margin-right": '-=400'});
    $('#slider-button').animate({"margin-right": '-=400'});
} else{
    $(sliderDialog).animate({"margin-right": '+=400'});
    $('#slider-button').animate({"margin-right": '+=400'});
}

我想,这就像查找先前选择的对话框是否与当前不同一样简单,而不仅仅是在用户再次单击同一节点时调用隐藏对话框的相同代码。 IE。

$(sliderDialog).animate({"margin-right": '-=400'});
$('#slider-button').animate({"margin-right": '-=400'});

但是,它的行为很奇怪。任何人,我在这里错过了什么?

这是我的jsFiddle

【问题讨论】:

    标签: javascript jquery jquery-animate


    【解决方案1】:

    使用你所拥有的 DOM 等,我更新了 JS 以在动画返回后在它们之间切换(这里是 Fiddle 的实际操作):

    var sliderDialog = "#dvPriorityDialog"
    
    function slideIt() {
        var sliderId = '#' + $('.pollSlider.open').attr('id');
        var slideWidth;
        if ($('.pollSlider').hasClass('open')) {
            slideWidth = $('.pollSlider.open').width();
            $('.pollSlider.open').animate({"margin-right": '-=' + slideWidth}, function() {
               if (sliderId != sliderDialog) {
                    slideIt();
               }
            });
            $('#slider-button').animate({"margin-right": '-=' + slideWidth});
            $('.pollSlider.open').removeClass('open');
        }  else {
            slideWidth = $(sliderDialog).width();
            $(sliderDialog).addClass('open');
            $('#slider-button').animate({"margin-right": '+=' + slideWidth});
            $(sliderDialog).animate({"margin-right": '+=' + slideWidth});
        }
    }
    
    function bindControls() {
        $('#slider-button').click(function() {
           slideIt(); 
        });
        $("#liPriority").click(function() {
            sliderDialog = "#dvPriorityDialog";
            slideIt();
    
        });
        $("#liFasting").click(function() {
            sliderDialog = "#dvFastingDialog";
            slideIt();
        });
    }
    
    // init;
    $(document).ready(function() {
        bindControls();
     });
    

    【讨论】:

    • 虽然这是我所要求的完美解决方案。我不知何故努力使这项工作适用于我今天遇到的一种情况。我意识到几个节点会打开一个不同大小(宽度)的对话框。我是否需要在数组/变量中存储不同的宽度,然后在 SlideIt() 函数中使用,或者有简化的方法吗?请建议。这是一个更新的小提琴:jsfiddle.net/kuul13/wEVH8/1
    • 最简单的方法是获取要制作动画的元素的宽度,并将其用作边距,而不是设置硬值。
    • 所以你的意思是获取当前动画对话框的宽度,而不是现在在 slideit 方法中的硬编码值?
    • 更新了上面的答案(和小提琴)以包含您的请求。
    【解决方案2】:

    试试

    $(sliderDialog).stop().animate({"margin-right": '-=400'});

    $('#slider-button').stop().animate({"margin-right": '-=400'});

    【讨论】:

    【解决方案3】:

    你有多个问题:

    1. 您尝试使用两个不同的动画(一个面板向左,另一个向右)移动相同的元素(#slider-button)。要解决这个问题,最好的选择是为每个面板添加一个按钮。由于面板只有一个动画,因此管理全局行为会容易得多。

    2. 当您想要更改动画时,您不会停止动画。将您的动画存储在 vars 中,并在您的情况下使用 .stop() 函数并将第一个参数设置为 true(.stop(true) 停止动画并将其从队列中移除而不完成它)。

    3. 您的状态测试基于您的动画 css 属性(margin-right)。所以你必须等待动画结束才能开始新的动画。要解决这个问题,请使用 vars 来存储动画状态:(var firstPanelLastMove = 'left' // or right ... 等)。

    【讨论】:

    • 我可以有不同的#slider-button,但有按钮就好了。我不知道如何将动画存储在变量中?并使用它们来停止和制作动画?
    • 当一个对话框向左移动而另一个返回向右时,按钮的行为是什么?回到右边然后去左边跟随另一个对话框?两个按钮更容易。对于变量,如果您不想在 var 中存储动画,只需停止元素上的动画:$(element).stop(true)
    • 感谢您的解释。不过,我需要考虑一下。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    • 2014-07-07
    相关资源
    最近更新 更多