Vorrei iniziare col dire che questa è una domanda interessante e il mio primo pensiero è stato che il flexbox è il modo per risolvere questo problema. Ho provato tutti i tipi di accordi di flexbox, ma questo tipo di soluzione mi ha eluso. Di seguito, la soluzione che utilizza le query floating, clearing e media.
Per questo esempio, ho assunto che ogni riga abbia almeno 3 e non più di 9 caselle. Tuttavia, è possibile estendere questa soluzione per gestire ovunque tra 1 e più di 9 caselle.
Ecco HTML:
<div class="grid">
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
<div></div>
</div>
Ecco un CSS che (1) esegui una mini-reset per eliminare le imbottiture ei margini browser applicata che possono interferire con il dimensionamento e (2) formatta i .grid
e le sue div
bambini :
* {
margin: 0;
padding: 0;
}
.grid {
display: table;
outline: 1px solid blue;
min-width: 330px;
margin: 0 auto;
}
.grid > div {
width: 100px;
height: 61px;
margin: 5px;
background-color: teal;
float: left;
}
Il blocco .container
stato eliminato perché .grid
viene visualizzato come una tabella. Quest'ultimo è un blocco che si restringe attorno ai suoi figli e margin: 0 auto
può essere applicato per centrarlo sulla pagina. Lo min-width
di 330px del .grid
assicura che un minimo di tre blocchi possa adattarsi per riga. Ogni volta che si verifica un errore all'interno di un elemento table
, i suoi margini non collassano, quindi non è necessaria alcuna compensazione esplicita dei float (ad es. Tramite clearfix).
Ogni .grid
div
bambino occupa 110 px di spazio orizzontale (100 px di larghezza + 10 px nei margini sinistro e destro). Questo numero è importante per il codice media query che segue qui sotto:
@media screen and (min-width: 330px) and (max-width: 439px) {
.grid > div:nth-of-type(3n + 1) {
clear: left;
}
}
@media screen and (min-width: 440px) and (max-width: 549px) {
.grid > div:nth-of-type(4n + 1) {
clear: left;
}
}
@media screen and (min-width: 550px) and (max-width: 659px) {
.grid > div:nth-of-type(5n + 1) {
clear: left;
}
}
@media screen and (min-width: 660px) and (max-width: 769px) {
.grid > div:nth-of-type(6n + 1) {
clear: left;
}
}
@media screen and (min-width: 770px) and (max-width: 879px) {
.grid > div:nth-of-type(7n + 1) {
clear: left;
}
}
@media screen and (min-width: 880px) and (max-width: 989px) {
.grid > div:nth-of-type(8n + 1) {
clear: left;
}
}
@media screen and (min-width: 990px) {
.grid > div:nth-of-type(9n + 1) {
clear: left;
}
}
La logica alla base del codice è questo: se non v'è abbastanza spazio per includere solo n blocchi per riga, quindi ogni blocco di (n + 1) il bordo sinistro viene cancellato, che sposta il blocco su una nuova linea.
E, ecco un violino: http://jsfiddle.net/5hWXw/. Ridimensiona la finestra di anteprima per vedere le regolazioni.
Senza vedere il css è difficile dirlo. Questo è causato dai tuoi galleggianti. Quando si utilizzano i float, non esiste un modo semplice per centrare i bambini nel contenitore padre.Se il contenitore ha una larghezza fissa, potresti essere in grado di aggiungere 'margin: 0 auto; 'a questo modo il contenitore stesso è centrato. – EternalHour
Interessante domanda. – DRD
Non sto facendo alcun float .. il margine non funzionerà perché se metto 'grid' su' block' non c'è modo di centrare le 'unità' come nell'immagine – man