Как распределить складные предметы в гибком ящике

#javascript #html #css #flexbox

Вопрос:

У меня есть страница из 3 панелей, созданная с помощью flexbox. Это выглядит так:

введите описание изображения здесь

Если я разверну второй раздел, первый раздел свернется, и он будет выглядеть так:

введите описание изображения здесь

Это здорово, но я хочу, чтобы первый раздел не закрывался автоматически при открытии второго раздела. В идеале и первая, и вторая секции занимают одинаковую высоту (50/50).

 <ul>
  <li class="active">
    <div class="wrap">
      <a href="#">open1</a>
        <div>text 1</div>    
    </div>
  </li>
  <li>
    <div class="wrap">
      <a href="#">open2</a>
        <div>text 2</div>    
    </div>
  </li>
  <li>
    <div class="wrap">
      <a href="#">open3</a>
      <div>text 3</div>
    </div>
  </li>
</ul>
 
 * {
  box-sizing: border-box;
}
html, body {
  height: 100%;
  margin: 0;
}
ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  height: 100%;
  flex-direction: column;
}

ul li {
  background:gray;
  padding:10px 30px;
  border-top: 2px solid #fff0ed;
}
ul li:first-child{
  border-top: none;
}

ul a {
  background: green;
  display: block;
  padding: 5px;
}

ul .wrap {
  background: #000;
  display: flex;
  flex-direction: column;
  width: 100%;
  min-height: 100%;
  color: #fff;
}

ul .wrap div {
  display: none;
  padding: 20px;
}

ul li.active {
  display: flex;
  flex: 1 1 auto;
}

ul li.active .wrap div {
  display: block;
}
 

Как я мог этого достичь?

КОДОВЫЙ КОД здесь

Ответ №1:

Вы можете использовать toggleClass это, чтобы удалить класс из выбранного элемента, если он уже существует, в противном случае он добавит класс.

 $('li').on('click', function() {
  $(this).toggleClass('active')
}) 
 * {
  box-sizing: border-box;
}

html,
body {
  height: 100%;
  margin: 0;
}

ul {
  list-style: none;
  margin: 0;
  padding: 0;
  display: flex;
  height: 100%;
  flex-direction: column;
}

ul li {
  background: gray;
  padding: 10px 30px;
  border-top: 2px solid #fff0ed;
}

ul li:first-child {
  border-top: none;
}

ul a {
  background: green;
  display: block;
  padding: 5px;
}

ul .wrap {
  background: #000;
  display: flex;
  flex-direction: column;
  width: 100%;
  min-height: 100%;
  color: #fff;
}

ul .wrap div {
  display: none;
  padding: 20px;
}

ul li.active {
  display: flex;
  flex: 1 1 auto;
}

ul li.active .wrap div {
  display: block;
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<ul>
  <li class="active">
    <div class="wrap">
      <a href="#">open1</a>
      <div>text 1</div>
    </div>
  </li>
  <li>
    <div class="wrap">
      <a href="#">open2</a>
      <div>text 2</div>
    </div>
  </li>
  <li>
    <div class="wrap">
      <a href="#">open3</a>
      <div>text 3</div>
    </div>
  </li>
</ul> 

Ответ №2:

Вы можете управлять им с помощью Javascript:

 $('li').each(function(){
  var $this = $(this);
  
  $this.on('click', function(){
    if ($this.hasClass('active')) $this.removeClass('active');
    else $this.addClass('active');
  });
});
 

Короче:

  $('li').each(function(){
  var $this = $(this);
  
  $this.on('click', function(){
    $this[$this.hasClass('active') ? 'removeClass' : 'addClass' ]('active');
  });
});