Deux divs, une largeur fixe, l'autre, le reste

97

J'ai deux conteneurs div.

Alors que l'un doit avoir une largeur spécifique, je dois l'ajuster, de sorte que l'autre div occupe le reste de l'espace. Y a-t-il moyen de faire ça?

.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 -->

ours
la source
4
N'utilisez pas de hacks vieux de dix ans pour les anciens navigateurs. Faites défiler vers le bas pour une solution Flexbox moderne.
Evgeny
1
Avant de suivre le lien d'Evgeny, considérez les navigateurs que vos utilisateurs utilisent réellement, plutôt que les navigateurs que vous souhaitiez qu'ils utilisent. Flexbox ne rendra pas bien sur l'IE 9 de votre professeur: caniuse.com/#feat=flexbox
duhaime
@duhaime IE9 a une utilisation mondiale de 0,13%
Evgeny
Donc 1 utilisateur sur 1000 ...
duhaime

Réponses:

127

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 puis-je mettre un élément d'entrée sur la même ligne que son étiquette?

trentenaire
la source
4
Ça ne marche pas avec moi. La gauche a une largeur de 100% et la droite est de 250 pixels. Two lines :(
ours le
19
Vous devez permuter l'ordre des divs, comme dans ma réponse et ma démo. rightalors left.
thirtydot
1
Dans l'ensemble, cela fonctionne pour moi, mais parfois, lorsque j'ai du texte dans le div de gauche au lieu de passer à la ligne suivante (et qu'il y a de l'espace), il est simplement coupé à droite (là où le div de droite commence). Comment puis-je faire habiller le texte dans le div de gauche?
Guy
1
Le DIV non flottant remplit toute la largeur. Mauvaise idée lorsque le contenu est supérieur au DIV flottant ou que le texte est trop long.
netAction
47

Nous sommes en 2017 et la meilleure façon de le faire est d'utiliser flexbox, qui est compatible 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>

Evgeny
la source
1
votre commentaire sur la question m'a évité d'essayer de soutenir IE6. Merci!
Mike Davlantes
C'est aussi bien, mais calc () est bien meilleur que flex en raison de la compatibilité avec IE9 et Chrome 26.
Don Dilanga
Cela a bien fonctionné pour moi. N'a même pas besoin de la largeur .right pour être définie.
rotaercz
1
Cela me tue qu'en 2017/2018/2019, nous recevions encore des commentaires du type BEWARE OF IE 9.
Mike Devenney
43

Vous pouvez utiliser la fonction calc () de CSS.

Démo: 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 ceci vous aidera!!

Shivali Patel
la source
Merci pour le conseil. J'ai vérifié la compatibilité entre les navigateurs, et c'est
assez
1
Cela devrait être sélectionné comme la meilleure réponse, car dans cette réponse, les balises DIV ne sont pas permutées comme dans la meilleure réponse.
Don Dilanga
14

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 votre ordre actuel du code source et votre 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, la .leftdiv obtient une largeur est implicitement du top, leftet des rightstyles qui lui permet de remplir l'espace restant dans#container .

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

Brent
la source
Le premier exemple ne semble pas vraiment fonctionner. Le div .left dans le jsFiddle est en fait la largeur totale de l'écran. Si les deux divs ont la même hauteur, c'est parfait, mais dans ce cas, ajoutez simplement un remplissage de 5px à .left et vous verrez.
user3413723
1
La deuxième solution a très bien fonctionné pour moi. Génie!
user3413723
6

Si vous pouvez les envelopper dans un conteneur, <div>vous pouvez utiliser le positionnement pour <div>ancrer la gauche left:0;right:250px, voir cette démo . Je vais dire maintenant que cela ne fonctionnera pas dans IE6 car un seul coin de a <div>peut être positionné de manière absolue sur une page ( voir ici pour une explication complète).

Andyb
la source
3

1- Ayez un div d'emballage, réglez le rembourrage et la marge comme vous le souhaitez
2- Faites le côté gauche de la largeur dont vous avez besoin et faites-le flotter à gauche
3- Réglez la marge de div côté droit égale à la largeur du côté gauche

.left
{
    ***width:300px;***
    float: left;
    overflow:hidden;

}

.right
{
    overflow: visible;
    ***margin-left:300px;***
}



<div class="wrapper">
    <div class="left">
        ...
    </div>

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

</div>

J'espère que cela fonctionne pour toi!

oscar
la source
1

réglez votre droite à la largeur spécifique et faites-la flotter, sur votre gauche, réglez simplement la marge droite à 250px

.left {
vertical-align: middle;
min-height: 50px;
margin-right: 250px;
overflow: auto

}

.right {
width:250px;
text-align: right;
display: table-cell;
vertical-align: middle;
min-height: 50px;
height: 100%;
overflow: auto
}
météore
la source
tuez le type d'affichage dans .right et assurez-vous que vous n'avez nulle part un paramètre clair qui affecterait
.left
avez-vous une sorte de div wrapper? Y a-t-il quelque chose que je peux inspecter en ligne ou est-ce totalement local?
meteorainer
C'est complètement local, cependant, laissez-moi essayer de le mettre sur jsfiddle.
ours le
haha, vous avez retiré votre flotteur: à droite. N'oubliez pas non plus de prendre en compte les largeurs de bordure, donc si vous voulez laisser celles-ci, soustrayez les largeurs de l'une des largeurs div.
meteorainer
0

Si vous avez besoin d'une solution multi-navigateurs, vous pouvez utiliser mon approche, claire et simple.

.left{
        position: absolute;
        height: 150px;
        width:150px;
        background: red;
        overflow: hidden;
        float:left;
}
.right{
        position:relative;
        height: 150px;
        width:100%;
        background: red;
        margin-left:150px;
        background: green;
        float:right;
}

la source
-1

Utilisez le simple cela peut vous aider

<table width="100%">
    <tr>
         <td width="200">fix width</td>
         <td><div>ha ha, this is the rest!</div></td>
    </tr>
</table>
Huỳnh Hữu Ân
la source