В вашем гибком боксе вы можете использовать resize
на одном из делителей и настраивать другое автоматически с помощью flex-grow
, установленным на один - недостаток в том, что ползунок не очень настраиваемый:
- добавьте
resize: vertical
к одному из гибких элементов - добавьте
flex: 1
к другому гибкому элементу (чтобы этот гибкий элемент настраивался автоматически в ответ на изменение высоты другого гибкого элемента по мере его изменения)
body {
margin: 0;
}
.outer {
display: flex;
flex-direction: column;
height: 100vh;
}
.block {
height: 50%;
}
.block-1 {
background-color: red;
resize: vertical; /* resize vertical */
overflow: auto; /* resize works for overflow other than visible */
}
.block-2 {
background-color: green;
flex: 1; /* adjust automatically */
}
<div class="outer">
<div class="block block-1">
Block 1
</div>
<div class="block block-2">
Block 2
</div>
</div>
Solution
Вместо этого вы можете использовать mousedown
слушатель, который регистрирует a mousemove
слушателькоторый обновляет block-1
высоту (и сброс mouseup
событие) - см. демонстрацию ниже:
let block = document.querySelector(".block-1"),
slider = document.querySelector(".slider");
// on mouse down (drag start)
slider.onmousedown = function dragMouseDown(e) {
// get position of mouse
let dragX = e.clientY;
// register a mouse move listener if mouse is down
document.onmousemove = function onMouseMove(e) {
// e.clientY will be the position of the mouse as it has moved a bit now
// offsetHeight is the height of the block-1
block.style.height = block.offsetHeight + e.clientY - dragX + "px";
// update variable - till this pos, mouse movement has been handled
dragX = e.clientY;
}
// remove mouse-move listener on mouse-up (drag is finished now)
document.onmouseup = () => document.onmousemove = document.onmouseup = null;
}
body {
margin: 0;
}
.outer {
display: flex;
flex-direction: column;
height: 100vh;
}
.block {
height: 50%;
}
.block-1 {
background-color: red;
resize: vertical; /* resize vertical */
overflow: auto; /* resize works for overflow other than visible */
}
.block-2 {
background-color: green;
flex: 1; /* adjust automatically */
min-height: 0;
overflow: hidden; /* hide overflow on small width */
}
.slider {
text-align: center;
letter-spacing: 10px;
background-color: #dee2e6;
cursor: row-resize;
user-select: none; /* disable selection */
}
<div class="outer">
<div class="block block-1">
Block 1
</div>
<div class="slider">slider</div>
<div class="block block-2">
Block 2
</div>
</div>