251 votes

Bootstrap 3 deux colonnes pleine hauteur

J'essaie de faire une page à deux colonnes. pleine hauteur avec Twitter Bootstrap 3. Il semble que Twitter Bootstrap 3 ne prend pas en charge les mises en page pleine hauteur. Ce que je veux faire :

  +-------------------------------------------------+
  |                     Header                      |
  +------------+------------------------------------+
  |            |                                    |
  |            |                                    |
  |Navigation  |         Content                    |
  |            |                                    |
  |            |                                    |
  |            |                                    |
  |            |                                    |
  |            |                                    |
  |            |                                    |
  +------------+------------------------------------+

Si le contenu se développe, le nav devrait également croître.

  • La hauteur de 100% pour chaque parent ne fonctionne pas car il y a le cas où le contenu est d'une seule ligne.
  • position: absolute semble être le mauvais chemin.
  • display: table et display: table-cell résout le problème, mais pas de manière élégante.
HTML :
    <div class="container">
      <div class="row">
        <div class="col-md-3"></div>
        <div class="col-md-9"></div>
      </div>
    </div>

Y a-t-il un moyen de le faire avec les valeurs par défaut Twitter Bootstrap 3 classes ?

0 votes

L'élément de navigation + contenu doit-il couvrir la hauteur restante du viewport (écran) ?

0 votes

Oui. Juste pour clarifier : en-tête + contenu = 100% de la fenêtre d'affichage, si la hauteur du contenu <= hauteur de la fenêtre d'affichage moins la hauteur de l'en-tête. désolé pour le mauvais anglais

0 votes

Je ne comprends pas, ne pouvez-vous pas simplement donner l'arrière-plan au .row et permettre au col-md-9 de couvrir la partie ou vice-versa ? Pourquoi ne pas donner à la rangée une hauteur de 100%, donner à la nav une hauteur de 100% et permettre à la col-md-9 de croître dynamiquement ?

223voto

Danield Points 17720

Edit : Sur Bootstrap 4 classes natives peut produisent des colonnes pleine hauteur ( DEMO ) parce qu'ils ont changé leur système de grille à flexbox. (Lire la suite pour Bootstrap 3)


Les classes natives de Bootstrap 3.0 ne prennent pas en charge la mise en page que vous décrivez, mais nous pouvons intégrer des feuilles de style CSS personnalisées qui utilisent les éléments suivants Tableaux css pour y parvenir.

Démonstration de Bootply / Codepen

Markup :

<header>Header</header>
<div class="container">
    <div class="row">
        <div class="col-md-3 no-float">Navigation</div>
        <div class="col-md-9 no-float">Content</div>
    </div>
</div>

(Pertinent) CSS

html,body,.container {
    height:100%;
}
.container {
    display:table;
    width: 100%;
    margin-top: -50px;
    padding: 50px 0 0 0; /*set left/right padding according to needs*/
    box-sizing: border-box;
}

.row {
    height: 100%;
    display: table-row;
}

.row .no-float {
  display: table-cell;
  float: none;
}

Le code ci-dessus permettra d'obtenir colonnes pleine hauteur (en raison des propriétés css-table personnalisées que nous avons ajoutées) et avec rapport 1:3 (Navigation:Content) pour largeurs d'écran moyennes et plus - (en raison des classes par défaut de bootstrap : col-md-3 et col-md-9)

NB :

1) Afin de ne pas perturber les classes de colonnes natives de bootstrap, nous ajoutons une autre classe telle que no-float dans le balisage et ne mettre que display:table-cell et float:none sur cette classe (plutôt que sur les classes de colonnes elles-mêmes).

2) Si nous ne voulons utiliser le code css-table que pour un point de rupture spécifique (disons les largeurs d'écran moyennes et supérieures) mais que pour les écrans mobiles nous voulons revenir au comportement habituel de bootstrap, nous pouvons envelopper notre CSS personnalisé dans une requête média, par exemple :

@media (min-width: 992px) {
  .row .no-float {
      display: table-cell;
      float: none;
  }
}

Démonstration du Codepen

Désormais, pour les écrans plus petits, les colonnes se comporteront comme les colonnes bootstrap par défaut (chacune obtenant une largeur complète).

3) Si le rapport 1:3 est nécessaire pour toutes les largeurs d'écran, il est probablement préférable de supprimer les classes col-md-* de bootstrap du balisage, car elles ne sont pas destinées à être utilisées de cette manière.

Démonstration du Codepen

0 votes

Hm. Ce n'est pas vraiment ce que je cherche, peut-être y a-t-il une solution avec les classes natives de bootstrap 3 ? Merci quand même !

7 votes

Cela fonctionne pour moi après avoir ajouté float : none ; aux colonnes, mais sur js ce n'est pas nécessaire. Pourquoi ? Mises à jour : @media - cause

0 votes

2 choses mineures. 1) l'en-tête et la navigation de gauche ne collent pas (mais peut-être que cela convient à l'OP) 2) Que faire si l'en-tête change ? (encore une fois, peut-être que cela convient au PO)

70voto

Oswaldo Acauan Points 1723

Vous pouvez réaliser ce que vous voulez avec le padding-bottom: 100%; margin-bottom: -100%; astuce, a vous pouvez voir dans ce violon.

Je change un peu votre HTML, mais vous pouvez obtenir le même résultat avec votre propre HTML avec le code suivant

.col-md-9 {
    overflow: hidden;
}

.col-md-3 {
    padding-bottom: 100%;
    margin-bottom: -100%;
}

0 votes

Ok. Je vais mettre à jour la question. J'ai une page dynamique (col-md-9 peut grandir), donc, votre variante ne devrait pas fonctionner, mais je vais la tester. Merci

0 votes

Ce n'est pas ce que je veux dire dans ma question. Je veux des colonnes de pleine hauteur, dans le cas où col-md-9 ont une ligne de texte hauteur tout de même devrait être de 100% - hauteur de l'en-tête ou simple 100%. J'ai essayé cette astuce, mais seulement avec des valeurs comme 10000px, -10000px. Mais merci pour votre réponse.

0 votes

Mes colonnes étaient hautes, j'ai donc dû modifier padding-bottom : 10000% ; margin-bottom : -10000% ; et ça a marché. Sinon, je suppose que le pourcentage de 100 % est lié à la hauteur de la page.

37voto

avrahamcool Points 4651

Solution purement CSS

Violon de travail

Utilisation de CSS2.1 uniquement, fonctionne avec tous les navigateurs (IE8+), sans spécifier de hauteur ou de largeur.

Cela signifie que si votre en-tête s'allonge soudainement, ou si votre navigation de gauche doit être élargie, vous n'avez pas besoin d'y remédier. tout ce qui est dans votre CSS.

Totalement réactif, simple et clair et très facile à gérer.

<div class="Container">
    <div class="Header">
    </div>
    <div class="HeightTaker">
        <div class="Wrapper">
            <div class="LeftNavigation">
            </div>
            <div class="Content">
            </div>
        </div>
    </div>
</div>

Explication : Le conteneur div prend 100% de la hauteur du corps, et il est divisé en 2 sections. La section de l'en-tête s'étendra à la hauteur nécessaire, et la section de la HeightTaker se chargera du reste. Comment cela est-il possible ? En faisant flotter un élément vide à côté du conteneur avec une hauteur de 100% (en utilisant :before ), et en donnant le HeightTaker un élément vide à la fin avec la règle claire (en utilisant :after ). cet élément ne peut pas être dans la même ligne que l'élément flottant, donc il est poussé jusqu'à la fin. qui est exactement le 100% du document.

Avec cela, nous faisons le HeightTaker s'étendent sur le reste de la hauteur du conteneur, sans indiquer de hauteur/ marge spécifique.

à l'intérieur de ce HeightTaker nous construisons une mise en page flottante normale (pour obtenir un affichage de type colonne) avec une modification mineure. nous avons une Wrapper qui est nécessaire pour l'élément 100% hauteur pour travailler.

Mise à jour

Voici la Démo avec les classes Bootstrap. (J'ai juste ajouté un div à votre mise en page)

0 votes

Oui, c'est la solution la plus belle. Pourriez-vous le faire pour les classes bootstrap ?

0 votes

Et s'il vous plaît, expliquez, comment il fonctionne. actuellement, il est plus approprié d'approuver

0 votes

Je ne connais pas bootstrap désolé. mais c'est si facile à utiliser vous pouvez le faire vous-même. Je vais ajouter une explication de son fonctionnement.

26voto

AndreDurao Points 1121

J'ai pensé à un changement subtil, qui ne change pas le comportement par défaut du bootstrap. Et je peux l'utiliser uniquement lorsque j'en ai besoin :

.table-container {
  display: table;
}

.table-container .table-row {
  height: 100%;
  display: table-row;
}

.table-container .table-row .table-col {
  display: table-cell;
  float: none;
  vertical-align: top;
}

pour que je puisse l'utiliser comme ça :

<div class="container table-container">
  <div class="row table-row">
    <div class="col-lg-4 table-col"> ... </div>
    <div class="col-lg-4 table-col"> ... </div>
    <div class="col-lg-4 table-col"> ... </div>
  </div>
</div>

0 votes

Cela a fonctionné à merveille pour moi (avec bootstrap 3).

0 votes

Je n'ai pas réussi à faire fonctionner l'une des solutions ci-dessus, vertical-align a été la clé pour moi.

9voto

Oriol Points 421

À ma connaissance, vous pouvez utiliser jusqu'à 5 méthodes pour y parvenir :

  1. Utiliser les propriétés CSS display table/table-cell ou utiliser des tableaux réels.
  2. Utilisation d'un élément à positionnement absolu à l'intérieur du wrapper.
  3. en utilisant la propriété d'affichage Flexbox, mais, à ce jour, il a encore soutien partiel
  4. Simulez la hauteur totale des colonnes en utilisant la fonction technique de la fausse colonne .
  5. En utilisant la technique du padding/margin. Voir exemple .

Bootstrap : Je n'ai pas beaucoup d'expérience avec lui mais je ne pense pas qu'il fournisse des styles pour cela.

.row
{
    overflow: hidden;
    height: 100%;
}
.row .col-md-3,
.row .col-md-9 
{
    padding: 30px 3.15% 99999px; 
    float: left;
    margin-bottom: -99999px;
}
.row .col-md-3 p,
.row .col-md-9 p 
{
    margin-bottom: 30px;
}
.col-md-3
{
    background: pink;
    left:0;
    width:25%
}
.col-md-9
{
    width: 75%;
    background: yellow;
}

0 votes

Merci, @Oriol. Tu es génial. Quelques points : 1),2) oui, mais pas ce que je veux 3) C'est une solution, mais seulement pour ff moderne et chrome. safari supporte une ancienne version de flexbox 4) pas les classes bootstrap 5) Les colonnes de droite peuvent s'agrandir. Donc overflow : hidden va rogner une ligne importante. Ce n'est pas cool :) Je vais essayer votre code

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X