Come fare in modo che un div vuoto occupi spazio


104

Questo è il mio caso del sistema di rete 960:

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

Questo è il mio set di div, utilizzato come struttura della tabella.

CSS dice quanto segue:

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

Non importa la denominazione svedese. Voglio che i div vengano visualizzati anche se non hanno valori.

<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 questo caso, in questo caso non ci sono "Namn" e "Avn.Namn" nelle due colonne. Tuttavia, quando si esegue questo in Chrome, vengono rimossi e non spingono più gli altri div nell'ordine float:left. Quindi, se ho categorie negli stessi div sopra, i valori verrebbero inseriti nella categoria sbagliata.

Risposte:


64

funziona se rimuovi il floating. http://jsbin.com/izoca/2/edit

con float funziona solo se c'è del contenuto es &nbsp;


5
Un'altra risposta dice che inserire un'altezza minima lo farà funzionare quando fluttuato, e certamente nel mio caso ha funzionato. Se questo è sempre vero (ora, nel 2016), allora questa risposta è sbagliata. Puoi semplicemente aggiungere min-height: 1px; alla larghezza: 140px; senza la necessità di rimuovere il float o aggiungere contenuto.
Nick Rice

Provato element.text("&nbsp;");in jQuery e &nbsp;appare sulla pagina.
Lori

54

Prova ad aggiungere &nbsp;agli elementi vuoti.

Non capisco perché non stai usando un <table>qui, però? Faranno questo genere di cose automaticamente.


9
Concordato. Se sono dati tabulari, usa una tabella: è a questo che servono.
Dan Diplo

5
Dopo tutto questo tempo, la gente pensa ancora <table>== BAD.
Saluce

4
L'utilizzo &nbsp;di una soluzione così diffusa può causare problemi in alcuni scenari. Come quando si barrano ( text-decoration: line-through;) il testo, il tratto verrà visualizzato &nbsp;, mentre quello che si vuole veramente è solo un div vuoto.
Izhaki

1
@Pekka 웃, non è sempre possibile "usare le tabelle". Ho lo stesso problema ("Come fare in modo che un div vuoto occupi spazio") per un design reattivo in cui trasformo una tabella orizzontale in una tabella verticale quando la larghezza è breve. Sto già usando le tabelle ...
ANeves

@ANeves una tabella spazierà sempre correttamente la larghezza in questo caso, però, no? Non sono sicuro di seguire ...
Pekka

25

Leggero aggiornamento alla risposta @ no1cobla. Questo nasconde il periodo. Questa soluzione funziona in IE8 +.

.class:after
{
    content: '.';
    visibility: hidden;
}

5
Se vuoi usarlo come riserva per lavorare proprio quando il tuo elemento è vuoto, aggiungi qualcosa come:.class:after:empty
Miguel Garrido

1
@Miguel Garrido - Ho dovuto usare .class: empty: after perché funzionasse.
seconda persona il

24

Una soluzione semplice per div con float vuoti è aggiungere:

  • larghezza (o larghezza minima)
  • min-height

in questo modo puoi mantenere la funzionalità float e costringerla a riempire lo spazio quando è vuota.

Uso questa tecnica nelle colonne del layout di pagina, per mantenere ogni colonna nella sua posizione anche se le altre colonne sono vuote.

Esempio:

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

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

4
min-heightè la soluzione migliore
Vall3y

L'altezza minima risolve solo il problema con width. Tuttavia, non impedisce al div di avere altezza zero. (prova a impostare lo sfondo del div per vedere il problema). Pertanto & nbsp; è una soluzione più generale. Anche il contenuto: "." risolve il problema dell'altezza zero.
John Henckel

1
Un min-height = 1px non è uguale a 0! sarà 1 px, se vuoi l'altezza predefinita puoi semplicemente dire min-height = 100px e min width = 100px, il div sarà sempre 100x100 in nessun modo sarà 0
Engineeroholic

E usare "& nbsp" è una pessima pratica, cosa succede se hai un grande sito web con molti file e ogni file ha 10K righe html? se seguirò il tuo approccio finirò per mettere "& nbsp" all'interno di ognuno in ogni file !! Che spreco di tempo!? cosa succede se si dispone di un sito Web con contenuti generati dagli utenti? ad esempio un utente invia un commento vuoto .. in base alla tua soluzione devo creare un codice per verificare se il commento è vuoto, quindi aggiungi "& nbsp" (complicando eccessivamente senza una buona ragione) min-height e min-width è la soluzione migliore perché lo scriverò una volta e non me ne preoccuperò più, anche se aggiungerò altri contenuti in futuro
Engineeroholic

22

Aggiungi semplicemente uno spazio di larghezza zero all'interno di uno pseudo elemento

.class:after {
    content: '\200b';
}

Oooh, mi piace questa idea poiché significa che l'utente non la copia e incolla accidentalmente, poiché gli pseudo-elementi non sono selezionabili per impostazione predefinita.
Domino

3

Questo è un modo:

.your-selector:empty::after {
    content: ".";
    visibility: hidden;
}

1
Consiglio content: "\200b";per uno spazio di larghezza zero . Un ulteriore vantaggio è che il browser non selezionerà questo carattere (es. CTRL+A CTRL+CContinuerà a comportarsi allo stesso modo).
yyny

3

Puoi:

o Imposta .kundregister_grid_1su:

  • width(o width-min) con height(o min-height)
  • o padding-top
  • o padding-bottom
  • o border-top
  • o border-bottom

o Oppure usa pseudo-elementi : ::beforeo ::aftercon:

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

o Oppure mettere &nbsp;all'interno un elemento vuoto, ma questo a volte può portare effetti inaspettati ad es. in combinazione context-decoration: underline;


2

Perché non aggiungere semplicemente "min-width" alla tua classe css?



1

Con l'utilizzo del blocco in linea si comporterà come un oggetto in linea. quindi nessun galleggiante necessario per metterli uno accanto all'altro su una riga. E infatti, come diceva Rito, i galleggianti hanno bisogno di un "corpo", come se avessero bisogno di dimensioni.

Sono totalmente d'accordo con Pekka sull'uso delle tabelle. Tutti quelli che costruiscono layout usando le tabelle di evitamento di div come se fosse una malattia. Ma usali per i dati tablolari! Ecco a cosa servono. E nel tuo caso penso che tu ne abbia bisogno :)

MA se vuoi davvero quello che vuoi. C'è un modo per hackerare CSS. Come il float hack.

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

Aggiungi quello e sei anche impostato: D (Nota: non funziona in IE, ma è risolvibile)


1

Se devono essere flottati, puoi sempre impostare l'altezza minima su 1px in modo che non collassino.


0

Costruendo un set personalizzato di tag di layout, ho trovato un'altra risposta a questo problema. Qui viene fornito il set personalizzato di tag e le loro classi CSS.

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 }

La chiave qui è il dimensionamento della scatola e l'imbottitura.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.