Comment placer div côte à côte

241

J'ai une div enveloppe principale qui est définie à 100% de largeur. À l'intérieur, j'aimerais avoir deux divisions, une à largeur fixe et l'autre qui remplit le reste de l'espace. Comment faire flotter le deuxième div pour remplir le reste de l'espace. Merci pour toute aide.

markt
la source
2
La prochaine fois, placez également votre exemple de code s'il vous plaît afin que la question devienne plus claire pour les développeurs ici ..
Rob
1
la position: absolue est-elle une option? vous pouvez définir la position sur les côtés du conteneur, et le div prendra la nouvelle taille.
AlexanderMP

Réponses:

363

Il y a plusieurs façons de faire ce que vous demandez:

  1. Utilisation de la propriété CSSfloat :

    <div style="width: 100%; overflow: hidden;">
        <div style="width: 600px; float: left;"> Left </div>
        <div style="margin-left: 620px;"> Right </div>
    </div>
  2. Utilisation de la propriété CSSdisplay - qui peut être utilisée pour faire divs agir comme un table:

    <div style="width: 100%; display: table;">
        <div style="display: table-row">
            <div style="width: 600px; display: table-cell;"> Left </div>
            <div style="display: table-cell;"> Right </div>
        </div>
    </div>

Il existe plus de méthodes, mais ces deux-là sont les plus populaires.

Crozin
la source
17
Solution HTML 5 de @filoxo, utilisez-la à la place
TheMcMurder
1
Ce que le commentateur précédent a dit: envisagez d'ajouter la solution HTML5 par filoxo en tant que # 3.
Ahmed Fasih
2
@TheMcMurder: pour nous qui devons prendre en charge d'anciens navigateurs (par exemple IE <11), ce n'est pas une option.
Oyvind
@Oyvind, vous avez parfaitement raison. Cela dépend de votre cas d'utilisation. Si vous prenez en charge IE 8, 9 ou 10, vous devrez prendre en charge le polyfill, je recommanderais un service comme polyfill.io cdn.polyfill.io/v2/docs ou github.com/10up/flexibility mais vous pouvez avoir une stricte stricte exigences qui empêchent l'utilisation de polyfills.
TheMcMurder
1
qu'est-ce que le débordement: caché faire? n'est-ce pas pour les éléments avec une hauteur spécifiée?
michael
177

CSS3 a introduit des boîtes flexibles (alias. Boîte flexible) qui peuvent également obtenir ce comportement.

Définissez simplement la largeur du premier div, puis donnez au second une flex-growvaleur 1qui lui permettra de remplir la largeur restante du parent.

.container{
    display: flex;
}
.fixed{
    width: 200px;
}
.flex-item{
    flex-grow: 1;
}
<div class="container">
  <div class="fixed"></div>
  <div class="flex-item"></div>
</div>

Démo jsFiddle

Notez que les boîtes flexibles ne sont pas rétrocompatibles avec les anciens navigateurs, mais sont une excellente option pour cibler les navigateurs modernes (voir également Caniuse et MDN ). Un excellent guide complet sur la façon d'utiliser les boîtes flexibles est disponible sur CSS Tricks .

filoxo
la source
5
Il a fallu toute la journée pour trouver une solution et cette réponse l'a résolu! J'ai 4 panneaux côte à côte avec les 3e et 4e panneaux n'ayant parfois rien en eux. Ils vivent tous dans une div contenant avec une frontière autour d'eux. Le flotteur entier: à gauche sur la première situation div m'a laissé un div dépassant la bordure en bas car les étiquettes générées sont dynamiques. Les étiquettes sont des étendues car c'est ainsi qu'ASP les rend. Ne pas avoir le flotteur: gauche n'a fait que 3 des divs sur la même rangée. Et il n'est pas question d'utiliser une table. Je vous remercie!
2015 lumineux
Existe-t-il une méthode rétrocompatible pour utiliser quelque chose comme ça, c'est-à-dire pour nous pauvres sapes qui doivent encore prendre en charge IE 8-10
Ben A. Hilleli
@ BenA.Hilleli qui pourrait dépendre de vos besoins (par exemple, amélioration progressive ou dégradation gracieuse ) mais une recherche rapide a donné ce guide (un peu dépassé) "Comment utiliser flexbox dans le monde réel" ainsi que Flexie.js qui prend en charge IE6-9. Vous pouvez également essayer l'une des autres réponses à cette question car elles permettent d'obtenir la même chose.
filoxo
20

Je ne sais pas grand-chose sur les stratégies de conception HTML et CSS, mais si vous cherchez quelque chose de simple et qui s'adaptera automatiquement à l'écran (comme je le suis), je pense que la solution la plus simple consiste à faire en sorte que les divs se comportent comme des mots dans un paragraphe. Essayez de spécifierdisplay: inline-block

<div style="display: inline-block">
   Content in column A
</div>
<div style="display: inline-block">
   Content in column B
</div>

Vous pourriez ou non avoir besoin de spécifier la largeur des DIVs

Guillermo Ruffino
la source
5
C'est probablement display:flexla meilleure solution, mais je pense qu'elle inline-blockest également excellente car elle fonctionne sur plus de navigateurs. Soit dit en passant, vous devrez peut-être envelopper les deux div avec un <div style="white-space:nowrap">pour éviter la rupture lors du redimensionnement.
John Henckel
C'est une bonne solution pour les modèles. Le seul problème est qu'il pousse un div avec un contenu moindre vers le bas. Comment le pousser vers le haut?
presque un débutant
1
nvm, juste nécessaire pour le rechercher, la solution est: vertical-align: top;
presque un débutant
@JohnHenckel cela signifie que ce n'est pas pour tous les navigateurs, ne pourrait-il pas fonctionner de la même manière pour tous les navigateurs? inline-blockcode.
Kavindu Gayantha
@guillermo ça ne fonctionne pas bien. tous les divs ne sont pas placés côte à côte. pourquoi donc. ce n'est pas clair.
Kavindu Gayantha
14

Vous pouvez utiliser la grille CSS pour y parvenir, ceci est la version longue à des fins d'illustration:

div.container {
    display: grid;
    grid-template-columns: 220px 20px auto;
    grid-template-rows: auto;
}

div.left {
    grid-column-start: 1;
    grid-column-end: 2;
    grid-row-start: row1-start
    grid-row-end: 3;
    background-color: Aqua;
}

div.right {
    grid-column-start: 3;
    grid-column-end: 4;
    grid-row-start: 1;
    grid-row-end; 1;
    background-color: Silver;
}

div.below {
    grid-column-start: 1;
    grid-column-end: 4;
    grid-row-start: 2;
    grid-row-end; 2;
}
<div class="container">
    <div class="left">Left</div>
    <div class="right">Right</div>
    <div class="below">Below</div>
</div>

Ou la méthode plus traditionnelle utilisant le flottant et la marge.

J'ai inclus une couleur d'arrière-plan dans cet exemple pour aider à montrer où les choses se trouvent - et aussi quoi faire avec le contenu sous la zone flottante.

Ne mettez pas vos styles en ligne dans la vraie vie, extrayez-les dans une feuille de style.

div.left {
    width: 200px;
    float: left;
    background-color: Aqua;
}

div.right {
    margin-left: 220px;
    background-color: Silver;
}

div.clear {
    clear: both;
}
    <div class="left"> Left </div>
    <div class="right"> Right </div>
    <div class="clear">Below</div>

<div style="width: 200px; float: left; background-color: Aqua;"> Left </div>
<div style="margin-left: 220px; background-color: Silver;"> Right </div>
<div style="clear: both;">Below</div>
Fenton
la source
2

Donnez au premier div un flotteur à gauche et fixe avec, le deuxième div à 100% de largeur un flotteur à gauche. Cela devrait faire l'affaire. Si vous souhaitez placer des éléments en dessous, vous avez besoin d'un clair: à la fois sur l'élément que vous souhaitez placer en dessous

Rob
la source
2
<div class="container" style="width: 100%;">
    <div class="sidebar" style="width: 200px; float: left;">
        Sidebar
    </div>
    <div class="content" style="margin-left: 202px;">
        content 
    </div>
</div>

Ce sera compatible avec tous les navigateurs. Sans la marge de gauche, vous rencontrerez des problèmes avec le contenu s'exécutant complètement à gauche si votre contenu est plus long que votre barre latérale.

RDL
la source
1

Si vous ne taggez pas IE6, faites flotter le second <div>et donnez-lui une marge égale (ou peut-être un peu plus grande) à la <div>largeur fixe du premier .

HTML:

<div id="main-wrapper">
    <div id="fixed-width"> lorem ipsum </div>
    <div id="rest-of-space"> dolor sit amet </div>
</div>

CSS:

#main-wrapper {
    100%;
    background:red;
}
#fixed-width {
    width:100px;
    float:left
}
#rest-of-space {
    margin-left:101px;
        /* May have to increase depending on borders and margin of the fixd width div*/
    background:blue;
}

La marge tient compte de la possibilité que le «reste d'espace» <div>puisse contenir plus de contenu que la «largeur fixe» <div>.

Ne donnez pas de fond à la largeur fixe; si vous avez besoin de les voir visiblement comme des «colonnes» différentes, utilisez l' astuce Faux colonnes .

Richard JP Le Guen
la source