CSS deux divs côte à côte

230

Je veux mettre deux <div>s côte à côte. La droite <div>est d'environ 200 pixels; et la gauche <div>doit remplir le reste de la largeur de l'écran? Comment puis-je faire ceci?

Martijn
la source

Réponses:

421

Vous pouvez utiliser flexbox pour disposer vos articles:

#parent {
  display: flex;
}
#narrow {
  width: 200px;
  background: lightblue;
  /* Just so it's visible */
}
#wide {
  flex: 1;
  /* Grow to rest of container */
  background: lightgreen;
  /* Just so it's visible */
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>

Il s'agit simplement de gratter la surface de la flexbox. Flexbox peut faire des choses assez étonnantes.


Pour une prise en charge de navigateur plus ancienne, vous pouvez utiliser CSS float et une propriété width pour le résoudre.

#narrow {
  float: right;
  width: 200px;
  background: lightblue;
}
#wide {
  float: left;
  width: calc(100% - 200px);
  background: lightgreen;
}
<div id="parent">
  <div id="wide">Wide (rest of width)</div>
  <div id="narrow">Narrow (200px)</div>
</div>

MN
la source
14
C'est en fait la bonne réponse, elle est concise et, contrairement aux deux actuellement au-dessus, elle est complètement autonome. Les meilleures réponses sur SO devraient être comme ça, OMI. +1
Bobby Jack
Vous voulez expliquer pourquoi la gauche doit être float:left? Votre commentaire à ma réponse dit que "la div lft est requise pour couvrir toute la zone gauche", mais le float:leftfera envelopper le contenu étroitement.
falstro
14
Cette réponse n'est pas tout à fait correcte et il est plutôt bouleversant de la voir tant voter. Cela crée une mise en page très instable. Je conseillerais de mettre les deux divs dans un conteneur et d'utiliser la propriété display: inline-block afin d'aligner les divs, comme l'ont suggéré certaines des autres réponses. Je ne critique personne, car nous sommes tous ici pour nous entraider, donc à côté de ma sélection, merci MN pour vos contributions à cette communauté.
Mussser
1
MAIS une chose à noter est que le blocage en ligne ne fonctionnera pas dans les anciennes versions d'IE ...
Mussser
3
@Mussser Je suis d'accord avec votre commentaire mais gardez à l'esprit que cette réponse vient de 2009 ... une époque où ce que vous appelez "les anciennes versions de Ie" (ie: IE8 et moins) étaient des versions "actuelles" d'IE ...
Laurent S.
139

Je ne sais pas si c'est toujours un problème actuel ou non, mais je viens de rencontrer le même problème et j'ai utilisé la display: inline-block;balise CSS . Envelopper ces derniers dans un div afin qu'ils puissent être positionnés de manière appropriée.

<div>
    <div style="display: inline-block;">Content1</div>
    <div style="display: inline-block;">Content2</div>
</div>

Notez que l'utilisation de l'attribut de style en ligne n'a été utilisée que pour la brièveté de cet exemple, bien sûr, ceux-ci ont été déplacés vers un fichier CSS externe.

russholio
la source
1
C'était la solution pour moi. Je voulais deux div adjacentes comme [] [] (mec ça fait un moment que je n'ai pas fait ça ..) =) bravo.
Partack
Celui-ci a également fonctionné pour moi. J'ai eu quelques problèmes avec un autre flottant: div à droite poussant ma div à droite en dessous de celle de gauche, j'ai donc également fait l'affichage du conteneur: inline-block, et cela l'a résolu.
Martin Carney
5
Cela ne fonctionne pas lorsque le contenu est volumineux dans Content1 DIV. Le résultat est que les DIV sont sur deux lignes distinctes au lieu d'être côte à côte.
Richard Hollis
@RichardHollis J'ai pu définir la widthpropriété de tous mes 2 divs côte à côte pour éviter de placer le second sur une nouvelle ligne.
Trindaz
1
ajoutez le css vertical-align: top; aux deux aussi, sinon ils se repousseront si la longueur du contenu diffère
prospecteur
27

Malheureusement, ce n'est pas une chose triviale à résoudre pour le cas général. La chose la plus simple serait d'ajouter une propriété de style css "float: right;" à votre div 200px, cependant, cela entraînerait également que votre division "principale" soit réellement pleine largeur et tout texte là-bas flotterait autour du bord de la division 200px, ce qui semble souvent bizarre, selon le contenu (à peu près dans tous les cas sauf si c'est une image flottante).

EDIT: Comme suggéré par Dom, le problème d'emballage pourrait bien sûr être résolu avec une marge. Que je suis bête.

falstro
la source
1
'float: left' sera plus approprié, le div gauche est requis sur toute la zone gauche. Aucune infraction signifiait, il suffit de considérer.
MN
19

La méthode suggérée par @roe et @MohitNanda fonctionne, mais si le bon div est défini comme float:right;, alors il doit venir en premier dans la source HTML. Cela rompt l'ordre de lecture de gauche à droite, ce qui peut prêter à confusion si la page est affichée avec les styles désactivés. Si tel est le cas, il pourrait être préférable d'utiliser un div wrapper et un positionnement absolu:

<div id="wrap" style="position:relative;">
    <div id="left" style="margin-right:201px;border:1px solid red;">left</div>
    <div id="right" style="position:absolute;width:200px;right:0;top:0;border:1px solid blue;">right</div>
</div>

Démontré:

gauche droite

Edit: Hmm, intéressant. La fenêtre d'aperçu affiche les divs correctement formatés, mais pas l'élément de publication rendu. Désolé alors, vous devrez l'essayer par vous-même.

David Hanak
la source
15

J'ai rencontré ce problème aujourd'hui. Sur la base des solutions ci-dessus, cela a fonctionné pour moi:

<div style="width:100%;"> 
    <div style="float:left;">Content left div</div> 
    <div style="float:right;">Content right div</div> 
</div> 

Faites simplement diviser le parent sur toute la largeur et faire flotter les div contenus.

Wickyd
la source
8

METTRE À JOUR

Si vous devez placer des éléments sur une ligne, vous pouvez utiliser Flex Layout . Voici un autre tutoriel Flex . C'est un excellent outil CSS et même s'il n'est pas compatible à 100%, chaque jour son support s'améliore. Cela fonctionne aussi simplement que:

HTML

<div class="container">
    <div class="contentA"></div>
    <div class="contentB"></div>
</div>

CSS

.container {
    display: flex;
    width: 100%;
    height: 200px;
}

.contentA {
    flex: 1;
}

.contentB {
    flex: 3;
}

Et ce que vous obtenez ici est un conteneur d'une taille totale de 4 unités, qui partage l'espace avec ses enfants dans une relation de 1/4 et 3/4.

J'ai fait un exemple dans CodePen qui résout votre problème. J'espère que ça aide.

http://codepen.io/timbergus/pen/aOoQLR?editors=110

TRÈS VIEUX

C'est peut-être juste un non-sens, mais avez-vous essayé avec une table? Il n'utilise pas directement CSS pour positionner les divs, mais cela fonctionne très bien.

Vous pouvez créer une table 1x2 et mettre votre divsintérieur, puis mettre en forme la table avec CSS pour les mettre comme vous le souhaitez:

<table>
  <tr>
    <td>
      <div></div>
    </td>
    <td>
      <div></div>
    </td>
  </tr>
</table>

Remarque

Si vous voulez éviter d'utiliser le tableau, comme dit précédemment, vous pouvez utiliser float: left;et float: right;et dans l'élément suivant, n'oubliez pas d'ajouter un clear: left;, clear: right;ou clear: both;afin d'avoir la position nettoyée.

Timbergus
la source
Les tableaux sont une solution beaucoup plus prévisible que le "float" en constante évolution qui semble toujours gâcher quelque chose lorsque vous ajoutez ou supprimez des éléments.
Kokodoko
C'est une bonne solution si vous travaillez avec des e-mails.
Zac Clancy
6
div1 {
    float: right;
} 
div2 {
    float: left;
}

Cela fonctionnera bien tant que vous définissez clear: bothl'élément qui sépare ce bloc de deux colonnes.

ccpizza
la source
3
Lorsque vous utilisez des flottants, vous devez définir la propriété width. Donc je ne pense pas que ce soit une bonne solution ..
Martijn
4

J'ai rencontré le même problème et la version Mohits fonctionne. Si vous souhaitez conserver votre ordre gauche-droite dans le html, essayez simplement ceci. Dans mon cas, le div gauche ajuste la taille, le div droit reste à la largeur 260px.

HTML

<div class="box">
<div class="left">Hello</div>
<div class="right">World</div>
</div>

CSS

.box {
    height: 200px;
    padding-right: 260px;
}    

.box .left {
    float: left;
    height: 200px;
    width: 100%;
}

.box .right {
    height: 200px;
    width: 260px;
    margin-right: -260px;
}

L'astuce consiste à utiliser un remplissage à droite sur la boîte principale, mais à utiliser à nouveau cet espace en plaçant à nouveau la boîte de droite avec marge-droite.

andreas
la source
Je ne fais pas fonctionner ça sans flotteur: en plein.
Jussi Palo
3

J'utilise un mélange de float et overflow-x: hidden. Code minimal, fonctionne toujours.

https://jsfiddle.net/9934sc4d/4/ - PLUS vous n'avez pas besoin d'effacer votre flotteur!

.left-half{
    width:200px;
    float:left;
}
.right-half{
    overflow-x:hidden;
}
Tony Ray Tansley
la source
1
Est utile lorsque vous connaissez la hauteur de la div et que vous savez que le contenu n'est pas plus long que cette hauteur. Cependant, quand il y a plus de contenu que la hauteur du div, il est caché, à cause du débordement ...
Martijn
1
C'est mieux en effet :)
Martijn
1
Agréable! bon de voir les gens se nourrir avec des commentaires utiles et positifs, plutôt que des commentaires négatifs non constructifs. Good man @Martijn
Tony Ray Tansley
Merci pour ça. Je fais la plupart de mon travail d'interface utilisateur dans React Native et Flex Box fonctionne tellement mieux là-bas qu'en HTML + CSS (à mon avis). Cela m'a beaucoup facilité la vie.
Eric Wiener
2

Comme tout le monde l'a souligné, vous le ferez en définissant un float:right;sur le contenu RHS et une marge négative sur le LHS.

Cependant .. si vous n'utilisez pas un float: left;sur le LHS (comme Mohit le fait), vous obtiendrez un effet de progression car le div LHS va toujours consommer l'espace marginal dans la mise en page.

Cependant .. le flottant LHS rétrécira le contenu, vous devrez donc insérer un nœud enfant de largeur définie si ce n'est pas acceptable, à quel moment vous pourriez aussi bien avoir défini la largeur sur le parent.

Cependant .. comme le souligne David, vous pouvez modifier l'ordre de lecture du balisage pour éviter l'exigence de flotteur LHS, mais cela présente des problèmes de lisibilité et éventuellement d'accessibilité.

Cependant .. ce problème peut être résolu avec des flotteurs étant donné un balisage supplémentaire

(mise en garde: je n'approuve pas la division .clearing dans cet exemple, voir ici pour plus de détails)

Tout bien considéré, je pense que la plupart d'entre nous souhaiteraient qu'il y ait une largeur non gourmande: rester dans CSS3 ...

annakata
la source
2

Ce ne sera pas la réponse pour tout le monde, car il n'est pas pris en charge dans IE7-, mais vous pouvez l'utiliser et utiliser une autre réponse pour IE7-. Il s'agit de display: table, display: table-row et display: table-cell. Notez que cela n'utilise pas de tableaux pour la mise en page, mais le style divs afin que les choses s'alignent bien avec tous les tracas d'en haut. Le mien est une application html5, donc cela fonctionne très bien.

Cet article montre un exemple: http://www.sitepoint.com/table-based-layout-is-the-next-big-thing/

Voici à quoi ressemblera votre feuille de style:

 .container {
    display: table;
    width:100%;
 }

 .left-column {
    display: table-cell;
 }

 .right-column {
    display: table-cell;
    width: 200px;
 }
dwaz
la source
-1

Pour paraphraser un de mes sites Web qui fait quelque chose de similaire:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
 <head>
  <style TYPE="text/css"><!--

.section {
    _float: right; 
    margin-right: 210px;
    _margin-right: 10px;
    _width: expression( (document.body.clientWidth - 250) + "px");
}

.navbar {
    margin: 10px 0;
    float: right;
    width: 200px;
    padding: 9pt 0;
}

  --></style>
 </head>
 <body>
  <div class="navbar">
  This will take up the right hand side
  </div>
  <div class="section">
  This will fill go to the left of the "navbar" div
  </div>
 </body>
</html>
Rowland Shaw
la source
4
Pas moi, mais je suppose que les hacks CSS, le doctype transitionnel ou le manque d'explication?
annakata
Au moins, il avait un doctype :) Je suppose que ce pourrait être des gens qui n'aiment pas les hacks du navigateur pour les marges sur IE. Au moins, je l'avais testé ...
Rowland Shaw
C'est trop hacky. Il existe de nombreuses solutions qui sont beaucoup plus concises.
John Bell
@JohnBell c'est peut-être le problème du temps - c'était une solution raisonnable à l'époque (il y a plus de 8 ans), mais la technologie du navigateur a évolué depuis. Bizarrement, certaines des autres réponses contemporaines avec la mienne qui proposent la même idée ont obtenu de meilleurs résultats (comme celle de David, deux minutes après la mienne)
Rowland Shaw
-7

utilisez simplement un z-index et tout ira bien. assurez-vous d'avoir des positions marquées comme fixes ou absolues. alors rien ne bougera comme avec une balise flottante.

Gingembre
la source