106 votes

Deux divs, l'un à largeur fixe, l'autre, le reste

J'ai deux conteneurs div.

Alors que l'une d'entre elles doit avoir une largeur spécifique, je dois l'ajuster pour que l'autre div occupe le reste de l'espace. Existe-t-il un moyen de le faire ?

.left {
    float: left;
    width: 83%;
    display: table-cell;
    vertical-align: middle;
    min-height: 50px;
    margin-right: 10px;
    overflow: auto;
}

.right {
    float: right;
    width: 16%;
    text-align: right;
    display: table-cell;
    vertical-align: middle;
    min-height: 50px;
    height: 100%;
    overflow: auto;
}

<div class="left"></div>
<div class="right"></div> <!-- needs to be 250px -->

4 votes

N'utilisez pas des astuces vieilles de dix ans pour les anciens navigateurs. Faites défiler la page pour découvrir une solution flexbox moderne.

2 votes

Avant de suivre le lien d'Evgeny, pensez aux navigateurs que vos utilisateurs utilisent réellement, plutôt qu'aux navigateurs que vous souhaiteriez qu'ils utilisent. Flexbox n'aura pas un bon rendu sur l'IE 9 de votre professeur : caniuse.com/#feat=flexbox

0 votes

@duhaime IE9 a une utilisation globale de 0,13%.

130voto

thirtydot Points 114021

Voir : http://jsfiddle.net/SpSjL/ (ajustez la largeur du navigateur)

HTML :

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

CSS :

.left {
    overflow: hidden;
    min-height: 50px;
    border: 2px dashed #f0f;
}

.right {
    float: right;
    width: 250px;
    min-height: 50px;
    margin-left: 10px;
    border: 2px dashed #00f;
}

Vous pouvez également le faire avec display: table ce qui est généralement une meilleure approche : Comment placer un élément de saisie sur la même ligne que son étiquette ?

4 votes

Cela ne fonctionne pas avec moi. La gauche est à 100% de largeur et la droite à 250px. Deux lignes :(

19 votes

Vous devez intervertir l'ordre des div comme dans ma réponse et ma démo. right puis left .

1 votes

Globalement, cela fonctionne pour moi, mais parfois, lorsque j'ai du texte dans la division de gauche, au lieu de s'enrouler sur la ligne suivante (et il y a de l'espace), il est simplement coupé sur la droite (là où la division de droite commence). Comment puis-je faire en sorte que le texte s'enroule dans la division de gauche ?

56voto

Eugene Xa Points 2451

Nous sommes en 2017 et la meilleure façon de le faire est d'utiliser le flexbox, qui est Compatible avec IE10+. .

.box {
  display: flex;
}

.left {
  flex: 1;  /* grow */
  border: 1px dashed #f0f;
}

.right {
  flex: 0 0 250px; /* do not grow, do not shrink, start at 250px */
  border: 1px dashed #00f;
}

<div class="box">
  <div class="left">Left</div>
  <div class="right">Right 250px</div>
</div>

1 votes

Votre commentaire sur la question m'a évité d'essayer de supporter IE6. merci !

0 votes

C'est également une bonne chose, mais calc() est bien meilleur que flex en raison de sa compatibilité avec IE9 et Chrome 26.

0 votes

Cela a bien fonctionné pour moi. Je n'ai même pas eu besoin de définir la largeur .right.

47voto

Shivali Patel Points 98

Vous pouvez utiliser la fonction calc() de CSS.

Démonstration : http://jsfiddle.net/A8zLY/543/

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

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

.right {
width:200px;
height:200px;
background:red;
float:right;   
}

J'espère que cela vous aidera !

0 votes

Merci pour le conseil. J'ai vérifié la compatibilité entre les navigateurs, et c'est un peu élevé pour une utilisation stable

1 votes

Cette réponse devrait être sélectionnée comme la meilleure, car dans cette réponse, les balises DIV ne sont pas interverties comme dans la meilleure réponse.

0 votes

Utile même avec d'autres solutions flexbox, dans mon cas en raison de l'incompatibilité de flex box dans une certaine imbrication d'une bibliothèque / composant react, merci.

14voto

Brent Points 2063

Si vous pouvez inverser l'ordre dans le code source, vous pouvez le faire comme ceci :

HTML :

<div class="right"></div> // needs to be 250px    
<div class="left"></div>

CSS :

.right {
  width: 250px;
  float: right;
}   

Un exemple : http://jsfiddle.net/blineberry/VHcPT/

Ajoutez un conteneur et vous pouvez le faire avec l'ordre de votre code source actuel et le positionnement absolu :

HTML :

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

CSS :

#container {
  /* set a width %, ems, px, whatever */
  position: relative;
}

.left {
  position: absolute;
  top: 0;
  left: 0;
  right: 250px;
}

.right {
  position: absolute;
  background: red;
  width: 250px;
  top: 0;
  right: 0;
}

Ici, le .left obtient une largeur implicitement définie à partir de la balise top , left et right qui lui permettent de remplir l'espace restant dans les #container .

Exemple : http://jsfiddle.net/blineberry/VHcPT/3/

0 votes

Le premier exemple ne semble pas fonctionner. Le div .left dans le jsFiddle correspond en fait à la largeur totale de l'écran. Si les deux divs ont la même hauteur, c'est parfait, mais dans ce cas, il suffit d'ajouter 5px de remplissage à .left et vous verrez.

1 votes

La deuxième solution a bien fonctionné pour moi. Génial !

6voto

andyb Points 26066

Si vous pouvez les emballer dans un récipient <div> vous pourriez utiliser le positionnement pour que la gauche <div> ancré à left:0;right:250px voir cette démo . Je précise d'ores et déjà que cela ne fonctionnera pas dans IE6, car seul un coin d'une page d'accueil de l'Internet est utilisé. <div> peuvent être positionnés de manière absolue sur une page ( voir ici pour une explication complète).

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