Wie man ein leeres Div Platz nimmt

104

Dies ist mein Fall für ein 960-Rastersystem:

<div class="kundregister_grid_full">
    <div class="kundregister_grid_1">ID</div>
    <div class="kundregister_grid_1">Namn</div>
    <div class="kundregister_grid_1">Anv.Namn</div>
    <div class="kundregister_grid_1">Email</div>
    <div class="kundregister_grid_1">Roll</div>
    <div class="kundregister_grid_1">Aktiv</div>
</div>

Dies ist meine Gruppe von Divs, die als Tabellenstruktur verwendet werden.

CSS sagt Folgendes:

.kundregister_grid_1 {
    display: inline-block;
    float: left;
    margin: 0; 
    text-align: center;
}
.kundregister_grid_1 {
    width: 140px;
}

Kümmere dich nicht um die schwedische Benennung. Ich möchte, dass die Divs angezeigt werden, obwohl sie keine Werte haben.

<div class="kundregister_grid_full">
 <div class="kundregister_grid_1">ID</div>
 <div class="kundregister_grid_1"></div>
 <div class="kundregister_grid_1"></div>
 <div class="kundregister_grid_1">Email</div>
 <div class="kundregister_grid_1">Roll</div>
 <div class="kundregister_grid_1">Aktiv</div>
</div>

In diesem Fall gibt es in den beiden Spalten kein "Namn" und "Avn.Namn". Wenn Sie dies jedoch in Chrome ausführen, werden sie entfernt und drücken die anderen Divs nicht mehr in der Reihenfolge float:left. Wenn ich also oben Kategorien in denselben Divs habe, werden die Werte unter die falsche Kategorie gestellt.

Oldek
quelle

Antworten:

64

Es funktioniert, wenn Sie Floating entfernen. http://jsbin.com/izoca/2/edit

Mit Floats funktioniert es nur, wenn es Inhalte gibt, z &nbsp;

Rito
quelle
5
Eine andere Antwort besagt, dass das Einsetzen einer Mindesthöhe beim Schwimmen funktioniert, und in meinem Fall hat das sicherlich funktioniert. Wenn das immer stimmt (jetzt, im Jahr 2016), dann ist diese Antwort falsch. Sie können einfach die Mindesthöhe hinzufügen: 1px; auf die Breite: 140px; ohne dass entweder der Float entfernt oder Inhalte hinzugefügt werden müssen.
Nick Rice
Versucht element.text("&nbsp;");in jQuery und &nbsp;erscheint auf der Seite.
Lori
54

Versuchen Sie &nbsp;, die leeren Elemente zu ergänzen.

Ich verstehe nicht, warum Sie hier kein verwenden <table>? Sie werden solche Sachen automatisch machen.

Pekka
quelle
9
Einverstanden. Wenn es sich um tabellarische Daten handelt, verwenden Sie eine Tabelle - dafür sind sie gedacht.
Dan Diplo
5
Nach all dieser Zeit nehmen die Leute immer noch <table>== BAD an.
Saluce
4
Die Verwendung einer &nbsp;so beliebten Lösung kann in einigen Szenarien zu Problemen führen. Wie beim Strike-out ( text-decoration: line-through;) -Text wird der Strich angezeigt &nbsp;, während das, was Sie wirklich wollen, nur ein leeres Div ist.
Izhaki
1
@ Pekka 웃, es ist nicht immer möglich, "Tabellen zu verwenden". Ich habe das gleiche Problem ("Wie man ein leeres Div Platz einnimmt") für ein responsives Design, bei dem ich eine horizontale Tabelle in eine vertikale Tabelle verwandle, wenn die Breite kurz ist. Ich benutze bereits Tabellen ...
ANeves
@ANeves eine Tabelle wird in diesem Fall die Breite immer korrekt platzieren, nein? Ich bin mir nicht sicher, ob ich folge ...
Pekka
25

Leichtes Update auf @ no1cobla Antwort. Dies verbirgt die Periode. Diese Lösung funktioniert in IE8 +.

.class:after
{
    content: '.';
    visibility: hidden;
}
Jonathan
quelle
5
Wenn Sie dies als Fallback verwenden möchten, um zu arbeiten, wenn Ihr Element leer ist, fügen Sie Folgendes hinzu:.class:after:empty
Miguel Garrido
1
@ Miguel Garrido - Ich musste .class: empty verwenden: danach, damit das funktioniert.
Zweite Person
24

Eine einfache Lösung für leere schwebende Divs besteht darin, Folgendes hinzuzufügen:

  • Breite (oder Mindestbreite)
  • Mindesthöhe

Auf diese Weise können Sie die Float-Funktionalität beibehalten und erzwingen, dass sie den leeren Raum ausfüllt.

Ich verwende diese Technik in Seitenlayoutspalten, um jede Spalte an ihrer Position zu halten, auch wenn die anderen Spalten leer sind.

Beispiel:

.left-column
{
   width: 200px;
   min-height: 1px;
   float: left;
}

.right-column
{
    width: 500px;
    min-height: 1px;
    float: left;
}
Engineeroholic
quelle
4
min-heightist die beste Lösung
Vall3y
Die Mindesthöhe behebt nur das Problem mit width. Es verhindert jedoch nicht, dass das div eine Höhe von Null hat. (Versuchen Sie, den div-Hintergrund einzustellen, um das Problem zu sehen). Daher & nbsp; ist eine allgemeinere Lösung. Auch der Inhalt: "." behebt das Nullhöhenproblem.
John Henckel
1
Eine minimale Höhe = 1px ist nicht gleich 0! es wird 1 px sein, wenn Sie Standardhöhe wollen, können Sie einfach min-height = 100px und min width = 100px sagen, das div wird immer 100x100 sein, auf keinen Fall wird es 0 sein
Engineeroholic
Und "& nbsp" zu verwenden ist eine sehr schlechte Praxis. Was ist, wenn Sie eine große Website mit vielen Dateien haben und jede Datei 10K-HTML-Zeilen hat? Wenn ich Ihrem Ansatz folge, werde ich am Ende "& nbsp" in jede Datei einfügen !! Was für eine Zeitverschwendung!? Was ist, wenn Sie eine benutzergenerierte Content-Website haben? Beispiel: Ein Benutzer sendet einen leeren Kommentar. Basierend auf Ihrer Lösung muss ich einen Code erstellen, um zu überprüfen, ob der Kommentar leer ist, und dann "& nbsp" (ohne Komplikationen ohne Komplikationen) hinzufügen. Min-Höhe und Min-Breite sind die beste Lösung weil ich es einmal schreiben werde und mir keine Sorgen mehr machen werde, auch wenn ich in Zukunft mehr Inhalte hinzufüge
Engineeroholic
22

Fügen Sie einfach ein Leerzeichen mit der Breite Null in ein Pseudoelement ein

.class:after {
    content: '\200b';
}
Blowsie
quelle
Oooh, ich mag diese Idee, da sie bedeutet, dass der Benutzer sie nicht versehentlich kopiert und einfügt, da Pseudoelemente standardmäßig nicht auswählbar sind.
Domino
3

Dies ist eine Möglichkeit:

.your-selector:empty::after {
    content: ".";
    visibility: hidden;
}
vothaison
quelle
1
Ich empfehle content: "\200b";für einen Raum mit einer Breite von Null . Ein zusätzlicher Vorteil ist, dass der Browser dieses Zeichen nicht auswählt (z. B. CTRL+A CTRL+Cverhält er sich immer noch gleich).
yyny
3

Sie können:

o Stellen Sie ein .kundregister_grid_1:

  • width(oder width-min) mit height(oder min-height)
  • oder padding-top
  • oder padding-bottom
  • oder border-top
  • oder border-bottom

o Oder verwenden Sie Pseudoelemente : ::beforeoder ::aftermit:

  • {content: "\200B";}
  • oder {content: "."; visibility: hidden;}.

o Oder &nbsp;in ein leeres Element einfügen, dies kann jedoch manchmal zu unerwarteten Effekten führen, z. in Kombination mittext-decoration: underline;

simhumileco
quelle
2

Warum nicht einfach "min-width" zu Ihrer CSS-Klasse hinzufügen?

MrTombola
quelle
2

  funktioniert aber das ist nicht richtig ich denke die w min-höhe: 1px;

SM Mahmodul Hassan
quelle
1

Bei Verwendung des Inline-Blocks verhält es sich wie ein Inline-Objekt. Es sind also keine Schwimmer erforderlich, um sie in einer Linie nebeneinander zu bringen. Und tatsächlich, wie Rito sagte, brauchen Schwimmer einen "Körper", so wie sie Dimensionen brauchen.

Ich stimme Pekka in Bezug auf die Verwendung von Tabellen voll und ganz zu. Jeder, der Layouts mit Divs erstellt, vermeidet Tabellen, als wäre es eine Krankheit. Aber verwenden Sie sie für tabellarische Daten! Dafür sind sie da. Und in deinem Fall denke ich, dass du sie brauchst :)

ABER wenn du wirklich wirklich willst was du willst. Es gibt einen CSS-Hack-Weg. Gleich wie der Float Hack.

.kundregister_grid_1:after {  content: ".";  }

Fügen Sie dieses hinzu und Sie sind auch eingestellt: D (Hinweis: funktioniert nicht im IE, aber das kann behoben werden)

no1cobla
quelle
1

Wenn sie schweben müssen, können Sie die Mindesthöhe immer auf 1 Pixel einstellen, damit sie nicht zusammenfallen.

mmmeff
quelle
0

Beim Erstellen eines benutzerdefinierten Satzes von Layout-Tags habe ich eine andere Antwort auf dieses Problem gefunden. Hier finden Sie die benutzerdefinierten Tags und ihre CSS-Klassen.

HTML

<layout-table>
   <layout-header> 
       <layout-column> 1 a</layout-column>
       <layout-column>  </layout-column>
       <layout-column> 3 </layout-column>
       <layout-column> 4 </layout-column>
   </layout-header>

   <layout-row> 
       <layout-column> a </layout-column>
       <layout-column> a 1</layout-column>
       <layout-column> a </layout-column>
       <layout-column> a </layout-column>
   </layout-row>

   <layout-footer> 
       <layout-column> 1 </layout-column>
       <layout-column>  </layout-column>
       <layout-column> 3 b</layout-column>
       <layout-column> 4 </layout-column>
   </layout-footer>
</layout-table>

CSS

layout-table
{
    display : table;
    clear : both;
    table-layout : fixed;
    width : 100%;
}

layout-table:unresolved
{
    color : red;
    border: 1px blue solid;
    empty-cells : show;
}

layout-header, layout-footer, layout-row 
{
    display : table-row;
    clear : both;   
    empty-cells : show;
    width : 100%;
}

layout-column 
{ 
    display : table-column;
    float : left;
    width : 25%;
    min-width : 25%;
    empty-cells : show;
    box-sizing: border-box;
    /* border: 1px solid white; */
    padding : 1px 1px 1px 1px;
}

layout-row:nth-child(even)
{ 
    background-color : lightblue;
}

layout-row:hover 
{ background-color: #f5f5f5 }

Der Schlüssel hier ist die Box-Dimensionierung und Polsterung.

E Net Arch
quelle