代码之家  ›  专栏  ›  技术社区  ›  4532066

显示/隐藏图标折叠所有div时出现问题

  •  2
  • 4532066  · 技术社区  · 8 年前

    我有以下代码,其中包含一些嵌套的div。

    div有加号和减号字体的很棒的图标来扩展和折叠它们。

    您可以使用页面顶部的按钮切换div的可见性。

    蓝色按钮和/或加减图标可以切换父对象的可见性( Activities 和 Animals & Nature )。

    绿色按钮切换包含子标题的“子”div的可见性,如 award-medal ,则, event 等

    我的问题是,当涉及到用绿色加号/减号图标切换子div的可见性时,如果您单击绿色减号 颁发奖章 航向,它还折叠div 事件 。

    我想知道是否有任何方法可以拆分折叠功能,以便绿色切换按钮仍能像现在一样工作,但每个绿色加号/减号图标可以控制图标相关的每个div的可见性。

    我可以理解为什么代码现在这样工作,但我无法理解如何更改JS代码才能实现我的目标。

    $(document).ready(function() {
      $('.toggleparent').addClass('toggle-open');
      $('.heading > a').on('click', function(event){
    	event.preventDefault();
    	if ( $(this).find('i').hasClass('fa-minus') ) {
    	  $(this).find('i').removeClass('fa-minus').addClass('fa-plus');
    	  $(this).parent().parent().find('.submenu').css("display", "none");
    	  $(this).parent().parent().find('.submenu').addClass('closed');
    	  if ( $('.submenu.closed').length == $('.menu').length ) {
    		$('.toggleparent').removeClass('toggle-open');
    	  }
    	}
    	else if ( $(this).find('i').hasClass('fa-plus') ) {
    	  $(this).find('i').removeClass('fa-plus').addClass('fa-minus');
    	  $(this).parent().parent().find('.submenu').css("display", "block");
    	  $(this).parent().parent().find('.submenu').removeClass('closed');
    	  $('.toggleparent').addClass('toggle-open');
    	}
      });
      $('.toggleparent').on('click', function(){
    	if ( $(this).hasClass('toggle-open') ) {
    	  $('.heading').each(function() {
    		$(this).find('i').removeClass('fa-minus').addClass('fa-plus');
    		$(this).parent().find('.submenu').css("display", "none");
    		$(this).parent().parent().find('.submenu').addClass('closed');
    	  });
    	  $('.toggleparent').removeClass('toggle-open');
    	}
    	else{
    	  $('.heading').each(function() {
    		$(this).find('i').removeClass('fa-plus').addClass('fa-minus');
    		$(this).parent().find('.submenu').css("display", "block");
    		$(this).parent().parent().find('.submenu').removeClass('closed');
    	  });
    	  $('.toggleparent').addClass('toggle-open');
    	}
      });
    });
    
    
    
    $(document).ready(function() {
      $('.togglechild').addClass('toggle-open');
      $('.subheading > a').on('click', function(event){
    	event.preventDefault();
    	if ( $(this).find('i').hasClass('fa-minus') ) {
    	  $(this).find('i').removeClass('fa-minus').addClass('fa-plus');
    	  $(this).parent().parent().find('.indent').css("display", "none");
    	  $(this).parent().parent().find('.indent').addClass('closed');
    	  if ( $('.indent.closed').length == $('.menu').length ) {
    		$('.togglechild').removeClass('toggle-open');
    	  }
    	}
    	else if ( $(this).find('i').hasClass('fa-plus') ) {
    	  $(this).find('i').removeClass('fa-plus').addClass('fa-minus');
    	  $(this).parent().parent().find('.indent').css("display", "block");
    	  $(this).parent().parent().find('.indent').removeClass('closed');
    	  $('.togglechild').addClass('toggle-open');
    	}
      });
      $('.togglechild').on('click', function(){
    	if ( $(this).hasClass('toggle-open') ) {
    	  $('.subheading').each(function() {
    		$(this).find('i').removeClass('fa-minus').addClass('fa-plus');
    		$(this).parent().find('.indent').css("display", "none");
    		$(this).parent().parent().find('.indent').addClass('closed');
    	  });
    	  $('.togglechild').removeClass('toggle-open');
    	}
    	else{
    	  $('.subheading').each(function() {
    		$(this).find('i').removeClass('fa-plus').addClass('fa-minus');
    		$(this).parent().find('.indent').css("display", "block");
    		$(this).parent().parent().find('.indent').removeClass('closed');
    	  });
    	  $('.togglechild').addClass('toggle-open');
    	}
      });
    });
    body{
      background: #fff;
      margin-top:20px;
    }
    
    h1.heading {
      font: 'Oswald';
      text-transform: uppercase;
    }
    
    td { background: #f1f1f1; border-bottom:1px solid #ccc; border-right:1px solid #ccc; padding:20px; margin:5px; border-top:1px solid #fff; border-left:1px solid #fff; }
    
    
    
    .wrappingmapping {
    	margin:20px 0 0 20px;
    	border-radius:85px;
    	overflow:hidden;
    	border:10px solid #fff;
    	box-shadow:0 0 10px #999;
    }
    
    
    .menu {
      margin-bottom: 50px;
    }
    
    .submenu {
      padding: 20px;
    background: repeating-linear-gradient(
      -45deg,
      #999,
      #999 10px,
      #888 10px,
      #888 20px
    );
      border-radius: 2px;
    }
    
    .green {
    	color:#28a745;
    }
    
    .heading {
      color: #000;
      background: #ccc;
      border-bottom: 1px solid #ccc;
      padding: 5px;
    }
    
    .subheading {
      background: #fff;
      padding-left: 10px;
      background: #f1f1f1;
      border-top: 1px solid #fff;
      font-size: 30px;
    }
    
    .indent {
      background: #fff;
      padding: 0px 20px 20px 20px;
    }
    
    .icon {
      width: 64px;
      height: 64px;
    }
    
    .gallery {
      width: 100%;
      *width: 99.94877049180327%;
      margin: 0;
      padding: 0;
    }
    
    .gallery.grid li {
      margin: 2px 5px;
    }
    
    .gallery.grid li {
      margin: 2px 5px;
      display: block;
    }
    
    .gallery.grid li:hover {
      background: #ccc;
    }
    
    .gallery.grid li {
      display: inline-block;
      border-top: 1px solid #eee;
      border-right: 1px solid #ccc;
      border-bottom: 1px solid #ccc;
      border-left: 1px solid #eee;
      padding: 6px;
      position: relative;
      -moz-box-sizing: border-box;
      border-radius: 3px 3px 3px 3px;
      background: #fff;
    }
    
    .gallery a {
      display: block;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
    	<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css">
      
      <div class="container-fluid">
    
    		<div>
    			<span class="toggleparent btn btn-primary btn-lg" data-selector="parent_">Toggle Parents</span>
    			<span class="togglechild btn btn-success btn-lg" data-selector="child_">Toggle Children</span>
    		</div>
    
    		<hr />
    
    		<!-- parent start -->
    <div id="activities" class="menu">
    	<h1 class="heading">
    		<a href="#"><i class="fa fa-minus" aria-hidden="true"></i></a> Activities <span style="color:#ccc;"> [57] </span>
    	</h1>
    	<div id="parent_activities" class="submenu">
    		<!-- child start -->
    		<h4 class="subheading">
    			<a href="#"><i class="fa fa-minus green" aria-hidden="true"></i></a> award-medal <span style="color:#ccc;"> [6] </span>
    		</h4>
    		<div id="child_award-medal" class="indent">
    			<ul class="gallery grid">
    				<li>
    					<a href="#"><img title="military medal - 🎖️" src="https://cdn.jsdelivr.net/emojione/assets/svg/1f396.svg" class="icon" role="presentation"></a>
    				</li>
    			</ul>
    		</div>	<!-- /indent --> 
    		<!-- child start -->
    		<h4 class="subheading">
    			<a href="#"><i class="fa fa-minus green" aria-hidden="true"></i></a> event <span style="color:#ccc;"> [19] </span>
    		</h4>
    		<div id="child_event" class="indent">
    			<ul class="gallery grid">
    				<li>
    					<a href="#"><img title="jack-o-lantern - 🎃" src="https://cdn.jsdelivr.net/emojione/assets/svg/1f383.svg" class="icon" role="presentation"></a>
    				</li>
    			</ul>
    		</div>	<!-- /indent --> 
    	</div> <!-- /submenu --> 
    </div> <!-- /menu --> 
    <!-- parent end -->
    
    
    
    
    <!-- parent start -->
    <div id="animals-nature" class="menu">
    	<h1 class="heading">
    		<a href="#"><i class="fa fa-minus" aria-hidden="true"></i></a> Animals & Nature <span style="color:#ccc;"> [106] </span>
    	</h1>
    	<div id="parent_animals-nature" class="submenu">
    		<!-- child start -->
    		<h4 class="subheading">
    			<a href="#"><i class="fa fa-minus green" aria-hidden="true"></i></a> animal-amphibian <span style="color:#ccc;"> [1] </span>
    		</h4>
    		<div id="child_animal-amphibian" class="indent">
    			<ul class="gallery grid">
    				<li>
    					<a href="#"><img title="frog face - 🐸" src="https://cdn.jsdelivr.net/emojione/assets/svg/1f438.svg" class="icon" role="presentation"></a>
    				</li>
    			</ul>
    		</div>	<!-- /indent --> 
    		<!-- child start -->
    		<h4 class="subheading">
    			<a href="#"><i class="fa fa-minus green" aria-hidden="true"></i></a> animal-bird <span style="color:#ccc;"> [12] </span>
    		</h4>
    		<div id="child_animal-bird" class="indent">
    			<ul class="gallery grid">
    				<li>
    					<a href="#"><img title="turkey - 🦃" src="https://cdn.jsdelivr.net/emojione/assets/svg/1f983.svg" class="icon" role="presentation"></a>
    				</li>
    			</ul>
    		</div>	<!-- /indent --> 
    	</div> <!-- /submenu --> 
    </div> <!-- /menu --> 
    <!-- parent end -->
    
    
    
    
    	</div>
    1 回复  |  直到 8 年前
        1
  •  2
  •   Pedram Neo M Hacker    8 年前

    因为 .parent().find('.indent') 它找到了所有 .indent ,但你需要找到什么 .next 具有的元素 缩进 类不是全部,因此您应该使用 .parent().next('.indent') 。

    $(document).ready(function() {
      $('.toggleparent').addClass('toggle-open');
      $('.heading > a').on('click', function(event) {
        event.preventDefault();
        if ($(this).find('i').hasClass('fa-minus')) {
          $(this).find('i').removeClass('fa-minus').addClass('fa-plus');
          $(this).parent().parent().find('.submenu').css("display", "none");
          $(this).parent().parent().find('.submenu').addClass('closed');
          if ($('.submenu.closed').length == $('.menu').length) {
            $('.toggleparent').removeClass('toggle-open');
          }
        } else if ($(this).find('i').hasClass('fa-plus')) {
          $(this).find('i').removeClass('fa-plus').addClass('fa-minus');
          $(this).parent().parent().find('.submenu').css("display", "block");
          $(this).parent().parent().find('.submenu').removeClass('closed');
          $('.toggleparent').addClass('toggle-open');
        }
      });
      $('.toggleparent').on('click', function() {
        if ($(this).hasClass('toggle-open')) {
          $('.heading').each(function() {
            $(this).find('i').removeClass('fa-minus').addClass('fa-plus');
            $(this).parent().find('.submenu').css("display", "none");
            $(this).parent().parent().find('.submenu').addClass('closed');
          });
          $('.toggleparent').removeClass('toggle-open');
        } else {
          $('.heading').each(function() {
            $(this).find('i').removeClass('fa-plus').addClass('fa-minus');
            $(this).parent().find('.submenu').css("display", "block");
            $(this).parent().parent().find('.submenu').removeClass('closed');
          });
          $('.toggleparent').addClass('toggle-open');
        }
      });
    });
    
    
    
    $(document).ready(function() {
      $('.togglechild').addClass('toggle-open');
      $('.subheading > a').on('click', function(event) {
        event.preventDefault();
        if ($(this).find('i').hasClass('fa-minus')) {
          $(this).find('i').removeClass('fa-minus').addClass('fa-plus');
          $(this).parent().next('.indent').css("display", "none");
          $(this).parent().next('.indent').addClass('closed');
          if ($('.indent.closed').length == $('.menu').length) {
            $('.togglechild').removeClass('toggle-open');
          }
        } else if ($(this).find('i').hasClass('fa-plus')) {
          $(this).find('i').removeClass('fa-plus').addClass('fa-minus');
          $(this).parent().next('.indent').css("display", "block");
          $(this).parent().next('.indent').removeClass('closed');
          $('.togglechild').addClass('toggle-open');
        }
      });
      $('.togglechild').on('click', function() {
        if ($(this).hasClass('toggle-open')) {
          $('.subheading').each(function() {
            $(this).find('i').removeClass('fa-minus').addClass('fa-plus');
            $(this).next('.indent').css("display", "none");
            $(this).next('.indent').addClass('closed');
          });
          $('.togglechild').removeClass('toggle-open');
        } else {
          $('.subheading').each(function() {
            $(this).find('i').removeClass('fa-plus').addClass('fa-minus');
            $(this).next('.indent').css("display", "block");
            $(this).next('.indent').removeClass('closed');
          });
          $('.togglechild').addClass('toggle-open');
        }
      });
    });
    body {
      background: #fff;
      margin-top: 20px;
    }
    
    h1.heading {
      font: 'Oswald';
      text-transform: uppercase;
    }
    
    td {
      background: #f1f1f1;
      border-bottom: 1px solid #ccc;
      border-right: 1px solid #ccc;
      padding: 20px;
      margin: 5px;
      border-top: 1px solid #fff;
      border-left: 1px solid #fff;
    }
    
    .wrappingmapping {
      margin: 20px 0 0 20px;
      border-radius: 85px;
      overflow: hidden;
      border: 10px solid #fff;
      box-shadow: 0 0 10px #999;
    }
    
    .menu {
      margin-bottom: 50px;
    }
    
    .submenu {
      padding: 20px;
      background: repeating-linear-gradient( -45deg, #999, #999 10px, #888 10px, #888 20px);
      border-radius: 2px;
    }
    
    .green {
      color: #28a745;
    }
    
    .heading {
      color: #000;
      background: #ccc;
      border-bottom: 1px solid #ccc;
      padding: 5px;
    }
    
    .subheading {
      background: #fff;
      padding-left: 10px;
      background: #f1f1f1;
      border-top: 1px solid #fff;
      font-size: 30px;
    }
    
    .indent {
      background: #fff;
      padding: 0px 20px 20px 20px;
    }
    
    .icon {
      width: 64px;
      height: 64px;
    }
    
    .gallery {
      width: 100%;
      *width: 99.94877049180327%;
      margin: 0;
      padding: 0;
    }
    
    .gallery.grid li {
      margin: 2px 5px;
    }
    
    .gallery.grid li {
      margin: 2px 5px;
      display: block;
    }
    
    .gallery.grid li:hover {
      background: #ccc;
    }
    
    .gallery.grid li {
      display: inline-block;
      border-top: 1px solid #eee;
      border-right: 1px solid #ccc;
      border-bottom: 1px solid #ccc;
      border-left: 1px solid #eee;
      padding: 6px;
      position: relative;
      -moz-box-sizing: border-box;
      border-radius: 3px 3px 3px 3px;
      background: #fff;
    }
    
    .gallery a {
      display: block;
    }
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.6.3/css/font-awesome.min.css">
    
    <div class="container-fluid">
    
      <div>
        <span class="toggleparent btn btn-primary btn-lg" data-selector="parent_">Toggle Parents</span>
        <span class="togglechild btn btn-success btn-lg" data-selector="child_">Toggle Children</span>
      </div>
    
      <hr />
    
      <!-- parent start -->
      <div id="activities" class="menu">
        <h1 class="heading">
          <a href="#"><i class="fa fa-minus" aria-hidden="true"></i></a> Activities <span style="color:#ccc;"> [57] </span>
        </h1>
        <div id="parent_activities" class="submenu">
          <!-- child start -->
          <h4 class="subheading">
            <a href="#"><i class="fa fa-minus green" aria-hidden="true"></i></a> award-medal <span style="color:#ccc;"> [6] </span>
          </h4>
          <div id="child_award-medal" class="indent">
            <ul class="gallery grid">
              <li>
                <a href="#"><img title="military medal - 🎖️" src="https://cdn.jsdelivr.net/emojione/assets/svg/1f396.svg" class="icon" role="presentation"></a>
              </li>
            </ul>
          </div>
          <!-- /indent -->
          <!-- child start -->
          <h4 class="subheading">
            <a href="#"><i class="fa fa-minus green" aria-hidden="true"></i></a> event <span style="color:#ccc;"> [19] </span>
          </h4>
          <div id="child_event" class="indent">
            <ul class="gallery grid">
              <li>
                <a href="#"><img title="jack-o-lantern - 🎃" src="https://cdn.jsdelivr.net/emojione/assets/svg/1f383.svg" class="icon" role="presentation"></a>
              </li>
            </ul>
          </div>
          <!-- /indent -->
        </div>
        <!-- /submenu -->
      </div>
      <!-- /menu -->
      <!-- parent end -->
    
    
    
    
      <!-- parent start -->
      <div id="animals-nature" class="menu">
        <h1 class="heading">
          <a href="#"><i class="fa fa-minus" aria-hidden="true"></i></a> Animals & Nature <span style="color:#ccc;"> [106] </span>
        </h1>
        <div id="parent_animals-nature" class="submenu">
          <!-- child start -->
          <h4 class="subheading">
            <a href="#"><i class="fa fa-minus green" aria-hidden="true"></i></a> animal-amphibian <span style="color:#ccc;"> [1] </span>
          </h4>
          <div id="child_animal-amphibian" class="indent">
            <ul class="gallery grid">
              <li>
                <a href="#"><img title="frog face - 🐸" src="https://cdn.jsdelivr.net/emojione/assets/svg/1f438.svg" class="icon" role="presentation"></a>
              </li>
            </ul>
          </div>
          <!-- /indent -->
          <!-- child start -->
          <h4 class="subheading">
            <a href="#"><i class="fa fa-minus green" aria-hidden="true"></i></a> animal-bird <span style="color:#ccc;"> [12] </span>
          </h4>
          <div id="child_animal-bird" class="indent">
            <ul class="gallery grid">
              <li>
                <a href="#"><img title="turkey - 🦃" src="https://cdn.jsdelivr.net/emojione/assets/svg/1f983.svg" class="icon" role="presentation"></a>
              </li>
            </ul>
          </div>
          <!-- /indent -->
        </div>
        <!-- /submenu -->
      </div>
      <!-- /menu -->
      <!-- parent end -->
    
    
    
    
    </div>