Jak sprawić, by pusty element div zajmował miejsce


105

Oto mój przypadek systemu siatki 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>

To jest mój zestaw elementów div, używany jako struktura tabeli.

CSS mówi, co następuje:

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

Nie przejmuj się szwedzkimi nazwami. Chcę, aby elementy div były wyświetlane, mimo że nie mają wartości.

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

Tak więc w tym przypadku nie ma „Namn” i „Avn.Namn” w dwóch kolumnach. Jednak po uruchomieniu tego w chrome są one usuwane i nie przesuwają już innych elementów div w kolejności float:left. Więc jeśli mam kategorie w tych samych elementach div powyżej, wartości zostaną umieszczone w niewłaściwej kategorii.

Odpowiedzi:


65

działa, jeśli usuniesz pływające. http://jsbin.com/izoca/2/edit

z pływakami działa tylko wtedy, gdy zawiera jakąś zawartość, np &nbsp;


5
Inna odpowiedź mówi, że wprowadzenie minimalnej wysokości sprawi, że będzie działać, gdy będzie pływać, a na pewno w moim przypadku zadziałało. Jeśli tak jest zawsze (teraz, w 2016 r.), To ta odpowiedź jest błędna. Możesz po prostu dodać min-height: 1px; do szerokości: 140px; bez konieczności usuwania pływaka lub dodawania zawartości.
Nick Rice

Wypróbowano element.text("&nbsp;");w jQuery i &nbsp;pojawia się na stronie.
Lori

56

Spróbuj dodać &nbsp;do pustych pozycji.

Nie rozumiem, dlaczego nie używasz <table>tutaj? Zrobią tego rodzaju rzeczy automatycznie.


9
Zgoda. Jeśli są to dane tabelaryczne, użyj tabeli - do tego służą.
Dan Diplo,

5
Po całym tym czasie ludzie nadal zakładają <table>== ZŁE.
saluce

4
Używanie &nbsp;tak popularnego rozwiązania może powodować problemy w niektórych scenariuszach. Podobnie jak w przypadku przekreślenia ( text-decoration: line-through;) tekstu, obrys pokaże się &nbsp;, podczas gdy to, czego naprawdę chcesz, to po prostu pusty element div.
Izhaki

1
@Pekka 웃, nie zawsze można "używać tabel". Mam ten sam problem („Jak sprawić, by pusty element div zajmował miejsce”) w przypadku projektu responsywnego, w którym przekształcam tabelę poziomą w tabelę pionową, gdy szerokość jest krótka. Już używam tabel ...
ANeves uważa, że ​​SE jest zły

@ANeves tabela zawsze będzie w tym przypadku odpowiednio ustawiać szerokość, ale nie? Nie jestem pewien, czy śledzę ....
Pekka

25

Nieznaczna aktualizacja odpowiedzi @ no1cobla. To ukrywa okres. To rozwiązanie działa w IE8 +.

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

5
Jeśli chcesz użyć tego jako rozwiązania zastępczego, aby działało tylko wtedy, gdy element jest pusty, dodaj coś takiego:.class:after:empty
Miguel Garrido

1
@Miguel Garrido - musiałem użyć .class: empty: after to zadziałało.
druga osoba

24

Prostym rozwiązaniem dla pustych pływających elementów div jest dodanie:

  • width (lub min-width)
  • min-wysokość

w ten sposób możesz zachować funkcjonalność pływającą i zmusić ją do wypełnienia przestrzeni, gdy jest pusta.

Używam tej techniki w kolumnach układu strony, aby utrzymać każdą kolumnę na swoim miejscu, nawet jeśli pozostałe kolumny są puste.

Przykład:

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

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

4
min-heightjest najlepszym rozwiązaniem
Vall3y

Minimalna wysokości tylko rozwiązuje problem z width. Jednak nie zapobiega to zerowej wysokości div. (spróbuj ustawić tło div, aby zobaczyć problem). Dlatego & nbsp; jest bardziej ogólnym rozwiązaniem. Również treść: „.” rozwiązuje problem z zerową wysokością.
John Henckel

1
Minimalna wysokość = 1 piksel nie równa się 0! to będzie 1 piksel, jeśli chcesz mieć domyślną wysokość, możesz po prostu powiedzieć min-wysokość = 100px i minimalna szerokość = 100px, element div zawsze będzie miał 100x100, nie ma mowy, będzie to 0
Inżynieroholik

Używanie „& nbsp” jest bardzo złą praktyką. Co zrobić, jeśli masz dużą witrynę internetową z wieloma plikami, a każdy plik ma 10 tys. Wierszy html? jeśli podążę za twoim podejściem, w końcu umieszczę "& nbsp" w każdym pliku !! co za strata czasu!? co się stanie, jeśli masz witrynę internetową z treścią generowaną przez użytkowników? np. użytkownik przesyła pusty komentarz .. na podstawie Twojego rozwiązania muszę zbudować kod, aby sprawdzić, czy komentarz jest pusty, a następnie dodać „& nbsp” (zbyt skomplikowane bez powodu) min-wysokość i min-szerokość to najlepsze rozwiązanie ponieważ napiszę to raz i nie będę się tym więcej martwić, nawet jeśli dodam więcej treści w przyszłości
Engineeroholic

22

Po prostu dodaj znak spacji o zerowej szerokości wewnątrz pseudoelementu

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

Ooo, podoba mi się ten pomysł, ponieważ oznacza to, że użytkownik nie skopiuje go przypadkowo, a pseudoelementy domyślnie nie mogą być wybierane.
Domino

3

To jest jeden sposób:

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

1
Polecam content: "\200b";dla przestrzeni o zerowej szerokości . Dodatkową zaletą jest to, że przeglądarka nie wybierze tego znaku (np. CTRL+A CTRL+CNadal będzie się zachowywał tak samo).
yyny,

3

Możesz:

o Ustaw .kundregister_grid_1na:

  • width(lub width-min) z height(lub min-height)
  • lub padding-top
  • lub padding-bottom
  • lub border-top
  • lub border-bottom

o Lub użyj pseudoelementów : ::beforelub ::afterz:

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

o Lub umieścić &nbsp;w pustym elemencie, ale czasami może to przynieść nieoczekiwane efekty, np. w połączeniu ztext-decoration: underline;




1

Używając inline-block, będzie zachowywał się jak obiekt wbudowany. więc nie potrzeba żadnych pływaków, aby umieścić je obok siebie w jednej linii. I rzeczywiście, jak powiedział Rito, pływaki potrzebują „ciała”, tak jak potrzebują wymiarów.

Całkowicie zgadzam się z Pekką co do używania tabel. Wszyscy, którzy budują układy przy użyciu elementów div, unikają tabel, jakby to była choroba. Ale używaj ich do danych tabelarycznych! Do tego są przeznaczone. A w twoim przypadku myślę, że ich potrzebujesz :)

ALE jeśli naprawdę naprawdę chcesz tego, czego chcesz. Istnieje sposób hakowania CSS. To samo co hack float.

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

Dodaj to i gotowe: D (Uwaga: nie działa w IE, ale można to naprawić)


1

Jeśli muszą być pływające, zawsze możesz ustawić minimalną wysokość na 1 piksel, aby się nie zwijały.


0

Tworząc niestandardowy zestaw znaczników układu, znalazłem inną odpowiedź na ten problem. Podano tutaj niestandardowy zestaw tagów i ich klas 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 }

Kluczem jest tutaj rozmiar pudełka i wypełnienie.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.