Diviser la division en 2 colonnes à l'aide de CSS

89

J'ai essayé de diviser un div en deux colonnes en utilisant CSS, mais je n'ai pas encore réussi à le faire fonctionner. Ma structure de base est la suivante:

<div id="content">
  <div id="left">
     <div id="object1"></div>
     <div id="object2"></div>
  </div>

  <div id="right">
     <div id="object3"></div>
     <div id="object4"></div>
  </div>
</div>

Si j'essaie de faire flotter les divs droite et gauche à leurs positions respectives (droite et gauche), il semble ignorer la couleur d'arrière-plan du div contenu. Et d'autres codes que j'ai essayés à partir de divers sites Web ne semblent pas pouvoir se traduire dans ma structure.

Merci pour toute aide!

PF1
la source
2
Il y a tellement de solutions, vous pouvez voir ceci: stackoverflow.com/questions/211383/…
enmaai

Réponses:

60

Lorsque vous faites flotter ces deux divs, la div de contenu se réduit à une hauteur nulle. Il suffit d'ajouter

<br style="clear:both;"/>

après le #right div mais à l'intérieur du content div. Cela forcera la division de contenu à entourer les deux div internes flottants.

Barrage Rob Van
la source
16
Il est malheureux que cela ait été voté autant de fois. Vous devriez vraiment éviter les balisages superflus, d'autant plus qu'il existe d'autres remèdes viables et largement utilisés.
Jbird
89

Cela fonctionne bien pour moi. J'ai divisé l'écran en deux moitiés: 20% et 80%:

<div style="width: 20%; float:left">
   #left content in here
</div>

<div style="width: 80%; float:right">
   #right content in there
</div>
Navish
la source
3
Si c'est tout ce que vous faites, le parent de ces éléments n'aura pas de hauteur.
tybro0103
Facile et efficace. Je vous remercie!
Alexis Gamarra
47

Une autre façon de procéder consiste à ajouter overflow:hidden;à l'élément parent des éléments flottants.

overflow: hidden fera grossir l'élément pour s'adapter aux éléments flottants.

De cette façon, tout peut être fait en css plutôt que d'ajouter un autre élément html.

tybro0103
la source
1
J'encourage les lecteurs à consulter également mon autre réponse. Je pense que c'est en fait mieux que celui-ci.
tybro0103
1
encore une note: overflow:auto;peut parfois être une meilleure option
tybro0103
C'est certainement un moyen efficace. Cependant, il convient de mentionner que cela peut créer des problèmes de mise en page évidents. Par exemple, si je veux que le débordement de mon élément parent soit visible.
Jbird
16

La manière la plus flexible de procéder:

#content::after {
  display:block;
  content:"";
  clear:both;
}

Cela revient exactement à ajouter l'élément à #content:

<br style="clear:both;"/>

mais sans ajouter réellement d'élément. :: after est appelé un pseudo élément. La seule raison pour laquelle cela est meilleur que l'ajout overflow:hidden;à #content est que vous pouvez avoir des éléments enfants positionnés en absolu débordant et être toujours visibles. En outre, cela permettra à la boîte-ombre d'être toujours visible.

tybro0103
la source
C'est également une excellente solution, mais il convient de mentionner ici que cela ne fonctionne pas dans IE8. Ça me fait vraiment mal d'être le seul à dire ça et je m'excuse d'être "ce type".
Jbird
@Jbird try #content:after(juste un deux-points au lieu de deux) ... Si je me souviens bien, il est plus approprié d'utiliser deux points-points pour les pseudo éléments, mais les IE plus anciens ne le reconnaissent que s'il en a un. ... ou quelque chose comme ça - cela fait un certain temps que je n'ai pas traité de cette question.
tybro0103
10

Aucune des réponses données ne répond à la question initiale.

La question est de savoir comment séparer un div en 2 colonnes en utilisant css.

Toutes les réponses ci-dessus incorporent en fait 2 divs dans un seul div afin de simuler 2 colonnes. C'est une mauvaise idée car vous ne pourrez pas diffuser de contenu dans les 2 colonnes de manière dynamique.

Donc, au lieu de ce qui précède, utilisez un seul div défini pour contenir 2 colonnes en utilisant CSS comme suit ...

.two-column-div {
 column-count: 2;
}

assignez ce qui précède en tant que classe à un div, et il diffusera en fait son contenu dans les 2 colonnes. Vous pouvez aller plus loin et définir également les écarts entre les marges. En fonction du contenu de la div, vous devrez peut-être modifier les valeurs de saut de mot pour que votre contenu ne soit pas coupé entre les colonnes.

Rodney P. Barbati
la source
9

Pour une raison quelconque, je n'ai jamais aimé les approches de compensation, je compte sur des flotteurs et des largeurs en pourcentage pour des choses comme celle-ci.

Voici quelque chose qui fonctionne dans des cas simples:

#content { 
  overflow:auto; 
  width: 600px; 
  background: gray; 
} 

#left, #right { 
  width: 40%; 
  margin:5px; 
  padding: 1em; 
  background: white; 
} 

#left  { float:left;  }
#right { float:right; } 

Si vous mettez du contenu, vous verrez que cela fonctionne:

<div id="content">
  <div id="left">
     <div id="object1">some stuff</div>
     <div id="object2">some more stuff</div>
  </div>

  <div id="right">
     <div id="object3">unas cosas</div>
     <div id="object4">mas cosas para ti</div>
  </div>
</div>

Vous pouvez le voir ici: http://cssdesk.com/d64uy


la source
8

Faites des divs enfants inline-blocket ils se positionneront côte à côte:

#content {
   width: 500px;
   height: 500px;
}

#left, #right {
    display: inline-block;
    width: 45%;
    height: 100%;
}

Voir la démo

Oriol
la source
Je préfère également cette méthode au flotteur. Parfois besoin de définir un: vertical-align: top; (ou en bas, etc.) sur les éléments gauche et droit s'ils ne sont pas de la même taille.
james
4

Je sais que cet article est ancien, mais si l'un d'entre vous est toujours à la recherche d'une solution plus simple.

#container .left,
#container .right {
    display: inline-block;
}

#container .left {
    width: 20%;
    float: left;
}
#container .right {
    width: 80%;
    float: right;
}
Dexter
la source
3

Meilleur moyen de diviser un div verticalement -

#parent {
    margin: 0;
    width: 100%;
}
.left {
    float: left;
    width: 60%;
}
.right {
    overflow: hidden;
    width: 40%;
}
UberNeo
la source
3

Vous pouvez utiliser flexbox pour contrôler la disposition de votre élément div:

* { box-sizing: border-box; }

#content {
  background-color: rgba(210, 210, 210, 0.5);
  border: 1px solid #000;
  padding: 0.5rem;
  display: flex;
}

#left,
#right {
  background-color: rgba(10, 10, 10, 0.5);
  border: 1px solid #fff;
  padding: 0.5rem;
  flex-grow: 1;
  color: #fff;
}
<div id="content">
  <div id="left">
     <div id="object1">lorem ipsum</div>
     <div id="object2">dolor site amet</div>
  </div>

  <div id="right">
     <div id="object3">lorem ipsum</div>
     <div id="object4">dolor site amet</div>
  </div>
</div>

Mohammad Usman
la source
1
Sur un milliard de tentatives similaires, je trouve que cela a fonctionné (jusqu'à présent) The Best. Tous les autres que j'ai trouvés (et essayés) laissent le contenu déborder . Merci beaucoup.
user12379095
1

Les flotteurs n'affectent pas le débit. J'ai tendance à ajouter un

<p class="extro" style="clear: both">possibly some content</p>

à la fin du 'wrapping div' (dans ce cas, le contenu). Je peux justifier cela sur une base sémantique en disant qu'un tel paragraphe pourrait être nécessaire. Une autre approche consiste à utiliser un CSS clearfix:

#content:after {
  content: ".";
  display: block;
  height: 0;
  clear: both;
  visibility: hidden;
}

#content {
  display: inline-block;
}
/*  \*/
* html #content {
  height: 1%;
}

#content {
  display: block;
}
/*  */

La supercherie avec les commentaires concerne la compatibilité entre navigateurs.

Gazzer
la source
0

La meilleure réponse à cette question est ici Question 211383

De nos jours, toute personne qui se respecte devrait utiliser l'approche dite «micro-clearfix» de défrichage des flotteurs.

Jbird
la source
0
  1. Rendre la taille de la police égale à zéro dans la DIV parent.
  2. Définissez le pourcentage de largeur pour chacun des DIV enfants.

    #content {
        font-size: 0;
    }
    
    #content > div {
        font-size: 16px;
        width: 50%;
    }

* Dans Safari, vous devrez peut-être définir 49% pour que cela fonctionne.

Berezh
la source
Bien que cet extrait de code puisse résoudre la question, inclure une explication contribue vraiment à améliorer la qualité de votre message. N'oubliez pas que vous répondez à la question aux lecteurs à l'avenir, et que ces personnes pourraient ne pas connaître les raisons de votre suggestion de code.
msrd0
0

Diviser une division en deux colonnes est très simple, il suffit de spécifier la largeur de votre colonne mieux si vous mettez ceci (comme width: 50%) et définissez le float: left pour la colonne de gauche et float: right pour la colonne de droite.

Rashid Jorvee
la source
Veuillez ajouter des informations supplémentaires avec des balises pertinentes.
Aman Garg
j'espère que ce code vous aidera à mieux comprendre cela; @AmanGarg CSS: #column { overflow:auto; width: 100%; } #column50pleft, #column50pright{ width: 49%; margin:2px; padding: 0.5%; background: white; } #column50pleft { float:left; } #column50pright { float:right; } HTML: <div id="column"> <div id="column50pleft"> </div> <div id="column50pright"> </div> </div>
Rashid Jorvee