Como fazer um div vazio ocupar espaço

104

Este é o meu caso de sistema de grade 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>

Este é meu conjunto de divs, usado como estrutura de tabela.

CSS diz o seguinte:

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

Não se importe com o nome sueco. Quero que os divs sejam exibidos, embora não tenham valores.

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

Assim, neste caso, não há 'Namn' e 'Avn.Namn' nas duas colunas. No entanto, ao executar isso no cromo, eles são removidos e não empurram mais os outros divs no pedido float:left. Portanto, se eu tiver categorias nos mesmos divs acima, os valores serão colocados na categoria errada.

Oldek
fonte

Respostas:

64

funciona se você remover o flutuante. http://jsbin.com/izoca/2/edit

com flutuadores só funciona se houver algum conteúdo, por exemplo &nbsp;

Rito
fonte
5
Outra resposta diz que colocar uma altura mínima fará com que funcione quando flutuado e, certamente, no meu caso isso funcionou. Se isso for sempre verdade (agora, em 2016), então a resposta está errada. Você pode apenas adicionar min-height: 1px; para a largura: 140px; sem a necessidade de remover o flutuador ou adicionar conteúdo.
Nick Rice
Tentei element.text("&nbsp;");no jQuery e &nbsp;aparece na página.
Lori
54

Tente adicionar &nbsp;aos itens vazios.

Não entendo por que você não está usando um <table>aqui? Eles farão esse tipo de coisa automaticamente.

Pekka
fonte
9
Acordado. Se forem dados tabulares, use uma tabela - é para isso que servem.
Dan Diplo
5
Depois de todo esse tempo, as pessoas ainda assumem <table>== RUIM.
saluce de
4
O uso &nbsp;, por mais que seja uma solução popular, pode causar problemas em alguns cenários. Como quando você riscado ( text-decoration: line-through;) o texto, o traço aparecerá &nbsp;, enquanto o que você realmente deseja é apenas um div em branco.
Izhaki
1
@Pekka 웃, nem sempre é possível "usar tabelas". Eu tenho o mesmo problema ("Como fazer uma div vazia ocupar espaço") para um design responsivo onde transformo uma mesa horizontal em uma mesa vertical quando a largura é curta. Já estou usando tabelas ...
ANeves 07/03/2016
@ANeves uma tabela sempre irá espaçar a largura corretamente neste caso, entretanto, não? Não tenho certeza se estou entendendo ....
Pekka
25

Ligeira atualização para a resposta @ no1cobla. Isso esconde o período. Esta solução funciona no IE8 +.

.class:after
{
    content: '.';
    visibility: hidden;
}
Jonathan
fonte
5
Se você quiser usar isso como um substituto para o trabalho apenas quando seu elemento está vazio, adicione algo como:.class:after:empty
Miguel Garrido
1
@Miguel Garrido - Tive que usar .class: empty: depois para que funcionasse.
segunda pessoa
24

Uma solução simples para divs flutuantes vazios é adicionar:

  • largura (ou largura mínima)
  • altura mínima

desta forma, você pode manter a funcionalidade de flutuação e forçá-la a preencher o espaço quando vazio.

Eu uso essa técnica em colunas de layout de página, para manter cada coluna em sua posição, mesmo se as outras colunas estiverem vazias.

Exemplo:

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

.right-column
{
    width: 500px;
    min-height: 1px;
    float: left;
}
Engineeroholic
fonte
4
min-heighté a melhor solução
Vall3y
O min-altura única corrige o problema com width. No entanto, isso não impede que o div tenha altura zero. (tente definir o fundo div para ver o problema). Portanto, & nbsp; é uma solução mais geral. Também o conteúdo: "." corrige o problema de altura zero.
John Henckel
1
A min-height = 1px não é igual a 0! será 1 px, se você quiser a altura padrão, você pode simplesmente dizer min-height = 100px e min width = 100px, o div sempre será 100x100 de forma alguma será 0
Engineeroholic
E usar "& nbsp" é uma prática muito ruim, e se você tiver um grande site com muitos arquivos e cada arquivo tiver 10 mil linhas html? se eu seguir sua abordagem, acabarei colocando "& nbsp" dentro de cada um em cada arquivo !! que perda de tempo!? e se você tiver um site de conteúdo gerado pelo usuário? por exemplo, um usuário envia um comentário vazio .. com base em sua solução, tenho que construir um código para verificar se o comentário está vazio, em seguida, adicionar "& nbsp" (complicando sem razão) min-height e min-width é a melhor solução porque vou escrever uma vez e não vou me preocupar com isso novamente, mesmo se eu adicionar mais conteúdo no futuro
Engineeroholic
22

Basta adicionar um caractere de espaço de largura zero dentro de um pseudoelemento

.class:after {
    content: '\200b';
}
Blowsie
fonte
Oooh, eu gosto dessa ideia, pois significa que o usuário não irá copiar e colar acidentalmente, pseudo-elementos sendo não selecionáveis ​​por padrão.
Domino
3

Esta é uma maneira:

.your-selector:empty::after {
    content: ".";
    visibility: hidden;
}
Vothaison
fonte
1
Eu recomendo content: "\200b";para um espaço de largura zero . A vantagem adicional é que o navegador não selecionará esse caractere (por exemplo CTRL+A CTRL+C, ainda se comportará da mesma forma).
yyny
3

Você pode:

o Definir .kundregister_grid_1como:

  • width(ou width-min) com height(ou min-height)
  • ou padding-top
  • ou padding-bottom
  • ou border-top
  • ou border-bottom

o Ou use pseudo-elementos : ::beforeou ::aftercom:

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

o Ou coloque &nbsp;dentro de um elemento vazio, mas isso às vezes pode trazer efeitos inesperados, por exemplo. em combinação comtext-decoration: underline;

simhumileco
fonte
2

Por que não apenas adicionar "min-width" à sua classe css?

MrTombola
fonte
2

  funciona mas não está certo acho que w min-height: 1px;

SM Mahmodul Hassan
fonte
1

Com o uso do bloco embutido, ele se comportará como um objeto embutido. portanto, nenhum flutuador precisa colocá-los um ao lado do outro em uma linha. E, de fato, como disse Rito, os carros alegóricos precisam de um "corpo", assim como precisam de dimensões.

Eu concordo totalmente com Pekka sobre o uso de tabelas. Todo mundo que constrói layouts usando div evita tabelas como se fosse uma doença. Mas use-os para dados tabulares! É para isso que eles servem. E no seu caso, acho que você precisa deles :)

MAS se você realmente quer o que quer. Existe uma maneira de hack css. O mesmo que o hack do float.

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

Adicione esse e você também está definido: D (Observação: não funciona no IE, mas pode ser corrigido)

no1cobla
fonte
1

Se eles precisarem ser flutuados, você sempre pode definir a altura mínima para 1px para que não colapsem.

mmmeff
fonte
0

Ao construir um conjunto personalizado de tags de layout, encontrei outra resposta para esse problema. É fornecido aqui o conjunto personalizado de tags e suas classes 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 }

A chave aqui é o tamanho da caixa e preenchimento.

E Net Arch
fonte