The CSS shrinkwrapping container
This is a pure
CSS challenge:
no javascript,
no extra HTML
We have a container (e.g. an ‘outer’ div) and inside this container we
have N boxes with constrained width (i.e. width or max-width is
specified). We want to lay out the boxes side by side, as many as fit
inside the viewport, and we want the outer container to wrap these boxes
as tightly as possible (considering, of course, all padding and
margins). The container (and thereby the collection of boxes inside it)
should be centered inside the viewport.
The problem here is that we want to lay out the inner boxes (almost)
without taking the outer box into consideration, and then lay out the
outer box as if it had {width: 100%; margin-left: auto; margin-right:
auto}.
A suboptimal solution
There is, in fact, a suboptimal solution for this challenge. The idea is
to fix the container width based on the width necessary to wrap the
actual number of boxes that would fit at a given viewport width, and
then let the box fill the container as appropriate (I prefer a display:
inline-block, without floats, since this spaces out the boxes evenly).
For example, if we know that, considering padding and margins, the
container would have to be large 33em when holding only one box, and
that only one box would fit with a viewport smaller than 66em, and
that only two boxes would fit with a viewport smaller than 98em, etc,
we could use something like the following:
@media (max-width: 98em) {
#content {
width: 66em;
}
}
@media (max-width: 66em) {
#content {
width: 33em;
}
}
Now, the reason why this is a horrible solution. To work perfectly, it requires the following things to be known:
- the number of boxes (one media query for each ‘additional box’ configuration is needed),
- the width of each box (note that the solution works regardless of whether the boxes have the same or different widths, as long as each box width is known, in the order in which they are to be laid out).
The challenge proper
The question is: is it possible to achieve this effect without knowing the number of boxes and without writing an infinite (nor a ‘reasonably high’) number of media queries? Even a solution in the case of fixed, equal-width boxes would be welcome.