In my ImagePress plugin, we needed to ensure that all boxes have the same height after they have been loaded.
Given the following DOM structure:
<div class="ip-list">
<div class="ip-box">my content here</div>
<div class="ip-box">my content here</div>
<div class="ip-box">my content here</div>
</div>
I used the following function:
function equalHeight(containerSelector) {
const elements = document.querySelectorAll(containerSelector);
let currentTallest = 0;
let currentRowStart = 0;
let rowDivs = [];
let topPosition = 0;
elements.forEach(function(el) {
el.style.height = 'auto';
topPosition = el.offsetTop;
if (currentRowStart !== topPosition) {
rowDivs.forEach(function(rowEl) {
rowEl.style.height = currentTallest + 'px';
});
rowDivs = [];
currentRowStart = topPosition;
currentTallest = el.offsetHeight;
rowDivs.push(el);
} else {
rowDivs.push(el);
currentTallest = Math.max(currentTallest, el.offsetHeight);
}
});
// Set the height for the last row
rowDivs.forEach(function(rowEl) {
rowEl.style.height = currentTallest + 'px';
});
}
window.addEventListener('load', function() {
equalHeight('.ip-list .ip-box');
});
window.addEventListener('resize', function() {
equalHeight('.ip-list .ip-box');
});
This function ensures that all elements with the class .ip-box
within .ip-list
have equal heights, adjusting dynamically on window load and resize events.