Recherche…


Introduction

Lors de la création de mises en page avancées, il se peut que vous deviez utiliser plus de 12 unités de colonne dans un seul élément .row . Le concept d' enroulement de colonne et de réinitialisations réactives (AKA clearfixes) est essentiel pour comprendre la conception réactive avec Bootstrap.

Les bases de la grille bootstrap

Remarques

Les grilles Bootstraps sont remarquablement puissantes et élégantes. Cependant, vous devez vous rappeler que le nom du framework est "Bootstrap", pas "WeDidItForYou". Bootstrap permet une conception réactive, elle ne le garantit pas.

Il vous appartient encore de rendre votre conception réellement réactive et de donner à vos utilisateurs la meilleure expérience possible.

La première tentative naïve

Avant de commencer, définissons quelques CSS pour les exemples. Ceci est la head section de notre échantillon. J'utilise toujours border-radius et background-color lorsque je teste, car cela simplifie la visualisation des divisions sans ajouter de taille de bordure susceptible d'affecter la taille des cellules.

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

Avec cela, définissons une grille et regardons les résultats parfaits à toutes les tailles de fenêtre!

Utiliser 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>

À taille de fenêtre moyenne À petite taille

Les deux images précédentes montrent le rendu à des tailles d’écran moyennes et petites. Rappelez-vous que nous obtiendrons QUATRE colonnes sur medium + en raison de col-md-3 et de TWO cellules en raison de col-xs-6 .

Ça a l'air pas mal, non? Je pense que nous avons fini ici! Dit beaucoup de sites naïfs Bootstrap là-bas juste là pour attendre ...

Le problème de la hauteur

Dans notre " exemple naïf ", toutes nos cellules avaient la même hauteur. Le navigateur a volontairement rompu les lignes exactement là où nous le voulions, et tout semblait convenir au monde entier. Jusqu'à ce que la hauteur entre en jeu.

Prenons l'exemple précédent et donnons une certaine hauteur à certaines cellules, peut-être comme vous le verrez sur une page de type tableau de bord.

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

Ici, nous avons ajouté des CSS cell-tall et cell-med que nous avons définis ci-dessus. Cela aura pour effet de modifier la hauteur de certaines cellules. Je me demande comment ça va se passer ...

Les voici à nouveau à des tailles d’écran moyennes et petites: med viewport pas de clearfix petit viewport pas de clearfix

Oh mon dieu, quel bordel. Je ne pense pas que ce soit ce que nous voulions. À taille moyenne-grande, 5 et 6 sont hors de propos et, en quelque sorte, ont fini par commencer une nouvelle ligne. En petite taille, nous avons deux cellules dans la première ligne et quatre dans la deuxième ligne, avec 4, 5 et 6 sur la droite pour les deux tailles d’écran!

Alors, comment pouvons-nous résoudre ce problème?

Clearfix à la rescousse

Une façon d’aider la situation serait certainement d’utiliser plusieurs row :

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

C'est généralement la première chose que les nouveaux Bootstrappers essaient. Il semble logique: « Je veux que quatre cellules dans chaque ligne, donc je vais juste créer une nouvelle row pour chaque 4 col divs ».

Mais ce raisonnement pose problème: Le but de Bootstrap 3 et de la prochaine version 4 est d’être réactif . En plaçant "quatre col d' row ", vous ne réfléchissez pas vraiment.

Une bonne compréhension de la classe CSS clearfix vous aidera à commencer à voir que les div de plusieurs row ont réellement entaché votre compréhension de la façon dont la conception adaptative était censée fonctionner. En bref, vous ne pouvez tout simplement pas savoir combien de col à mettre en row toute façon - le navigateur n’a pas encore rendu votre travail!

Rappelez-vous dans First Things First, nous avons dit que vous devez penser en "inverse of 12"? Sans plus tarder, corrigeons notre problème ici, en utilisant les commentaires directement dans le code pour, espérons-le, éliminer toute confusion. Oui, cela ressemble beaucoup plus au code, mais la plupart des commentaires sont des commentaires.

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

Le clearfix est une classe CSS qui rend un minuscule (presque invisible) div, et son but est de « clairs » les left flotteurs qui ont été utilisés par les col divs.

Le génie est vraiment dans les classes hidden-sm , hidden-md , etc. Ces classes sont placées sur le clearfix div, pas sur le col divs! Cela fait apparaître ou disparaître comme par magie le clearfix du flux de rendu à certaines largeurs de fenêtre d'affichage! Génie!

Bootstrap a un tableau déconcertant de hidden-* et visible-* dans la version 3 et, malheureusement, elles ne sont pas vraiment "l'inverse" les unes des autres. Je trouve donc le plus clair et le plus sûr d'utiliser juste toujours les hidden-* cours sur les clearfixes.

Cela semble changer pour le mieux dans Bootstrap 4, avec des classes telles que hidden-*-up et hidden-*-down (elles se débarrassent visible-* classes visible-* ).

Assez de verbiage, à quoi ça ressemble maintenant? Clearfixed grand Clearfixed small

C'est ce que nous voulons! Dans le grand écran, nous avons toujours QUATRE de travers, dans le petit écran, toujours DEUX à travers. Pas plus d'empiler dans des endroits étranges, et les lacunes sont là où nous nous attendions à ce qu'ils soient.

Un tableau de bord

Assez de ces choses arrondies colorées, mettons quelque chose de plus intéressant que les nombres dans ces div. Prenons le même ensemble de colonnes et créons un tableau de bord réel. Utilisez le CSS suivant:

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

Et voici le code "tableau de bord":

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

Ce code ressemblera à ceci: Tableau de bord med-large Et comme ça dans les petites fenêtres:

Tableau de bord petit

Au fait, j'utilise la classe de panel Bootstrap 3, qui disparaîtra dans Bootstrap 4 et sera remplacée par la card beaucoup plus descriptive et spécifique. En regardant ces images, vous pouvez voir pourquoi la card sera un nom bien meilleur que le panel ambigu.

2,4,6 Disposition avec Clearfixes

Voici une mise en page qui rend deux, quatre ou six cellules en fonction de la taille de l'écran.

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

Grand écran: 2-4-6 Grand Écran moyen: 2-4-6 Medium Petit écran: 2-4-6 petit

Pourquoi les colonnes bootstrap dépasseraient-elles 12 dans une rangée?

Il existe de nombreux scénarios .row lesquels il est nécessaire d'avoir des unités de colonne supérieures à 12 dans un seul élément .row . Ceci est connu sous le nom d' enveloppe de colonne .

Si plus de 12 colonnes sont placées dans une seule ligne, chaque groupe de colonnes supplémentaires sera, comme une seule unité, placé sur une nouvelle ligne.

Par exemple, considérons une disposition où nous voulons ...

  • 3 colonnes sur des périphériques grand et moyen, et
  • 2 colonnes sur petits et petits appareils

3 colonnes sur grand

2 colonnes sur plus petit

Pour obtenir cette mise en page dans Bootstrap, nous utiliserions (correct) ..

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

Démo méthode correcte

Comme vous le voyez dans l'exemple, le total des unités de colonne dans l'élément .row dépasse 12 . Cette technique est connue sous le nom d' encapsulation de colonnes et constitue l'une des fonctions de conception réactives les plus puissantes de Bootstrap. La mise en page désirée ne serait pas possible (autre que la duplication du balisage) si nous tentions de nous en tenir à l’ idée reçue selon laquelle les unités de colonnes doivent ajouter jusqu’à 12 unités dans une seule ligne .

La mise en page n'est pas possible lorsque nous ne dépassons pas 12 (faux) ..

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

Démo de méthode incorrecte (échec de 3 colonnes sur une grande)

N'oubliez pas qu'un .row n'est pas la même chose qu'une seule ligne dans la fenêtre d'affichage. Un .row est un regroupement de colonnes. Les colonnes dépassant 12 unités dans un seul élément .row seront .row à une nouvelle ligne (dans la fenêtre). C'est pourquoi il est essentiel de comprendre que les 12 colonnes représentent des unités horizontales dans la fenêtre d'affichage.

De plus, les réinitialisations réactives (clearfix) doivent être utilisées pour un emballage uniforme lorsque la hauteur des colonnes varie .



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow