Проблема здесь в том, что вы должны вычислять фрагменты для каждого изменяемого размера, включая границы. Первоначально вы смотрите на первый элемент и вычисляете maxWidth
для других элементов одного уровня. для вашего примера, это остальные 4 элемента.
Если вы возьмете один из других элементов, скажем, 3-й, остальные оставшиеся ближайшие братья и сестры должны быть обновлены, так что их maxWidth
- это оставшаяся часть.
$(function() {
function getPad(o, d) {
return parseInt(o.css("padding-" + d));
}
function getMaxWidth(o) {
var mw = parseInt(o.parent().innerWidth()) - (getPad(o.parent(), "left") + getPad(o.parent(), "right"));
var sbw = 2; // First & Last Border
o.siblings(".columnContainer").each(function(i, el) {
sbw += parseInt($(el).width()) + 1; // Inner Border
});
return mw - sbw;
}
function makeResizable() {
$('#resultColumns .columnContainer').resizable({
handles: 'e',
maxWidth: getMaxWidth($("#resultColumns .first")),
resize: function(e, ui) {
console.log($(this).width(), getMaxWidth($(this)));
},
stop: function(e, ui) {
$(this).siblings().each(function(i, el) {
$(el).resizable("option", "maxWidth", getMaxWidth($(el)));
});
}
});
}
makeResizable();
});
html,
body {
margin: 0;
padding: 0;
}
#app {
width: 100%;
height: 100%;
}
#resultColumns {
width: calc(100% - 20px);
height: calc(100% - 20px);
padding: 10px;
}
.columnContainer {
min-width: 100px;
height: 100%;
background-color: #eeeeee;
float: left;
border-top: 1px solid #333333;
border-bottom: 1px solid #333333;
border-left: 1px solid #333333;
}
.last {
border-right: 1px solid #333333;
}
.columnHeader {
font-size: 16px;
font-weight: bold;
text-align: center;
}
.columnContent {
font-size: 14px;
text-align: left;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
<script src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.10.3/jquery-ui.min.js"></script>
<link rel="stylesheet" type="text/css" href="http://code.jquery.com/ui/1.10.3/themes/smoothness/jquery-ui.css" />
<div id="app">
<div id="resultColumns">
<!-- First Column -->
<div class="columnContainer first">
<div class="columnHeader">Title 1</div>
<div class="columnContent">Content 1</div>
</div>
<!-- Second Column -->
<div class="columnContainer">
<div class="columnHeader">Title 2</div>
<div class="columnContent">Content 2</div>
</div>
<!-- Third Column -->
<div class="columnContainer">
<div class="columnHeader">Title 3</div>
<div class="columnContent">Content 3</div>
</div>
<!-- Fourth Column -->
<div class="columnContainer">
<div class="columnHeader">Title 4</div>
<div class="columnContent">Content 4</div>
</div>
<!-- Fifth Column -->
<div class="columnContainer last">
<div class="columnHeader">Title 5</div>
<div class="columnContent">Content 5</div>
</div>
</div>
</div>