491 votes

Comment faire en sorte qu'une div remplisse un espace horizontal restant ?

J'ai 2 divs : une dans la partie gauche et une dans la partie droite de ma page. Celle de gauche a une largeur fixe et je veux que celle de droite remplisse l'espace restant.

#search {
  width: 160px;
  height: 25px;
  float: left;
  background-color: #ffffff;
}

#navigation {
  width: 780px;
  float: left;
  background-color: #A53030;
}

<div id="search">Text</div>
<div id="navigation">Navigation</div>

12 votes

Supprimez les propriétés width et float du #navigation et cela fonctionnera.

0 votes

2 votes

@alexchenco : vous devriez peut-être mettre à jour la réponse que vous avez choisie avec celle fournie par Hank.

290voto

Hank Points 1256

Le problème que j'ai trouvé avec la réponse de Boushley est que si la colonne de droite est plus longue que la colonne de gauche, elle s'enroulera autour de la colonne de gauche et recommencera à remplir tout l'espace. Ce n'est pas le comportement que je recherchais. Après avoir cherché de nombreuses "solutions", j'ai trouvé un tutoriel (dont le lien est mort) sur la création de pages à trois colonnes.

L'auteur propose trois méthodes différentes, une à largeur fixe, une avec trois colonnes variables et une avec des colonnes extérieures fixes et une largeur variable au milieu. Beaucoup plus élégant et efficace que les autres exemples que j'ai trouvés. A considérablement amélioré ma compréhension de la mise en page CSS.

En fait, dans le cas simple ci-dessus, la première colonne doit être flottante à gauche et sa largeur doit être fixe. Ensuite, donnez à la colonne de droite une marge gauche un peu plus large que celle de la première colonne. C'est tout. C'est fait. Le code d'Ala Boushley :

Voici une démonstration en Bases de données & jsFiddle

#left {
  float: left;
  width: 180px;
}

#right {
  margin-left: 180px;
}

/* just to highlight divs for example*/
#left { background-color: pink; }
#right { background-color: lightgreen;}

<div id="left">  left  </div>
<div id="right"> right </div>

Dans l'exemple de Boushley, la colonne de gauche tient l'autre colonne à droite. Dès que la colonne de gauche se termine, la colonne de droite recommence à remplir tout l'espace. Ici, la colonne de droite s'aligne simplement plus loin dans la page et la colonne de gauche occupe sa grande marge. Aucune interaction de flux n'est nécessaire.

0 votes

Lorsque vous fermez la balise div, le contenu qui suit cette balise devrait être affiché dans une nouvelle ligne, mais ce n'est pas le cas. Pouvez-vous m'expliquer pourquoi ?

0 votes

Devrait être:margin-left : 190px ; vous avez oublié ';'. La marge gauche devrait également être de 180px.

0 votes

@JAP Merci, j'ai corrigé le point-virgule. Je me suis rendu compte que je préférais, ou que j'avais besoin, d'une marge excédentaire entre les colonnes pour que la page ait l'aspect que je souhaitais. Mais je suis sûr que c'est une question de goût et de conception. En ce qui concerne votre question : peut-être que l'élément en question a besoin de quelque chose comme clear:both; dans son CSS. La colonne de gauche étant flottante, les nouveaux éléments apparaîtront à côté d'elle plutôt qu'en dessous, à moins que vous ne leur donniez la propriété clear.

137voto

Mihai Frentiu Points 456

La solution vient de la propriété "display".

En fait, vous devez faire en sorte que les deux divs agissent comme des cellules de tableau. Ainsi, au lieu d'utiliser float:left vous devrez utiliser display:table-cell sur les deux divs, et pour la div de largeur dynamique, vous devez définir width:auto; également. Les deux divs doivent être placées dans un conteneur de 100% de largeur avec la balise display:table propriété.

Voici la css :

.container {display:table;width:100%}
#search {
  width: 160px;
  height: 25px;
  display:table-cell;
  background-color: #FFF;
}
#navigation {
  width: auto;
  display:table-cell;
  /*background-color: url('../images/transparent.png') ;*/
  background-color: #A53030;
}

*html #navigation {float:left;}

Et le HTML :

<div class="container">
   <div id="search"></div>
   <div id="navigation"></div>
</div>

IMPORTANT : Pour Internet Explorer, vous devez spécifier la propriété float sur la div de largeur dynamique, sinon l'espace ne sera pas rempli.

J'espère que cela résoudra votre problème. Si vous le souhaitez, vous pouvez lire l'article complet que j'ai écrit à ce sujet sur mon blog .

3 votes

Ne fonctionne pas lorsque le contenu à l'intérieur de la div avec width:auto est plus grand que le reste de l'espace disponible dans la fenêtre de visualisation.

0 votes

Tout comme la suggestion de J. Peterson, vous ne devez PAS utiliser les tableaux comme éléments de conception, sauf si leur contenu est en fait des données de tableau. Cette suggestion devrait avoir beaucoup plus de votes négatifs.

4 votes

@einord, cette solution n'utilise pas de tableaux, et je suis conscient que les tableaux ne devraient être utilisés que pour les données tabulaires. Donc, c'est hors contexte ici. Les tableaux réels et les propriétés display:table(+autres variations) sont des choses complètement différentes.

114voto

mystrdat Points 975

Comme il s'agit d'une question plutôt populaire, j'ai envie de partager une solution intéressante utilisant BFC.
Exemple de Codepen aquí .

.left {
  float: left;
  width: 100px;
}
.right {
  overflow: auto;
}

En l'occurrence, overflow: auto déclenche un comportement contextuel et fait en sorte que le bon élément s'étende sólo à la largeur restante disponible et il s'étendra naturellement à la pleine largeur si .left disparaît. Une astuce très utile et propre pour de nombreuses mises en page d'interface utilisateur, mais peut-être difficile à comprendre au premier abord.

1 votes

Prise en charge du débordement par les navigateurs. IE4 !!! w3schools.com/cssref/pr_pos_overflow.asp

1 votes

Parfois, je me retrouve avec une barre de défilement horizontale inutile sur l'élément .right. Quel est le problème à cet endroit ?

1 votes

@PatrickSzalapski Pouvez-vous faire un codepen ou similaire de l'affaire ? Débordement auto peut le déclencher en fonction de son contenu. Vous pouvez également utiliser toute autre valeur de débordement pour obtenir le même effet, hidden peut s'avérer plus efficace dans votre cas.

81voto

Boushley Points 1360

Cela semble répondre à votre objectif.

#left {
  float:left;
  width:180px;
  background-color:#ff0000;
}
#right {
  width: 100%;
  background-color:#00FF00;
}

<div>
  <div id="left">
    left
  </div>
  <div id="right">
    right
  </div>
</div>

9 votes

Vous devez cependant supprimer la largeur : 100% sur la div de droite pour que cela fonctionne.

0 votes

Je viens de copier et coller ce code à partir d'une page sur laquelle je l'ai testé... le 100% fonctionne.

265 votes

Cette solution pose en fait un problème. Essayez de supprimer la couleur de l'élément LEFT. Vous remarquerez que la couleur de l'élément DROIT se cache en fait en dessous. Le contenu semble aller au bon endroit, mais pas la division RIGHT elle-même.

16voto

Denzel Points 406

La réponse de @Boushley était la plus proche, mais il y a un problème qui n'a pas été abordé et qui a été souligné. Il y a cependant un problème qui n'a pas été abordé et qui a été souligné. droit prend toute la largeur du navigateur ; le contenu prend la largeur prévue. Pour mieux comprendre ce problème :

<html>
<head>
    <style type="text/css">
    * { margin: 0; padding: 0; }
    body {
        height: 100%;
    }
    #left {
        opacity: 0;
        height: inherit;
        float: left;
        width: 180px;
        background: green;
    }
    #right {
        height: inherit;
        background: orange;
    }
    table {
            width: 100%;
            background: red;
    }
    </style>
</head>
<body>
    <div id="left">
        <p>Left</p>
    </div>
    <div id="right">
        <table><tr><td>Hello, World!</td></tr></table>
    </div>
</body>
</html>

http://jsfiddle.net/79hpS/

Le contenu est à la bonne place (dans Firefox), mais la largeur est incorrecte. Lorsque les éléments enfants commencent à hériter de la largeur (par exemple, le tableau avec width: 100% ), elles ont une largeur égale à celle du navigateur, ce qui les fait déborder sur la droite de la page et crée une barre de défilement horizontale (dans Firefox) ou ne pas flotter et être repoussées vers le bas (dans chrome).

Vous pouvez corriger cela facilement en ajoutant overflow: hidden dans la colonne de droite. Vous obtiendrez ainsi une largeur correcte pour le contenu et la div. En outre, le tableau recevra la largeur correcte et remplira la largeur restante disponible.

J'ai essayé certaines des autres solutions ci-dessus, mais elles ne fonctionnaient pas complètement dans certains cas et étaient tout simplement trop compliquées pour justifier de les corriger. Cette solution fonctionne et elle est simple.

Si vous avez des problèmes ou des préoccupations, n'hésitez pas à les soulever.

1 votes

overflow: hidden corrige en effet ce problème, merci. (La réponse marquée est erronée car right prend en fait tout l'espace disponible sur le parent, vous pouvez le voir dans tous les navigateurs lors de l'inspection des éléments)

1 votes

Quelqu'un peut-il expliquer pourquoi cela fonctionne exactement ? Je sais que j'ai vu une bonne explication quelque part ici, mais je n'arrive pas à la retrouver.

2 votes

@tomswift Setting overflow: hidden place la colonne de droite dans son propre contexte de formatage de bloc. Les éléments de bloc occupent tout l'espace horizontal disponible. Voir aussi developer.mozilla.org/en-US/docs/Web/Guide/CSS/

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