网站搜索

javascript - Jquery 多个 div 切换


好的。任何人很快就能看出我在这里学习 jQuery,并且可能以最笨拙的方式去做这件事。不过这就是我为什么会在这里的原因。

我一直在创建一个基于“面板”的菜单系统,提供许多不同的功能(菜单、过滤、搜索、购物篮和账户)。我已经达到了我想要的99%的效果。实际上,如果你点击菜单图标(举例来说),你将看到完全一样的效果。再次点击,它一切都是完美的。

当用户在他们最初打开的“面板”上点击另一个图标时,我的问题就出现了。现在你可以看到我知识的空白了。

请注意,该效果在面板上是作用于不同的 div,而每次在主 div(main)上是作用于同一个 div。自然,最好是以下两种情况之一:a)在不关闭面板的情况下点击新图标时,jQuery 会关闭之前的面板,移除关闭按钮,滑回主面板,然后再打开新的面板。或者 b)关闭之前的面板,移除关闭按钮,但保持主面板打开(我认为这会过于复杂)。

HTML

<div id="mainpanel">
<div class="menunav">
    <div class="toggle menu-btn"></div>
    <div class="toggle filter-btn"></div>
    <div class="toggle search-btn"></div>
    <div class="toggle basket-btn"></div>
    <div class="toggle account-btn"></div>
</div>
</div>
<div class="togglepanel mainmenu">
menu here
</div>
<div class="togglepanel filter">
filter here
</div>
<div class="togglepanel search">
search here
</div>
<div class="togglepanel basket">
basket here
</div>
<div class="togglepanel account">
account here
</div>
<main>
content will be here
</main>

CSS

#mainpanel {
position: fixed;
display: table;
top: 0;
left: 0;
width: 125px;
height: 100%;
background: #206ba4;
vertical-align: middle;
z-index: 9999;}

main {
position: relative;
top: 0;
margin-left: 125px;
transform: translateX(0);
transform: translateY(0);
transition: transform .5s;}

.move {
transform: translateX(300px) !important;}

.menunav {
display: table-cell;
color: #fff;
z-index: 1001;
margin: 20px 0 0;
text-align: center;
vertical-align: middle;}

.menunav div {
display: block;
width: 100%;
margin: 0 0 30px;
text-align: center;}

.menu-btn:after, .filter-btn:after, .search-btn:after, .basket-btn:after, .account-btn:after, .close-btn:after {
font-family: FontAwesome;
content: "menu";
font-size: 1.8em;
font-weight: 200;
color: #fff;
display: block;
height: 1em;
width: 1em;
margin: 0 0 0 30%;
cursor: pointer;}

.filter-btn:after {
content: "filter";}

.search-btn:after {
content: "search";}

.basket-btn:after {
content: "basket";}

.account-btn:after {
content: "account";}

.close-btn:after {
content: "close";}

.mainmenu, .filter, .search, .basket, .account {
position: fixed;
width: 300px;
top: 0;
left: 125px;
height: 100%;
background: #54a4de;
transform: translateX(-100%);
transition: transform .5s;
z-index: -1;}

.expand {
transform: translateX(0px);}

jQuery

jQuery(function($){
    $('.menu-btn').click(function(){
    $('.mainmenu').toggleClass('expand')
    $('main').toggleClass('move')
    $('.menu-btn').toggleClass('close-btn')
     })
})
jQuery(function($){
    $( '.filter-btn' ).click(function(){
    $('.filter').toggleClass('expand')
    $('main').toggleClass('move')
    $('.filter-btn').toggleClass('close-btn')
     })
})
jQuery(function($){
    $( '.search-btn' ).click(function(){
    $('.search').toggleClass('expand')
    $('main').toggleClass('move')
    $('.search-btn').toggleClass('close-btn')
 })
})  
jQuery(function($){
    $( '.basket-btn' ).click(function(){
    $('.basket').toggleClass('expand')
    $('main').toggleClass('move')
    $('.basket-btn').toggleClass('close-btn')
     })
})  
jQuery(function($){
    $( '.account-btn' ).click(function(){
    $('.account').toggleClass('expand')
    $('main').toggleClass('move')
    $('.account-btn').toggleClass('close-btn')
     })
})

这是 jsfiddle

非常感谢提前提供的任何指点……我的头好痛!

答案#1

演示在这里

你在尝试中有很多多余的代码,但仍然是一个不错的尝试来实现这个目标。所以以下是我实现这个目标的建议。

小贴士:

  • 不要包含多个 jQuery(function,因为这等同于 $ (document).ready 函数,且每个 js 文件最好只使用一个
  • 为所有按钮编写一个通用事件,并根据每次点击发生时的 $ (this) 来区分

  • 在你的 .toggle 元素上添加一个额外的 data-* 属性,例如 data-target,以指向对应的 panel-body

所以下面是我对你的代码所做的一些修改..

HTML

<div class="menunav">
    <!--data-target to each of its corresponding body class-->
    <div class="toggle menu-btn" data-target=".mainmenu"></div>
    <div class="toggle filter-btn" data-target=".filter"></div>
    <div class="toggle search-btn" data-target=".search"></div>
    <div class="toggle basket-btn" data-target=".basket"></div>
    <div class="toggle account-btn" data-target=".account"></div>
</div>

JS

jQuery(function($){
    //click event to one common class i.e toggle
    $('.toggle').click(function(){
        var target=$(this).data('target'); //get the clicked element's target property
        $('.togglepanel').not($(target)).removeClass('expand');
        //remove class from all the togglepanel elements except the current element's target
        $('.toggle').removeClass('close-btn');
        //general action in any scenario to remove close-btn
        if($(target).hasClass('expand'))
        {
            //if target has expand class then remove it and do necessary changes
            $(target).removeClass('expand')
            $('main').removeClass('move')
            $(this).removeClass('close-btn')
        }
        else
        {
            //else add necessary classes
            $(target).addClass('expand')
            $('main').addClass('move')
            $(this).addClass('close-btn')
        }
     })
})

答案#2

jQuery(function($){
        $(document).on('click', '.toggle', function (){
            
            // to close all open contents
            $('.togglepanel').removeClass('expand');
            $('main').removeClass('move');
            
           var target = $(this).data("target");
            
            if( $(this).hasClass('close-btn') ){
              $('.toggle').toggleClass('close-btn', false);
               $('main').toggleClass('move', false)
               $(target).toggleClass('expand', false);
            }else{
              $('.toggle').toggleClass('close-btn', false);
              $(this).toggleClass('close-btn', true);
              $('main').toggleClass('move', true)
               $(target).toggleClass('expand', true);
            }
            
        });
    
	})
#mainpanel {
	position: fixed;
	display: table;
	top: 0;
	left: 0;
	width: 125px;
	height: 100%;
	background: #206ba4;
	vertical-align: middle;
	z-index: 9999;
}

main {
    position: relative;
	top: 0;
	margin-left: 125px;
	transform: translateX(0);
	transform: translateY(0);
	transition: transform .5s;
}

.move {
	transform: translateX(300px) !important;
}

.menunav {
	display: table-cell;
	color: #fff;
	z-index: 1001;
	margin: 20px 0 0;
	text-align: center;
	vertical-align: middle;
}

.menunav div {
	display: block;
	width: 100%;
	margin: 0 0 30px;
	text-align: center;
}

.menu-btn:after, .filter-btn:after, .search-btn:after, .basket-btn:after, .account-btn:after, .close-btn:after {
	font-family: FontAwesome;
	content: "menu";
	font-size: 1.8em;
	font-weight: 200;
	color: #fff;
	display: block;
	height: 1em;
	width: 1em;
	margin: 0 0 0 30%;
	cursor: pointer;
}

.filter-btn:after {
	content: "filter";
}

.search-btn:after {
	content: "search";
}

.basket-btn:after {
	content: "basket";
}

.account-btn:after {
	content: "account";
}

.close-btn:after {
    content: "close";
}
}

.close-btn:after {
	content: "\f00d";
}

.mainmenu, .filter, .search, .basket, .account {
	position: fixed;
	width: 300px;
	top: 0;
	left: 125px;
	height: 100%;
	background: #54a4de;
	transform: translateX(-100%);
	transition: transform .5s;
	z-index: -1;
}

.expand {
	transform: translateX(0px);
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<div id="mainpanel">
    <div class="menunav">
        <div class="toggle menu-btn" data-target=".mainmenu"></div>
        <div class="toggle filter-btn" data-target=".filter"></div>
        <div class="toggle search-btn" data-target=".search"></div>
        <div class="toggle basket-btn" data-target=".basket"></div>
        <div class="toggle account-btn" data-target=".account"></div>
    </div>
</div>
<div class="togglepanel mainmenu">
    menu here
</div>
<div class="togglepanel filter">
    filter here
</div>
<div class="togglepanel search">
    search here
</div>
<div class="togglepanel basket">
    basket here
</div>
<div class="togglepanel account">
    account here
</div>
<main>
    content will be here
</main>

你实际上写了很多可以转化为单行的代码。与其在每个按钮上添加 click 事件,不如试试这样的方式:

首先,在你的按钮上添加一个 data-target 属性,比如这样:

<div class="toggle menu-btn" data-target=".mainmenu"></div>
<div class="toggle filter-btn" data-target=".filter"></div>
<div class="toggle search-btn" data-target=".search"></div>
<div class="toggle basket-btn" data-target=".basket"></div>
<div class="toggle account-btn" data-target=".account"></div>

而在你的 jQuery 上:

jQuery(function($){
    $(document).on('click', '.toggle', function (){

        // to close all open contents
        $('.togglepanel').removeClass('expand');
        $('main').removeClass('move');

       var target = $(this).data("target");

        if( $(this).hasClass('close-btn') ){
           $('.toggle').toggleClass('close-btn', false);
           $('main').toggleClass('move', false)
           $(target).toggleClass('expand', false);
        }else{
           $('.toggle').toggleClass('close-btn', false);
           $(this).toggleClass('close-btn', true);
           $('main').toggleClass('move', true)
           $(target).toggleClass('expand', true);
        }

    });
});