2017-02-13 146 views
0

我正在尝试创建菜单,但我遇到了打开新窗口时打开的菜单的问题。打开新窗口时关闭打开的divs

我试过hide(),但它似乎并没有在所有情况下工作,这是我的代码之前,我已经尝试过任何关闭方法。

我只希望在任何时候打开这三个函数中的一个。

当一个打开 - 任何已打开的应该反转他们打开的任何东西。

Fiddle

//Open/close filters pack menu 
$('#filters__menu--show').click(function() { 
    $('#filters__menu').slideToggle('750',"swing", function() { 
    }); 
}); 
//Open/close stickers pack menu 
$('#stickers__menu--show').click(function() { 
    $('#stickers__section').slideToggle('750',"swing", function() { 
    }); 
}); 
//draw row + menu open 
$('#draw__menu--show').click(function() { 
    $('#draw__colors').slideToggle('750',"swing", function() { 
    }); 
    //when draw is open close primary save/restart 
    $("#done").fadeOut('750'); 
    $("#restart").fadeOut('750'); 
    $("#app__menu").fadeOut('750'); 
    $("#draw__menu").fadeIn('750'); 
}); 

我所试图实现的是一个新的菜单打开时,其他菜单的关闭,他们已经开放颠倒/一切。

我对#draw__menu有特殊问题 - 显示为slideToggles和fadeOut其他元素。

隐藏()正确的方式来解决这个问题?

+0

你也可以发布你的html吗? – Armin

+2

给所有的菜单一个普通的类。然后你可以使用'$(“。className”)。hide();'在显示当前菜单之前隐藏所有其他菜单。 – Barmar

+0

@Barmar ...和'$(this).show();'显示当前的! –

回答

0

引入三个布尔变量:isFiltersOpen,isStickersOpen,isDrawMenuOpen。将它们初始化为false。在每个回调中,将相应的一个设置为相反。例如。 isFilterOpen=!isFilterOpen

然后再次为其他两个元素调用slideToggle。在内部slideToggle的回调中,确保颠倒布尔值。因此,例如,这将是用于filters_menu的slideToggle的代码:

$('#filters__menu--show').click(function() { 
    $('#filters__menu').slideToggle('750',"swing", function() { 
    isFilterOpen=!isFilterOpen; 
    if(isStickersOpen){ 
    $('#stickers__section').slideToggle('750',"swing", function() { 
     isStickersOpen=!isStickersOpen; 
    } 
    ); 
    } 
    if(isDrawMenuOpen){ 
    $('#draw__colors').slideToggle('750',"swing", function() { 
     isDrawMenuOpen=!isDrawMenuOpen; 
    } 
    ); 
    } 
}); 
}) 

对每一个都这样做。为了使它更优雅,你可以将一些代码包装在一个函数中

0

你可以像@Barmar建议的那样做。为点击时要关闭的所有元素添加一个通用类,然后添加关闭效果(hide()slideUp或...)。你可以测试几个,看看哪一个最适合你的愿景。这里是一个例子(我使用slideUp()来保持动画,但如果你想不动画,你可以使用hide()):https://jsfiddle.net/sk4m2w2d/2/