Wrapping with hidden counter
Wrapping with hidden counter
by Csaba Hellinger
December 20, 2023
HTML
<div class="layout">
<div class="container"></div>
<div class="remaining"></div>
</div>
<small>Change the window width to test the wrapping behaviour</small>
CSS
.layout {
display: grid;
grid-template-columns: 1fr auto;
grid-template-rows: 1fr;
padding: 1px;
background: white;
}
.container {
background: dimgrey;
display: flex;
flex-wrap: wrap;
gap: 1px;
position: relative;
overflow-y: clip;
}
.item {
flex-shrink: 0;
background: navy;
}
.remaining {
display: flex;
justify-content: center;
align-items: center;
width: 50px;
background: green;
}
.remaining.hidden {
display: none;
}
.layout, .container, .item, .remaining {
height: 50px;
max-height: 50px;
}
/* ------------------- */
body {
background: #333;
color: #ddd;
font-family: sans-serif;
margin: 1rem;
}
JavaScript
const container = document.querySelector('.container');
const remaining = document.querySelector('.remaining');
const items = Array(8).fill(0).map((_,index) => {
console.log(index);
const item = document.createElement('div');
item.className = 'item';
item.style.width = Math.round(1 + Math.random() * 2)Â * 30 + 'px';
item.textContent = index;
container.appendChild(item);
return item;
});
const resizeObserver = new ResizeObserver((entries) => {
const visibleCount = items.filter((item,index) => item.offsetTop < container.clientHeight).length;
const hiddenCount = items.length - visibleCount;
remaining.classList[hiddenCount === 0 ? 'add' : 'remove']('hidden');
remaining.textContent = `+ ${hiddenCount}`;
});
resizeObserver.observe(container);