Ricerca…


introduzione

Quando si creano layout avanzati, potrebbero verificarsi degli scenari in cui sarà necessario utilizzare più di 12 unità di colonna in un singolo elemento .row . Il concetto di wrapping di colonne e resettaggi reattivi (clearfix di AKA) sono essenziali per comprendere la progettazione reattiva con Bootstrap.

Nozioni di base sulla griglia Bootstrap

Osservazioni

Le griglie di bootstrap sono straordinariamente potenti ed eleganti. Tuttavia, è necessario ricordare che il nome del framework è "Bootstrap", non "WeDidItForYou". Bootstrap consente un design reattivo, non lo garantisce .

Spetta a te rendere il tuo design veramente reattivo e offrire ai tuoi utenti la migliore esperienza possibile per l'utente finale.

The Naive First Attempt

Prima di iniziare, definiamo alcuni CSS per gli esempi. Questo è il head sezione del nostro campione. Io uso sempre border-radius e background-color quando sto testando, perché rende semplice vedere le divisioni cellulari senza aggiungere alcuna dimensione del bordo che potrebbe influenzare la dimensione delle celle.

<head>
    <title></title>
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <style>
        /* colorize all col- */
        [class^="col-"] {
            min-height: 30px;
            border-radius: 10px;
            background-color: lightblue;
        }
        /* a tall cell */
        .cell-tall {
            height: 100px;
            background-color: orange;
        }
        /* a medium-height cell */
        .cell-med {
            height: 50px;
            background-color: lightgreen;
        }
        /* padding top-bottom for some row examples */
        .row.padded {
            padding: 1rem 0 1rem 0;
        }
    </style>
</head>

Con quello fuori mano, definiamo una griglia e guardiamo i risultati perfetti in tutte le dimensioni della vista!

Utilizzando col-xs-6 col-md-3

<div class="container-fluid">
    <div class="row">
        <div class="col-xs-6 col-md-3">1</div>
        <div class="col-xs-6 col-md-3">2</div>
        <div class="col-xs-6 col-md-3">3</div>
        <div class="col-xs-6 col-md-3">4</div>
        <div class="col-xs-6 col-md-3">5</div>
        <div class="col-xs-6 col-md-3">6</div>
        <div class="col-xs-6 col-md-3">7</div>
        <div class="col-xs-6 col-md-3">8</div>
        <div class="col-xs-6 col-md-3">9</div>
        <div class="col-xs-6 col-md-3">10</div>
        <div class="col-xs-6 col-md-3">11</div>
    </div>
</div>

A dimensioni viewport medie A dimensioni viewport di piccole dimensioni

Le due immagini precedenti mostrano il rendering su schermi di medie e piccole dimensioni. Ricorda, otterremo QUATTRO colonne in media + a causa di col-md-3 e DUE celle in piccolo, a causa di col-xs-6 .

Sembra abbastanza buono, giusto? Penso che abbiamo finito qui! Ha detto un sacco di siti bootstrap ingenui là fuori che aspettano solo di rompere ...

Il problema dell'altezza

Nel nostro " esempio ingenuo ", tutte le nostre celle avevano la stessa altezza. Il browser volutamente ruppe le linee esattamente dove volevamo, e tutto sembrava giusto con il mondo. Fino a quando l'altezza entra in scena.

Prendiamo l'esempio precedente e diamo un po 'di altezza ad alcune celle, forse come vedreste in una pagina di tipo dashoard.

<div class="container-fluid">
    <div class="row">
        <div class="col-xs-6 col-md-3">1</div>
        <div class="col-xs-6 col-md-3 cell-tall">2</div>
        <div class="col-xs-6 col-md-3 cell-tall">3</div>
        <div class="col-xs-6 col-md-3">4</div>
        <div class="col-xs-6 col-md-3">5</div>
        <div class="col-xs-6 col-md-3 cell-med">6</div>
        <div class="col-xs-6 col-md-3">7</div>
        <div class="col-xs-6 col-md-3">8</div>
        <div class="col-xs-6 col-md-3 cell-med">9</div>
        <div class="col-xs-6 col-md-3 cell-med">10</div>
        <div class="col-xs-6 col-md-3">11</div>
    </div>
</div>

Qui abbiamo aggiunto qualche cell-tall e cell-med CSS che abbiamo definito in precedenza. Ciò avrà l'effetto di cambiare l'altezza di alcune celle. Mi chiedo come apparirà ...

Eccoli di nuovo nelle dimensioni di schermi medi e piccoli: med viewport no clearfix vista piccola no clearfix

Oh mio Dio, che casino. Non penso che sia quello che volevamo. A dimensioni medio-grandi, 5 e 6 sono fuori luogo, e in qualche modo 7 hanno finito per iniziare una nuova riga. A piccole dimensioni abbiamo due celle nella prima fila e quattro nella seconda fila, con 4, 5 e 6 tutte impilate sulla destra in entrambe le dimensioni dello schermo!

Quindi, come lo risolviamo?

Clearfix a Rescue

Un modo per aiutare la situazione sicuramente, sarebbe usare più di una row :

<div class="container-fluid">
    <div class="row">
        <!-- cols -->
    </div>
    <div class="row">
        <!-- cols -->
    </div>
</div>

Questa è solitamente la prima cosa che provano i nuovi Bootstrapper. E sembra avere senso: "Voglio quattro celle in ogni riga, quindi mi limiterò a creare una nuova row per ogni 4 col div".

Ma c'è un problema con questa linea di ragionamento: l'intero punto di Bootstrap 3 e la prossima versione 4 devono essere reattivi . Inserendo "quattro col in una row ", non si sta veramente "pensando in modo reattivo".

Una buona comprensione della classe CSS clearfix ti aiuterà a capire che le div multi row hanno offuscato la tua comprensione del modo in cui il responsive design doveva funzionare. In breve, semplicemente non puoi sapere quanti col mettere in row - il browser non ha ancora reso il tuo lavoro!

Ricorda in First Things First, abbiamo detto che devi pensare in "inverse of 12"? Senza ulteriori indugi, risolviamo il problema qui, utilizzando i commenti direttamente nel codice per chiarire ogni confusione. Sì, sembra molto più codice, ma la maggior parte dei commenti extra.

<div class="container-fluid">
    <div class="row">
        <div class="col-xs-6 col-md-3">1</div>
        <div class="col-xs-6 col-md-3 cell-tall">2</div>
        <!--
            We have rendered TWO cells.
            On small and extra small devices, the viewport will render TWO cells
            (12 / 6 = 2), so we need a clearfix every TWO cells. We also need to
            say "don't show this clearfix when the viewport will render FOUR cells",
            which it will do at medium size and up (12 / 3 = 4). We do that by adding
            hidden-md and hidden-lg to our clearfix div, in effect instructing the
            browser to not show it at all on a wider screen.
        -->
        <div class="clearfix hidden-md hidden-lg"></div>
        <!---->
        <div class="col-xs-6 col-md-3 cell-tall">3</div>
        <div class="col-xs-6 col-md-3">4</div>
        <!--
            We have now rendered FOUR cells.
            We are never going to have more than FOUR cells side by side. So every
            FOURTH cell, we place a clearfix that will ALWAYS show. We do this by
            just leaving off any of the hidden-* classes.
        -->
        <div class="clearfix"></div>
        <!---->
        <div class="col-xs-6 col-md-3">5</div>
        <div class="col-xs-6 col-md-3 cell-med">6</div>
        <!--
            We have now rendered SIX cells.
            After the sixth cell, we are at a multiple of TWO, but not FOUR so we
            repeat the clearfix that we used after cell TWO.
        -->
        <div class="clearfix hidden-md hidden-lg"></div>
        <!---->
        <div class="col-xs-6 col-md-3">7</div>
        <div class="col-xs-6 col-md-3">8</div>
        <!--
            Now we have rendered EIGHT cells, which is a multiple of TWO AND FOUR,
            so we put in a clearfix that's always visible.
        -->
        <div class="clearfix"></div>
        <!---->
        <div class="col-xs-6 col-md-3 cell-med">9</div>
        <div class="col-xs-6 col-md-3 cell-med">10</div>
        <!--
            After the 10th cell, once again a multiple of TWO but not FOUR...
        -->
        <div class="clearfix hidden-md hidden-lg"></div>
        <!---->
        <div class="col-xs-6 col-md-3">11</div>
    </div>
</div>

Il clearfix è una classe CSS che rende un div piccolo (praticamente invisibile), e il suo scopo è quello di "cancellare" i float di left che sono stati usati dai div col .

Il genio è davvero nelle classi hidden-sm , hidden-md , ecc. Queste classi sono posizionate sul div clearfix , NON sulle col div! Questo fa sì che il div clearfix magicamente o scompaia dal flusso di rendering a certe larghezze di vista! Genio!

Bootstrap ha una serie sconcertante di hidden-* e visible-* classi nella versione 3, e purtroppo non sono davvero il "inversa" l'uno dall'altro. Quindi trovo più chiaro e sicuro usare sempre le classi hidden-* sugli aggiornamenti chiari.

Sembra che potrebbe cambiare in meglio in Bootstrap 4, con classi come hidden-*-up e hidden-*-down (si stanno sbarazzando completamente delle classi visible-* ).

Abbastanza verbosa, com'è adesso? Clearfix grande Clearfixed small

Questo è quello che vogliamo! Nel grande schermo, abbiamo sempre QUATTRO attraverso, nello schermo più piccolo, sempre DUE attraverso. Niente più impilature in posti strani, e le lacune sono dove ci aspetteremmo che fossero.

Un cruscotto

Abbastanza bene di quelle cose colorate arrotondate, mettiamo qualcosa di più interessante dei numeri in quelle div. Prendiamo lo stesso set di colonne e realizziamo una vera dashboard. Usa il seguente CSS:

<head>
    <title></title>
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
    <style>
        body {
            padding-top: 15px;
        }
        .panel-tall .panel-body {
            height: 175px;
        }
        .panel-med .panel-body {
            height: 100px;
        }
        .panel-short .panel-body {
            height: 70px;
        }
    </style>
</head>

Ed ecco il codice "dashboard":

<div class="container-fluid">
    <div class="row">
        <div class="col-xs-6 col-md-3">
            <div class="panel panel-default panel-med">
                <div class="panel-heading">
                    Heading 1
                </div>
                <div class="panel-body">
                    Body 1
                </div>
                <div class="panel-footer">
                    Footer 1
                </div>
            </div>
        </div>
        <div class="col-xs-6 col-md-3 cell-tall">
            <div class="panel panel-danger panel-tall">
                <div class="panel-heading">
                    Heading 2
                </div>
                <div class="panel-body">
                    Body 2. Look out, this needs some attention!
                </div>
                <div class="panel-footer">
                    Footer 2
                </div>
            </div>
        </div>
        <!--
            On small and extra small devices, the viewport will render TWO cells
            (12 / 6 = 2), so we need a clearfix every TWO cells. We also need to
            say "don't show this clearfix when the viewport will render FOUR cells",
            which it will do at medium size and up (12 / 3 = 4). We do that by adding
            hidden-md and hidden-lg to our clearfix div, in effect instructing the
            browser to not show it at all on a wider screen.
        -->
        <div class="clearfix hidden-md hidden-lg"></div>
        <!---->
        <div class="col-xs-6 col-md-3 cell-tall">
            <div class="panel panel-success panel-short">
                <div class="panel-heading">
                    Heading 3
                </div>
                <div class="panel-body">
                    Body 3. The file has successfully uploaded.
                </div>
                <div class="panel-footer">
                    Footer 3
                </div>
            </div>
        </div>
        <div class="col-xs-6 col-md-3">
            <div class="panel panel-default panel-tall">
                <div class="panel-heading">
                    Heading 4 Chart
                </div>
                <div class="panel-body">
                    Body 4. Is this a cool graph or what?
                </div>
                <div class="panel-footer">
                    Footer 4
                </div>
            </div>
        </div>
        <!--
            We are never going to have more than FOUR cells. So every FOURTH cell,
            we place a clearfix that will ALWAYS show. We do this by just leaving off
            any of the hidden-* classes.
        -->
        <div class="clearfix"></div>
        <!---->
        <div class="col-xs-6 col-md-3">
            <div class="panel panel-warning panel-short">
                <div class="panel-heading">
                    Heading 5
                </div>
                <div class="panel-body">
                    Body 5.
                </div>
                <div class="panel-footer">
                    Footer 5
                </div>
            </div>
        </div>
        <div class="col-xs-6 col-md-3 cell-med">
            <div class="panel panel-warning panel-tall">
                <div class="panel-heading">
                    Heading 6
                </div>
                <div class="panel-body">
                    Body 6.
                </div>
            </div>
        </div>
        <!--
            After the sixth cell, we are at a multiple of TWO, but not FOUR so we
            repeat the clearfix that we used after cell TWO.
        -->
        <div class="clearfix hidden-md hidden-lg"></div>
        <!---->
        <div class="col-xs-6 col-md-3">
            <div class="panel panel-info panel-tall">
                <div class="panel-heading">
                    Heading 7
                </div>
                <div class="panel-body">
                    Body 7.
                </div>
                <div class="panel-footer">
                    Footer 7
                </div>
            </div>
        </div>
        <div class="col-xs-6 col-md-3">
            <div class="panel panel-info panel-med">
                <div class="panel-heading">
                    Heading 8
                </div>
                <div class="panel-body">
                    Body 8.
                </div>
                <div class="panel-footer">
                    Footer 8
                </div>
            </div>
        </div>
        <!--
            Now we have rendered EIGHT cells, which is a multiple of TWO AND FOUR,
            so we put in a clearfix that's always visible.
        -->
        <div class="clearfix"></div>
        <!---->
        <div class="col-xs-6 col-md-3 cell-med">
            <div class="panel panel-info panel-short">
                <div class="panel-heading">
                    Heading 9
                </div>
                <div class="panel-body">
                    Body 9.
                </div>
                <div class="panel-footer">
                    Footer 9
                </div>
            </div>
        </div>
        <div class="col-xs-6 col-md-3 cell-med">
            <div class="panel panel-info panel-tall">
                <div class="panel-heading">
                    Heading 10
                </div>
                <div class="panel-body">
                    Body 10.
                </div>
                <div class="panel-footer">
                    Footer 10
                </div>
            </div>
        </div>
        <!--
            After the 10th cell, once again a multiple of TWO but not FOUR...
        -->
        <div class="clearfix hidden-md hidden-lg"></div>
        <!---->
        <div class="col-xs-6 col-md-3">
            <div class="panel panel-info panel-tall">
                <div class="panel-heading">
                    Heading 11
                </div>
                <div class="panel-body">
                    Body 11.
                </div>
                <div class="panel-footer">
                    Footer 11
                </div>
            </div>
        </div>
    </div>
</div>

Quel codice sarà simile a questo: Cruscotto grande E così in finestre più piccole:

Cruscotto piccolo

Dal modo in cui sto usando la classe del panel Bootstrap 3, che andrà via in Bootstrap 4 e sarà sostituita dalla card molto più descrittiva e specifica. Guardando queste immagini, puoi vedere perché la card sarà un nome molto migliore rispetto al panel ambiguo.

2,4,6 Layout con Clearfix

Ecco un layout che esegue il rendering di due, quattro o sei celle a seconda delle dimensioni dello schermo.

<div class="container-fluid">
    <div class="row">
        <div class="col-xs-6 col-md-3 col-lg-2">1</div>
        <div class="col-xs-6 col-md-3 col-lg-2 cell-tall">2</div>
        <!--
            On small and extra small devices, the viewport will render TWO cells
            (12 / 6 = 2), so we need a clearfix every TWO cells. We also need to
            say "don't show this clearfix when the viewport will render FOUR cells",
            which it will do at medium size (12 / 3 = 4). We do that by adding
            hidden-md and hidden-lg to our clearfix div, in effect instructing the
            browser to not show it at all on a wider screen.
        -->
        <div class="clearfix hidden-md hidden-lg"></div>
        <!---->
        <div class="col-xs-6 col-md-3 col-lg-2 cell-tall">3</div>
        <div class="col-xs-6 col-md-3 col-lg-2">4</div>
        <!--
            After the FOURTH cell, we need a clearfix, but it still needs to be
            hidden on LARGE viewports, because remember we will have a maximum of
            SIX cells now.
        -->
        <div class="clearfix hidden-lg"></div>
        <!---->
        <div class="col-xs-6 col-md-3 col-lg-2">5</div>
        <div class="col-xs-6 col-md-3 col-lg-2 cell-med">6</div>
        <!--
            After the SIXTH cell, we need to show on SMALL and LARGE, but not on
            MEDIUM. Remember, our MEDIUM viewport only wants a clearfix when we
            are at a multiple of FOUR.
        -->
        <div class="clearfix hidden-md"></div>
        <!---->
        <div class="col-xs-6 col-md-3 col-lg-2">7</div>
        <div class="col-xs-6 col-md-3 col-lg-2">8</div>
        <!--
            Now we have rendered EIGHT cells, which is a multiple of TWO AND FOUR,
            so we put in a clearfix that's not visible on LARGE, because we are NOT
            at a multiple of SIX.
        -->
        <div class="clearfix hidden-lg"></div>
        <!---->
        <div class="col-xs-6 col-md-3 col-lg-2 cell-med">9</div>
        <div class="col-xs-6 col-md-3 col-lg-2 cell-med">10</div>
        <!--
            After the 10th cell, small only.
        -->
        <div class="clearfix hidden-md hidden-lg"></div>
        <!---->
        <div class="col-xs-6 col-md-3 col-lg-2">11</div>
    </div>
</div>

Schermo grande: 2-4-6 Grandi Schermo medio: 2-4-6 Medio Schermo piccolo: 2-4-6 Piccolo

Perché le colonne Bootstrap superano 12 in una riga?

Esistono molti scenari reattivi in ​​cui è necessario disporre di unità di colonna superiori a 12 in un singolo elemento .row . Questo è noto come avvolgimento di colonne .

Se più di 12 colonne sono posizionate all'interno di una singola riga, ciascun gruppo di colonne aggiuntive, come una unità, verrà inserito in una nuova riga.

Ad esempio, considera un layout dove vogliamo ...

  • 3 colonne su dispositivi di grandi e medie dimensioni e
  • 2 colonne su dispositivi piccoli e piccoli

3 colonne trasversali

2 colonne in più piccole

Per ottenere questo layout in Bootstrap, useremmo (correggere) ..

<div class="row"> 
  <div class="col-xs-6 col-md-4"> x </div> 
  <div class="col-xs-6 col-md-4"> x </div> 
  <div class="col-xs-6 col-md-4"> x </div> 
  <div class="col-xs-6 col-md-4"> x </div> 
  <div class="col-xs-6 col-md-4"> x </div> 
  <div class="col-xs-6 col-md-4"> x </div> 
</div>

Demo del metodo corretto

Come vedi nell'esempio, il totale delle unità di colonna nell'elemento .row supera 12 . Questa tecnica è nota come avvolgimento di colonne ed è una delle funzionalità di progettazione responsive più potenti di Bootstrap. Il layout desiderato non sarebbe possibile (a parte la duplicazione del markup) se avessimo cercato di rimanere con l' equivoco comune che le unità di colonna devono aggiungere fino a 12 in una singola riga .

Il layout non è possibile quando non superiamo 12 (sbagliato) ..

<div class="row"> 
  <div class="col-xs-6 col-md-4"> x </div> 
  <div class="col-xs-6 col-md-4"> x </div> 
</div>
<div class="row"> 
  <div class="col-xs-6 col-md-4"> x </div> 
  <div class="col-xs-6 col-md-4"> x </div> 
</div>
<div class="row"> 
  <div class="col-xs-6 col-md-4"> x </div> 
  <div class="col-xs-6 col-md-4"> x </div> 
</div>

Demo del metodo errato (non riesce 3 colonne trasversali)

Ricorda, un .row non è la stessa di una singola linea attraverso il viewport. A .row è un raggruppamento di colonne. Le colonne che superano 12 unità in un singolo elemento .row si avvolgeranno in una nuova riga (in basso nella vista). Ecco perché è essenziale capire che le 12 colonne rappresentano unità orizzontali attraverso il viewport.

Inoltre, è necessario utilizzare resettaggi reattivi (clearfix) per il wrapping uniforme quando le colonne variano in altezza .



Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow