#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');
});
});