Import fiddle as a JS Module - chain fiddles together
by rhelminen
HTML
<script src="https://raw.githubusercontent.com/procurios/ResizeSensor/master/dist/resizeSensor.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<div class="container-fluid" id="grdContainer">
<div class="grid-container" id="grdSelector">
<div>Item 1</div>
<div>Item 1235645</div>
<div>Item 42642645254251</div>
<div>Item 164</div>
<div>Item 16</div>
<div>Item 13</div>
<div>Item 133</div>
</div>
</div>
JavaScript
var GRID_GAP = 3; // GRID-GAP of the grid
var iGridW = 0; // LAST comparative value of grid item width
var sizingWIP = false;
var GRID_LAYOUT = {
'maxwidth': { /* CSS settings to compare item widths */
display: "grid",
gap: GRID_GAP + "px",
"grid-template-columns": "none",
"grid-auto-columns": "max-content"
},
'normal': { /* Normal CSS style to display the grid */
display: "grid",
gap: GRID_GAP + "px",
"grid-template-columns": "repeat(auto-fit, minmax(" + iGridW + "px, 1fr)",
"grid-auto-columns": "none"
}
};
$(function() { // Shorthand for document.ready event
evalGridItemMaxSize();
});
new ResizeSensor(document.getElementById("grdContainer"), function() {
if(sizingWIP) return;
sizingWIP = true;
evalGridItemMaxSize();
sizingWIP = false;
});
// EVALUATE GRID ITEM WIDTH TO MAX-CONTENT FOR *ALL* COLUMNS (equivalent to "grid-template-columns: repeat(auto-fit, max-content)" which *cannot* be set in CSS
// (repeat(auto-fill... & repeat(auto-fit... *cannot* be used with intrinsic {min-content, max-content, auto})
function evalGridItemMaxSize() {
$("#grdSelector").css(GRID_LAYOUT['maxwidth']);
if ($("#someGridItemID").outerWidth() === iGridW) {
$("#grdSelector").css(GRID_LAYOUT['normal']);
return; //Exit if grid item max-width is same as last time
}
// Re-evaluate grid item width as a function of max-content of *all* items
iGridW = $("#someGridItemID").outerWidth();
GRID_LAYOUT['normal']['grid-template-columns'] = "repeat(auto-fit, minmax(" + iGridW + "px, 1fr)"
$("#grdSelector").css(GRID_LAYOUT['normal']);
}