654 Stimmen

Erweitern eines Divs, um die verbleibende Breite zu füllen

Ich möchte ein zweispaltiges Div-Layout, wobei jede Spalte eine variable Breite haben kann, z. B.

div {
  float: left;
}

.second {
  background: #ccc;
}

<div>Tree</div>
<div class="second">View</div>

Ich möchte, dass sich das "view"-Div auf die gesamte verfügbare Breite ausdehnt, nachdem das "tree"-Div den benötigten Platz gefüllt hat.

Derzeit ist mein 'view' div auf den Inhalt angepasst, den es enthält Es wäre auch gut, wenn beide Divs die gesamte Höhe einnehmen würden.


Kein doppelter Haftungsausschluss:

1 Stimmen

1 Stimmen

Entweder verstehe ich die Frage nicht, oder ich verstehe nicht, wie Sie sich für die akzeptierte Antwort entschieden haben, denn dort sind sowohl die Breite als auch die Höhe mit der Unannehmlichkeit der overflow hidden

1087voto

Xanthir Punkte 17566

Die Lösung für dieses Problem ist eigentlich sehr einfach, aber nicht zu todo offensichtlich. Sie müssen einen so genannten "Blockformatierungskontext" (BFC) auslösen, der auf eine bestimmte Weise mit Gleitkommazahlen interagiert.

Nehmen Sie einfach das zweite Div, entfernen Sie den Float, und geben Sie ihm overflow:hidden stattdessen. Jeder Überlaufwert, der nicht sichtbar ist, macht den Block, auf den er gesetzt ist, zu einem BFC. BFCs lassen weder zu, dass absteigende Floats sie verlassen, noch lassen sie zu, dass Geschwister/Vorgänger-Floats in sie eindringen. Der Nettoeffekt hier ist, dass die schwimmende div wird sein Ding tun, dann die zweite div wird ein gewöhnlicher Block, wobei alle verfügbaren Breite mit Ausnahme des vom Schwimmer besetzten Bereichs .

Dies sollte in allen aktuellen Browsern funktionieren, obwohl Sie möglicherweise hasLayout in IE6 und 7 auslösen müssen. Ich kann mich nicht erinnern.

Demos:

0 Stimmen

Es scheint in IE 9's IE 7 Kompatibilitätsmodus ohne hasLayout zu funktionieren, also meine Vermutung IE 7 erfordert nicht hasLayout.

28 Stimmen

Ausgezeichnete Antwort! Aber Sie liegen falsch, wenn Sie sagen, dass "jeder Überlaufwert außer auto" es zu einem BFC macht. Was Sie meinen, ist, dass jeder andere Überlaufwert als der Standard (sichtbar) wird es zu einem BFC. In der Tat, Überlauf auto funktioniert perfekt zu - das ist, was ich empfehlen würde (nur für den Fall, dass Sie relativ positionierte Elemente, die aus diesem div spähen könnte).

55 Stimmen

Dieser Artikel enthält eine gute Erklärung: colinaarts.com/articles/the-magic-of-overflow-hidden

182voto

B T Punkte 51689

Ich habe gerade die Magie der Flexboxen (display: flex) entdeckt. Versuchen Sie dies:

<style>
  #box {
    display: flex;
  }
  #b {
    flex-grow: 100;
    border: 1px solid green;
  }
</style>
<div id='box'>
 <div id='a'>Tree</div>
 <div id='b'>View</div>
</div>

Flex-Boxen geben mir die Kontrolle, die ich mir seit 15 Jahren bei CSS gewünscht habe. Endlich ist sie da! Mehr Infos: https://css-tricks.com/snippets/css/a-guide-to-flexbox/

0 Stimmen

Ich weiß nicht, was Sie entdeckt haben, aber Ihr Code funktioniert nicht im neuesten Chrome jsfiddle.net/fjb548kw/3

0 Stimmen

@YevgeniyAfanasyev Ich habe das "float:left;" entfernt, um das Problem zu beheben. Vielen Dank für den Hinweis!

1 Stimmen

Ich danke Ihnen. Können Sie bitte erklären, warum Sie flex-grow: 100; anstelle von flex-grow: 1; ?

70voto

Reggie Pinkham Punkte 10526

Verwenden Sie die CSS Flexbox flex-grow Eigenschaft, um den verbleibenden Platz zu füllen.

html, body {
  height: 100%;
}
body {
  display: flex;
}
.second {
  flex-grow: 1;
}

<div style="background: #bef;">Tree</div>
<div class="second" style="background: #ff9;">View</div>

29voto

cletus Punkte 596503

Dies wäre ein gutes Beispiel für etwas, das mit Tabellen trivial und mit CSS schwer (wenn nicht gar unmöglich, zumindest in einem browserübergreifenden Sinne) zu bewerkstelligen ist.

Wenn die beiden Spalten eine feste Breite hätten, wäre dies einfach.

Wenn eine der Spalten eine feste Breite hätte, wäre dies etwas schwieriger, aber durchaus machbar.

Wenn beide Spalten eine variable Breite haben, sollten Sie IMHO nur eine zweispaltige Tabelle verwenden.

11 Stimmen

In einem responsiven Design, bei dem die rechte Spalte auf kleinen Geräten unter die linke geschoben werden soll, ist die Tabelle allerdings nicht sehr gut geeignet.

1 Stimmen

Es gibt einige Tricks für responsives Design, um mit Tabellen zu arbeiten: css-tricks.com/responsive-data-tables

0 Stimmen

Ich neige jetzt oft dazu, zwei getrennte Layouts komplett zu entwerfen und auf einem Handy mit Media Queries und display:none; Während man so viel wie möglich auf einer gleitenden Skala zu 100 % responsive macht, ist es manchmal schöner, das Design für ein Mobiltelefon komplett zu ändern und dabei das Touchscreen-Gefühl und den Stil der Schaltflächen zu nutzen.

25voto

joel Moses Punkte 305

Utilice calc :

.leftSide {
  float: left;
  width: 50px;
  background-color: green;
}
.rightSide {
  float: left;
  width: calc(100% - 50px);
  background-color: red;
}

<div style="width:200px">
  <div class="leftSide">a</div>
  <div class="rightSide">b</div>
</div>

Das Problem dabei ist, dass alle Breiten explizit definiert werden müssen, entweder als Wert (px und em funktionieren gut), oder als Prozentsatz von etwas explizit definiertem selbst.

0 Stimmen

Dies hat den Vorteil, dass es mit Eingabefeldern funktioniert, was bei dem am besten bewerteten Kommentar nicht der Fall ist.

0 Stimmen

Beste Antwort. funktioniert in allen Fällen

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X