CSS komórka tabeli równa szerokość

148

Mam nieokreśloną liczbę elementów komórek tabeli w kontenerze tabeli.

<div style="display:table;">
  <div style="display:table-cell;"></div>
  <div style="display:table-cell;"></div>
</div>

Czy istnieje czysty sposób CSS na uzyskanie równej szerokości komórek tabeli, nawet jeśli zawierają one zawartość o różnej wielkości?

Dzięki.

Edycja: posiadanie maksymalnej szerokości wymagałoby wiedzy, ile masz komórek?

Złupić
źródło
Jak jest określana liczba kolumn: po stronie klienta czy serwera?
iambriansreed
Po wypróbowaniu kilku metod, myślę, że jeśli chcesz mieć wiele wierszy i chcesz, aby miały one równą szerokość, użyj flexboksa zamiast tabeli
Eric

Odpowiedzi:

299

Oto działające skrzypce z nieokreśloną liczbą komórek: http://jsfiddle.net/r9yrM/1/

Możesz ustalić szerokość dla każdego rodzica div( tabeli ), w przeciwnym razie będzie to 100% jak zwykle.

Sztuczka polega na użyciu table-layout: fixed;i pewnej szerokości każdej komórki, aby ją wywołać, tutaj 2%. To uruchomi drugi algorytm tabeli, ten, w którym przeglądarki bardzo starają się przestrzegać wskazanych wymiarów.
Przetestuj w przeglądarce Chrome (i IE8 - w razie potrzeby). Jest w porządku z niedawnym Safari, ale nie pamiętam zgodności tej sztuczki z nimi.

CSS (odpowiednie instrukcje):

div {
    display: table;
    width: 250px;
    table-layout: fixed;
}

div > div {
    display: table-cell;
    width: 2%; /* or 100% according to OP comment. See edit about Safari 6 below */
}

EDYCJA (2013): Uważaj na Safari 6 na OS X, ma table-layout: fixed; zły (a może po prostu inny, bardzo różniący się od innych przeglądarek. Nie sprawdzałem układu tabeli CSS2.1 REC;)). Przygotuj się na różne wyniki.

FelipeAls
źródło
1
Dzięki, to wydaje się być odpowiedzią. Nie wiem dlaczego, ale jeśli ustawię szerokość na 2%, to w rzeczywistości przeskoczy każdą kolumnę do 2%. Ale wydaje się, że 100% działa świetnie. Masz pojęcie, co się tam dzieje?
Harry
3
Natknąłem się na ten sam problem z koniecznością używania 100% szerokości w komórkach tabeli. Działo się tak z powodu poprawek zastosowanych do elementu nadrzędnego z display: table. Ponieważ komórki o szerokości 100% nie działają w IE8, rozwiązaniem dla mnie było usunięcie poprawki clearfix. Mam nadzieję, że to komuś pomoże.
Alex Barrett,
Aby to rozwinąć, działa to w przypadku prostych układów (1x1, 2x2, 3x3 itd.), Ale złożone układy (1x3x1, 1x2x3x4 itd.) Wymagają dodatkowych divs, które display:tablemają być używane tak, jakby były rzędami, a nie display:tabl-rowtak , jak niektórzy mogą się spodziewać. Przykład tutaj .
filoxo
2
100% szerokości nie działało w IE8 (niespodzianka), ale początkowa sugestia dla 2% zapewnia prawidłowe wyniki.
1
100% szerokości również nie działało w IE10. To nie praca w IE11. A 1% szerokości sprawiło, że Mobile Safari wyświetla bardzo wąskie kolumny. Skończyło się na tym, że użyłem hacka CSS na IE9 i IE10: .my-cell { width: 100%; }; @media screen and (min-width:0\0) { .my-cell { width: 1%; } }hack CSS pochodzi stąd: stackoverflow.com/a/24321386/6962
Henrik N
29

HTML

<div class="table">
    <div class="table_cell">Cell-1</div>
    <div class="table_cell">Cell-2 Cell-2 Cell-2 Cell-2Cell-2 Cell-2</div>
    <div class="table_cell">Cell-3Cell-3 Cell-3Cell-3 Cell-3Cell-3</div>
    <div class="table_cell">Cell-4Cell-4Cell-4 Cell-4Cell-4Cell-4 Cell-4Cell-4Cell-4Cell-4</div>
</div>

CSS

.table{
    display:table;
    width:100%;
    table-layout:fixed;
}
.table_cell{
    display:table-cell;
    width:100px;
    border:solid black 1px;
}

PRÓBNY.

Alpha
źródło
Skrzypce tutaj nie działają. Komórki mają zawsze 25%.
netAction
To rozwiązanie nie jest bardzo skalowalne w przypadku niczego dynamicznego, takiego jak nawigacja w witrynie kontrolowana przez klienta.
Eric K
Prawdopodobnie masz rację i przy okazji, ma prawie dwa lata anser @QuantumDynamix. Masz na myśli coś lepszego? Podziel się swoim pomysłem, pokaż światu lepsze rzeczy :-)
Alpha
15

Samo użycie max-width: 0w display: table-cellelemencie zadziałało dla mnie:

.table {
  display: table;
  width: 100%;
}

.table-cell {
  display: table-cell;
  max-width: 0px;
  border: 1px solid gray;
}
<div class="table">
  <div class="table-cell">short</div>
  <div class="table-cell">loooooong</div>
  <div class="table-cell">Veeeeeeery loooooong</div>
</div>

José Antonio Postigo
źródło
1
Po prostu czepiam się tutaj, ale 0pxto nie jest ważna jednostka. Po prostu powinno być 0.
Gavin
To zadziałało dla mnie, ale czy możesz wyjaśnić, jak to działa?
Emmanual
6

Zastąpić

  <div style="display:table;">
    <div style="display:table-cell;"></div>
    <div style="display:table-cell;"></div>
  </div>

z

  <table>
    <tr><td>content cell1</td></tr>
    <tr><td>content cell1</td></tr>
  </table>

Przyjrzyj się wszystkim problemom związanym z próbami sprawienia, aby elementy div działały jak tabele. Musieli dodać table-xxx, aby naśladować układy tabel

Tabele są obsługiwane i działają bardzo dobrze we wszystkich przeglądarkach. Po co ich porzucić? fakt, że musieli ich naśladować, jest dowodem, że wykonali swoją pracę i dobrze.

Moim zdaniem użyj najlepszego narzędzia do pracy i jeśli chcesz, aby dane tabelaryczne lub coś przypominającego tabele danych tabelarycznych po prostu działało.

Bardzo późna odpowiedź, którą znam, ale warto ją wyrazić.

DeveloperChris
źródło
2
+1, ponieważ działa i ponieważ CSS nadal, w 2014 roku nie robi tego poprawnie we wszystkich przeglądarkach.
Fuj
6
Czasami potrzebujesz układu tabelarycznego dla rzeczy, które nie są danymi tabelarycznymi. np Elementy nawigacyjne, które powinny używać <nav>, <ul>itp
Ben
1
Dla responsywnych idealnym rozwiązaniem jest układ oparty na elementach DIV. Wyświetlanie tabel na urządzeniach mobilnych to wrzód na dupie.
Pablo Rincon
Próba emulacji tabeli wyklucza projektowanie responsywne. Zgadzam się, jeśli chcesz responsywny projekt, stoły nie są dobrym wyborem.
DeveloperChris,
2
Tabele zostały stworzone do wyświetlania danych tabelarycznych: było, jest i będzie to elementy HTML używane do wyświetlania danych tabelarycznych, po co ktoś miałby je porzucić (w tym celu)? Układ tabeli nie jest naśladowany : od jakiegoś czasu jest częścią rekomendacji CSS2 i zdarza się, że domyślny układ tabel HTML jest display: table-etc(całkiem naturalnie). Nie spędzam dni na tworzeniu linków naśladujących elementy div lub div naśladujące tabele, zakresy lub dane wejściowe: po prostu używam CSS do stylizacji. Na koniec, powodzenia z IE9 w stosowaniu dowolnej innej wartości displaywłaściwości do elementów table, tr, td.
FelipeAls
1

to zadziała dla każdego

<table border="your val" cellspacing="your val" cellpadding="your val" role="grid" style="width=100%; table-layout=fixed">
<!-- set the table td element roll attr to gridcell -->
<tr>
<td roll="gridcell"></td>
</tr>
</table>

Będzie to również działać w przypadku danych tabeli utworzonych przez iterację

tcasante1
źródło
0

Proszę bardzo:

http://jsfiddle.net/damsarabi/gwAdA/

Nie możesz użyć width: 100px, ponieważ ekran jest typu table-cell. Możesz jednak użyć opcji Max-width: 100px. Twoje pudełko nigdy nie będzie większe niż 100 pikseli. ale musisz dodać przepełnienie: ukryte, aby upewnić się, że kontekt nie przeniknie do innych komórek. możesz także dodać spację: nowrap, jeśli chcesz zapobiec zwiększaniu się wysokości.

Sammy
źródło
0

Można to zrobić, ustawiając styl komórki tabeli na width: auto, a zawartość pustą. Kolumny mają teraz taką samą szerokość, ale nie zawierają treści.

Aby wstawić zawartość do komórki, dodaj za divpomocą css:

position: absolute;
left: 0;
top: 0;
right: 0;
bottom: 0;

Musisz także dodać position: relativedo komórek.

Teraz możesz umieścić rzeczywistą zawartość w opisanym powyżej div.

https://jsfiddle.net/vensdvvb/

RnMss
źródło