Zwei Divs, eine feste Breite, die andere, der Rest

97

Ich habe zwei Div-Container.

Während einer eine bestimmte Breite haben muss, muss ich ihn anpassen, damit der andere Div den Rest des Raums einnimmt. Kann ich das auf irgendeine Weise tun?

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

Bär
quelle
4
Verwenden Sie keine jahrzehntealten Hacks für alte Browser. Scrollen Sie nach unten, um eine moderne Flexbox-Lösung zu erhalten.
Evgeny
1
Bevor Sie dem Link von Evgeny folgen, sollten Sie die Browser berücksichtigen, die Ihre Benutzer tatsächlich verwenden, und nicht die Browser, die Sie gerne verwendet hätten. Flexbox wird auf dem IE 9 Ihres Professors nicht gut gerendert
duhaime
@duhaime IE9 hat 0,13% globale Nutzung
Evgeny
Also 1 von 1000 Benutzern ...
duhaime

Antworten:

127

Siehe: http://jsfiddle.net/SpSjL/ (passen Sie die Breite des Browsers an)

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;
}

Sie können dies auch tun display: table, was normalerweise ein besserer Ansatz ist: Wie kann ich ein Eingabeelement in dieselbe Zeile wie seine Bezeichnung setzen?

dreißig Punkte
quelle
4
Es funktioniert nicht mit mir. Links ist 100% breit und rechts 250px. Zwei Zeilen :(
tragen
19
Sie müssen die Reihenfolge der divs tauschen , wie in meiner Antwort und meiner Demo. rightdann left.
dreißig Punkte
1
Insgesamt funktioniert dies für mich, aber manchmal, wenn ich Text im linken Div habe, anstatt in die nächste Zeile zu springen (und es ist Platz), wird er einfach rechts abgeschnitten (wo der rechte Div beginnt). Wie kann ich den Text im linken Bereich umbrechen?
Guy
1
Nicht schwebender DIV füllt die gesamte Breite aus. Schlechte Idee, wenn der Inhalt höher ist als Floating DIV oder Text zu lang.
netAction
46

Es ist 2017 und der beste Weg, dies zu tun, ist die Verwendung der Flexbox, die IE10 + -kompatibel ist .

.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
quelle
1
Ihr Kommentar zu der Frage hat mich vor dem Versuch bewahrt, IE6 zu unterstützen. Vielen Dank!
Mike Davlantes
Dies ist auch gut, aber calc () ist aufgrund der Kompatibilität mit IE9 und Chrome 26 viel besser als flex.
Don Dilanga
Das hat bei mir gut funktioniert. Es musste nicht einmal die richtige Breite definiert werden.
Rotaercz
1
Es bringt mich um, dass wir 2017/2018/2019 immer noch Kommentare in Anlehnung an BEWARE OF IE 9 erhalten.
Mike Devenney
43

Sie können die Funktion calc () von CSS verwenden.

Demo: 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;   
}

Hoffe das wird dir helfen !!

Shivali Patel
quelle
Danke für den Hinweis. Ich habe die Kompatibilität zwischen Browsern überprüft und es ist
ziemlich
1
Dies sollte als beste Antwort ausgewählt werden, da in dieser Antwort die DIV-Tags nicht wie in der besten Antwort vertauscht werden.
Don Dilanga
14

Wenn Sie die Reihenfolge im Quellcode umkehren können, können Sie dies folgendermaßen tun:

HTML:

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

CSS:

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

Ein Beispiel: http://jsfiddle.net/blineberry/VHcPT/

Fügen Sie einen Container hinzu und Sie können dies mit Ihrer aktuellen Quellcode-Reihenfolge und absoluten Positionierung tun:

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;
}

Hier wird die .leftbekommt div eine implizit gesetzt Breite von der top, leftund rightStile , die erlaubt es den verbleibenden Raum zu füllen#container .

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

Brent
quelle
Das erste Beispiel scheint nicht wirklich zu funktionieren. Das .left-Div in der jsFiddle entspricht der gesamten Bildschirmbreite. Wenn beide Divs die gleiche Höhe haben, ist das großartig, aber in diesem Fall fügen Sie einfach 5px Polsterung zu .left hinzu und Sie werden sehen.
user3413723
1
Die zweite Lösung hat für mich allerdings großartig funktioniert. Genius!
user3413723
6

Wenn Sie sie in einen Behälter einwickeln können, können <div>Sie die Position mithilfe der Positionierung <div>verankern left:0;right:250px, siehe diese Demo . Ich werde jetzt sagen, dass dies in IE6 nicht funktioniert, da nur eine Ecke von a <div>absolut auf einer Seite positioniert werden kann ( siehe hier für eine vollständige Erklärung).

andyb
quelle
3

1- Haben Sie ein Wrapper-Div, stellen Sie die Polsterung und den Rand nach
Ihren Wünschen ein. 2- Stellen Sie das Div auf der linken Seite auf die Breite ein, die Sie benötigen, und lassen Sie es nach links schweben.
3- Stellen Sie den Div-Rand auf der rechten Seite gleich der Breite auf der linken Seite ein

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

Hoffe das funktioniert bei dir!

Oscar
quelle
1

Stellen Sie Ihr Recht auf die spezifische Breite ein und schweben Sie es. Stellen Sie links den Rand rechts auf 250px ein

.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
}
Meteorainer
quelle
die Darstellungsart in .right zu töten und stellen Sie sicher , müssen Sie nicht eine klare Einstellung überall haben , die .left werden beeinflussen würde
meteorainer
Hast du irgendeine Art von Wrapper Div? Gibt es etwas online, das ich inspizieren kann, oder ist das total lokal?
Meteorainer
Es ist komplett lokal, aber lassen Sie mich versuchen, es auf jsfiddle zu setzen.
tragen
haha, du hast deinen Schwimmer entfernt: richtig. Vergessen Sie auch nicht, die Randbreiten zu berücksichtigen. Wenn Sie diese also belassen, subtrahieren Sie die Breiten von einer der Div-Breiten.
Meteorainer
0

Wenn Sie eine browserübergreifende Lösung benötigen, können Sie meinen Ansatz klar und einfach verwenden.

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

quelle
-1

Verwenden Sie das einfache, das Ihnen helfen kann

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