Comment placer deux div à côté de l'autre?

370

Considérez le code suivant :

#wrapper {
    width: 500px;
    border: 1px solid black;
}
#first {
    width: 300px;
    border: 1px solid red;
}
#second {
    border: 1px solid green;
}
<div id="wrapper">
    <div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>

Je voudrais que les deux divs soient côte à côte à l'intérieur du div wrapper. Dans ce cas, la hauteur du div vert doit déterminer la hauteur de l'emballage.

Comment pourrais-je y parvenir via CSS?

Misha Moroshko
la source
15
#wrapper { display: flex; }
icl7126
Copie possible de CSS deux divisions côte à côte
Alexander

Réponses:

447

Faites flotter une ou les deux divisions internes.

Floating one div:

#wrapper {
    width: 500px;
    border: 1px solid black;
    overflow: hidden; /* will contain if #first is longer than #second */
}
#first {
    width: 300px;
    float:left; /* add this */
    border: 1px solid red;
}
#second {
    border: 1px solid green;
    overflow: hidden; /* if you don't want #second to wrap below #first */
}

ou si vous flottez les deux, vous devrez encourager le div wrapper à contenir les deux enfants flottants, ou il pensera qu'il est vide et ne mettra pas la bordure autour d'eux

Flottant les deux divs:

#wrapper {
    width: 500px;
    border: 1px solid black;
    overflow: hidden; /* add this to contain floated children */
}
#first {
    width: 300px;
    float:left; /* add this */
    border: 1px solid red;
}
#second {
    border: 1px solid green;
    float: left; /* add this */
}
clairesuzy
la source
2
vous pouvez définir overflow:autosur le #wrapper Pour que la taille s'adapte toujours à la taille du contenu. (Sans avoir besoin d'un clair: les deux éléments)
meo
oui dans l'exemple un, si le #first est plus long, vous pourriez certainement - contenant des flotteurs 101 eh;) .. le débordement caché sur le #second évite la nécessité de calculer une marge gauche mais sinon les solutions sont fondamentalement les mêmes
clairesuzy
3
Exactement! Je ne veux pas calculer la marge. overflow: hiddenfait un excellent travail ici! Cependant, c'est toujours une sorte de magie pour moi. J'ai pensé que cela overflow: hiddendevrait cacher le contenu s'il ne correspond pas à son conteneur. Mais ici, le comportement est un peu différent. Pourriez-vous nous en parler davantage?
Misha Moroshko
4
la overflowpropriété effacera les flotteurs à la fois verticaux et horizontaux, c'est pourquoi dans mon premier exemple, #secondn'a pas besoin d'une marge gauche, la propriété overflow fonctionne tant que sa valeur n'est pas visible.. Je préfère masqué à auto pour ceux au cas où des scénarios une barre de défilement n'est pas générée par accident (ce que fera automatiquement) .. de toute façon il n'y aura pas de contenu caché un scénario comme celui-ci car il ne sera caché que s'il dépasse la largeur de 500px mais tant qu'il n'y aura pas de contenu en hauteur envelopper dans la largeur comme d'habitude .. pas de cachette;)
clairesuzy
1
débordement: caché sur le #wrapper sert à contenir le #first float verticalement s'il devenait plus long que le #second div non flotté. le deuxième débordement sur #second sert à contenir le contenu à côté du premier float, horizontalement sinon il irait sous le premier float. Le comportement étendu de la propriété de débordement a été introduit quelque part dans CSS2.1, les spécifications elles-mêmes ont changé en réponse à un moyen de contenir des flottants sans élément de compensation ou un piratage de clearfix, son terme technique est que lorsqu'il est utilisé comme cela, il crée un nouveau contexte de formatage des blocs
clairesuzy
130

Ayant deux divs,

<div id="div1">The two divs are</div>
<div id="div2">next to each other.</div>

vous pouvez également utiliser la displaypropriété:

#div1 {
    display: inline-block;
}

#div2 {
    display: inline-block;
}

Exemple jsFiddle ici .

Si div1dépasse une certaine hauteur, div2sera placé à côté en div1bas. Pour résoudre ce problème, utilisez vertical-align:top;sur div2.

Exemple jsFiddle ici .

jim_kastrin
la source
@BSeven la réponse acceptée utilise la propriété float, qui était prise en charge plus tôt que la propriété display par les principaux navigateurs. Chrome prend en charge float à partir de la v1.0 et l'affichage à partir de la v4.0. Peut-être que la réponse acceptée était plus rétrocompatible au moment où elle a été écrite.
jim_kastrin
5
Cette solution a un problème ennuyeux: depuis que les divs sont faits, inlinevous ne devez pas garder d'espaces, de nouvelles lignes, etc. entre eux dans votre HTML. Sinon, les navigateurs afficheront un espace entre eux. Voir ce violon : vous ne pouvez pas garder les deux divs sur la même ligne à moins de mettre leurs balises sans rien entre les deux.
Alexander Abakumov
30

Vous pouvez placer les éléments les uns à côté des autres en utilisant la propriété CSS float:

#first {
float: left;
}
#second {
float: left;
}

Vous devez vous assurer que le div wrapper permet le flottement en termes de largeur et que les marges, etc. sont définies correctement.

James
la source
17

Essayez d'utiliser le modèle flexbox. Il est facile et court à écrire.

Live Jsfiddle

CSS:

#wrapper {
  display: flex;
  border: 1px solid black;
}
#first {
    border: 1px solid red;
}
#second {
    border: 1px solid green;
}

la direction par défaut est la ligne. Ainsi, il s'aligne les uns à côté des autres à l'intérieur du #wrapper. Mais il n'est pas pris en charge IE9 ou moins que ces versions

Md. Rafee
la source
1
Je ne peux pas croire à quel point il est facile à utiliser flex. Je vous remercie!
Sam
16

voici la solution:

#wrapper {
    width: 500px;
    border: 1px solid black;
    overflow: auto; /* so the size of the wrapper is alway the size of the longest content */
}
#first {
    float: left;
    width: 300px;
    border: 1px solid red;
}
#second {
    border: 1px solid green;
    margin: 0 0 0 302px; /* considering the border you need to use a margin so the content does not float under the first div*/
}

votre démo mise à jour;

http://jsfiddle.net/dqC8t/1/

meo
la source
Merci. Si j'omet, overflow: auto;cela fonctionne toujours. Pourriez-vous donner un exemple où cela est nécessaire?
Misha Moroshko
oui bien sûr: supprimez le débordement automatique et augmentez le contenu du premier puis le contenu du second, vous voyez bien que la taille du conteneur ne s'adapte que lorsque vous définissez le débordement automatique sur celui-ci, ou si vous utilisez un élément de compensation: jsfiddle. net / dqC8t / 3
meo
OK, je vois, merci! Cependant, je n'ai pas aimé margin: 0 0 0 302px;car cela dépend width: 300px;. Mais merci quand même!!
Misha Moroshko
vous n'en avez pas besoin si vous spécifiez la largeur i pour votre deuxième div
meo
15

Option 1

Utilisez float:leftsur les deux divéléments et définissez un% de largeur pour les deux éléments div avec une largeur totale combinée de 100%.

Utiliser box-sizing: border-box;sur les éléments div flottants. La valeur border-box force le remplissage et les bordures dans la largeur et la hauteur au lieu de les agrandir.

Utilisez clearfix sur le <div id="wrapper">pour effacer les éléments enfants flottants, ce qui rendra l'échelle div du wrapper à la hauteur correcte.

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

#first, #second{
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}

#wrapper {
    width: 500px;
    border: 1px solid black;
}
#first {
    border: 1px solid red;
    float:left;
    width:50%;
}
#second {
    border: 1px solid green;
    float:left;
    width:50%;
}

http://jsfiddle.net/dqC8t/3381/

Option 2

Utiliser position:absolutesur un élément et une largeur fixe sur l'autre élément.

Ajouter une position: relative à l' <div id="wrapper">élément pour que les éléments enfants se positionnent absolument sur l' <div id="wrapper">élément.

#wrapper {
    width: 500px;
    border: 1px solid black;
    position:relative;
}
#first {
    border: 1px solid red;
    width:100px;
}
#second {
    border: 1px solid green;
    position:absolute;
    top:0;
    left:100px;
    right:0;
}

http://jsfiddle.net/dqC8t/3382/

Option 3

Utilisez display:inline-blocksur les deux divéléments et définissez un% de largeur pour les deux éléments div avec une largeur totale combinée de 100%.

Et encore (même que l' float:leftexemple) utiliser box-sizing: border-box;sur les éléments div. La valeur border-box force le remplissage et les bordures dans la largeur et la hauteur au lieu de les agrandir.

REMARQUE: les éléments de bloc en ligne peuvent avoir des problèmes d'espacement car ils sont affectés par les espaces dans le balisage HTML. Plus d'informations ici: https://css-tricks.com/fighting-the-space-between-inline-block-elements/

#first, #second{
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}

#wrapper {
    width: 500px;
    border: 1px solid black;
    position:relative;
}

#first {
    width:50%;
    border: 1px solid red;
    display:inline-block;
}

#second {
    width:50%;
    border: 1px solid green;
    display:inline-block;
}

http://jsfiddle.net/dqC8t/3383/

Une dernière option serait d'utiliser la nouvelle option d'affichage nommée flex, mais notez que la compatibilité du navigateur pourrait entrer en jeu:

http://caniuse.com/#feat=flexbox

http://www.sketchingwithcss.com/samplechapter/cheatsheet.html

Jako Basson
la source
1
D'accord; floatne flotte pas mon bateau. inline-blockrochers. (Désolé.)
SteveCinq
7

Essayez d'utiliser les modifications de code ci-dessous pour placer deux divisions l'une en face de l'autre

#wrapper {
  width: 500px;
  border: 1px solid black;
  display:flex;
}

Lien JSFiddle

Shailesh
la source
7

C'est très facile - vous pouvez le faire à la dure

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

#first, #second{
  box-sizing: border-box;
  -moz-box-sizing: border-box;
  -webkit-box-sizing: border-box;
}

#wrapper {
    width: 500px;
    border: 1px solid black;
}
#first {
    border: 1px solid red;
    float:left;
    width:50%;
}
#second {
    border: 1px solid green;
    float:left;
    width:50%;
}
<div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>

ou la manière simple

#wrapper {
  display: flex;
  border: 1px solid black;
}
#first {
    border: 1px solid red;
}
#second {
    border: 1px solid green;
}
<div id="wrapper">
    <div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>

Il y a aussi un million d'autres façons.
Mais je le ferais simplement avec la facilité. Je voudrais également vous dire que beaucoup de réponses ici sont incorrectes, mais les deux façons dont j'ai montré au moins fonctionnent en HTML 5.

Runningman Studios
la source
5

C'est la bonne réponse CSS3. J'espère que cela vous aide en quelque sorte maintenant: D Je vous recommande vraiment de lire le livre: https://www.amazon.com/Book-CSS3-Developers-Future-Design/dp/1593272863 En fait, j'ai fait cette solution en lisant ce livre maintenant . :RÉ

#wrapper{
  display: flex;
  flex-direction: row;
  border: 1px solid black;
}
#first{
  width: 300px;
  border: 1px solid red;
}
#second{
  border: 1px solid green;
}
<div id="wrapper">
    <div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>

Martin Krajčírovič
la source
3
  1. Ajoutez une float:left;propriété dans les deux divisions.

  2. Ajouter une display:inline-block;propriété.

  3. Ajouter une display:flex;propriété dans la div parent.

Ami
la source
2

Mon approche:

<div class="left">Left</div>
<div class="right">Right</div>

CSS:

.left {
    float: left;
    width: calc(100% - 200px);
    background: green;
}

.right {
    float: right;
    width: 200px;
    background: yellow;
}
sNICkerssss
la source
0

#wrapper {
width: 1200;
border: 1px solid black;
position: relative;
float: left;
}
#first {
width: 300px;
border: 1px solid red;
position: relative;
float: left;
}
#second {
border: 1px solid green;
position: relative;
float: left;
width: 500px;
}
<div id="wrapper">
    <div id="first">Stack Overflow is for professional and enthusiast programmers, people who write code because they love it.</div>
    <div id="second">When you post a new question, other users will almost immediately see it and try to provide good answers. This often happens in a matter of minutes, so be sure to check back frequently when your question is still new for the best response.</div>
</div>

Akshit Ahuja
la source
0

Dans l'interface utilisateur matérielle et react.js, vous pouvez utiliser la grille

<Grid
  container
  direction="row"
  justify="center"
  alignItems="center"
>
    <Grid item xs>
      <Paper className={classes.paper}>xs</Paper>
    </Grid>
    <Grid item xs>
      <Paper className={classes.paper}>xs</Paper>
    </Grid>
    <Grid item xs>
      <Paper className={classes.paper}>xs</Paper>
    </Grid>

</Grid>
Pedro JR
la source