2014-07-14 13 views
5

Considerate i seguentiCentrare una griglia di larghezza variabile, mentre allineando gli elementi a sinistra

<div class="container"> 
    <div class="grid"> 
     <div class="unit"></div> 
     <div class="unit"></div> 
     <div class="unit"></div> 
     <div class="unit"></div> 
     <div class="unit"></div> 
     <div class="unit"></div> 
      .... 
     </div> 
</div> 

Utilizzando le immagini, in pratica quello che ho è qualcosa di simile

enter image description here

Come si può vedere la i blocchi verdi e il contenitore sono allineati a sinistra

Quello che voglio ottenere è qualcosa di simile.

enter image description here

Gli .unit elementi hanno larghezza costante

L'elemento .grid dovrebbe espandersi con larghezza (in modo che più unit elementi si adatterebbe in linea 1) mentre è sempre centrato all'interno .container.

Qualsiasi indizio su come ottenerlo utilizzando solo CSS (e forse alcuni wrapper html se necessario)?

+0

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

+0

Interessante domanda. – DRD

+0

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

risposta

0

nel CSS, assicurarsi che: 1. Nella regola .grid, text-align è impostato su center 2. Nella regola .unit, display è impostato su inline-block. L'elemento div è un elemento a livello di blocco e quindi ogni nuovo elemento viene visualizzato su una nuova riga. Se si assegna alla proprietà display un valore pari a inline-block, tutti gli div s con la classe unit devono essere visualizzati sulla stessa riga (fino a quando non c'è più spazio). Anche text-align : center non funziona con elementi con proprietà di visualizzazione impostate su block e gli elementi a livello di blocco hanno un valore di visualizzazione di block per impostazione predefinita.

0

Devi solo dare valore ai vostri corsi come questo,

.grid { text-align:center; } 

.unit { display:inline-block; } 

Spero che questo risolverà il problema.

In caso contrario, si prega di mostrare il codice completo tramite Jsfiddle.

1

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 .griddiv 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.

+0

Questo in realtà risolve il problema, ma il problema è il suo non generico. Immagina di avere 20 blocchi in 1 riga, o più, essere condizionato dalla larghezza dello schermo è qualcosa su cui non voglio fare affidamento – man

+0

Dobbiamo lavorare tutti entro certi limiti. Dati gli aspetti specifici della tua richiesta - la soluzione solo CSS che centra un '.grid 'che si estende abbastanza, all'interno del suo contenitore, per ridurre perfettamente i blocchi a dimensione fissa che scorrono a sinistra - è il meglio che ho potuto inventare. Saluti. – DRD

+0

E, ecco un prodotto della mia conversazione con @Tyblitz - una soluzione generalizzabile che utilizza jQuery: http://jsfiddle.net/GWQSe/. – DRD

0

@ La risposta di DRD è buona, ma richiede molte richieste multimediali. Se il seguente tua barca galleggia però: non guardare troppo lontano quando può essere semplice: impostare un padding-left/-proprio sul vostro contenitore ...

.grid { 
    padding: 0 5%; 
} 

Noterete gli spazi è nemmeno quando la larghezza non è una moltiplicazione dell'intera scatola di .unit (riempimento, margine, bordo, larghezza). Impostazione di una larghezza basata su% può aiutare qui.

Vedere this fiddle per un test case. Ho aggiunto un po 'di Javascript per regolare il padding in modo dinamico, rimuoverlo per vedere il risultato solo CSS. EDIT: @DRD ha creato una funzione jQuery che funziona meglio del mio JS, vederlo here (non dimenticare di includere jQuery se vuoi usarlo).

+0

Mi piacerebbe vedere un violino di questa soluzione. – DRD

+0

@DRD, ho bifatto il tuo violino e l'ho aggiunto alla mia risposta, buon punto. – Tyblitz

+1

Usare JS per regolare il padding è un modo per farlo, ma crea anche un sacco di sfarfallio. Ecco una soluzione che consente al browser di eseguire tutto il posizionamento e lo script decide su quali elementi viene applicato il 'clear: left'. L'esperienza è molto più fluida e la soluzione è generalizzabile senza la necessità di utilizzare le query multimediali: http://jsfiddle.net/GWQSe/. Inoltre, usa meno potenza di elaborazione anche se sto usando jQuery invece di parlare direttamente con DOM. – DRD

0

Sembra che una soluzione a questo è simile a quella qui Flex-box: Align last row to grid

Prima di tutto impostare .grid-inline, quindi l'aggiunta di più div con height: 0 farebbe il trucco, numero di div in più di dovrebbe essere atleast pari a numero massimo di units in 1 riga (meno 1).

Questo è un po 'incontinente, ma ancora più facile che la definizione multipla @media come @DRD suggerito, e non richiede JavaScript/window.resize() la manipolazione

<div class="container"> 
    <div class="grid"> 
     <div class="unit"></div> 
     <div class="unit"></div> 
     <div class="unit"></div> 
     <div class="unit"></div> 
     <div class="unit"></div> 
     <div class="unit"></div> 
     <div class="unit empty"></div> 
     <div class="unit empty"></div> 
     <div class="unit empty"></div> 
     <div class="unit empty"></div> 
     <div class="unit empty"></div> 
     <div class="unit empty"></div> 
     <div class="unit empty"></div> 
    </div> 
</div> 


.container { 
    display: block; 
    text-align: center; 
} 

.empty { 
    height: 0 !important; 
} 

.grid { 
    display: inline; 
} 

spero ancora di una soluzione migliore usando solo css

+0

La codepen a cui si fa riferimento nel post a cui si è collegato usa la disposizione di flexbox dove le dimensioni delle scatole cambiano a seconda della larghezza del browser: http://jsfiddle.net/4z8b4/. Nel momento in cui aggiusti la loro larghezza, la soluzione cade a pezzi: http://jsfiddle.net/nkX6p/. – DRD

+0

Un'altra cosa e ho finito con questo thread. I CSS sono ancora una lingua di presentazione, quindi scegli le tue battaglie, amico. Prevedo che in futuro molte altre cose che faremo in JS lo faremo facilmente in CSS. – DRD

Problemi correlati