Używając CSS td szerokość bezwzględna, pozycja


103

Zobacz ten JSFIDDLE

td.rhead { width: 300px; }

Dlaczego szerokość CSS nie działa?

<table>
<thead>
<tr>
<td class="rhead">need 300px</td>
<td colspan="7">Week #0</td>
<td colspan="7">Week #1</td>
<!-- etc..-->
</tr>
<tr>
<td class="rhead"></td>
<td>S</td><td>M</td><td>T</td><td>W</td><td>T</td><td>F</td><td>S</td>
<td>S</td><td>M</td><td>T</td><td>W</td><td>T</td><td>F</td><td>S</td>
<!-- etc... -->
</tr>
<thead>
</table>

Jakie są również skutki położenia: ustalone, bezwzględne itp. Na szerokości td, jeśli takie istnieją? Szukam powodu bardziej niż poprawki. Mam nadzieję, że zrozumiem, jak to działa.

szerokość td jest inna niż 300 pikseli


display: table-cellnie szanuje width(w taki sam sposób, w jaki by to nie działało display: inline). Nie rozumiem, o co pytaszposition fixed|absolute
tabletki wybuchowe,

@ExplosionPills, ponieważ w moim rzeczywistym kodzie mam tabelę ustawioną na stałe. Jak można się domyślić, staram się uzyskać oś czasu u góry strony. Więc po prostu stwierdzam, że atrybut pozycji przypadku wpływa na szerokości.
Jake,

Odpowiedzi:


144

To może nie być to, co chcesz usłyszeć, ale display: table-cellnie uwzględnia szerokości i zostanie zwinięte na podstawie szerokości całego stołu. Możesz to łatwo obejść, umieszczając display: blockelement wewnątrz samej komórki tabeli, której szerokość określasz, np

<td><div style="width: 300px;">wide</div></td>

Nie powinno to mieć większego znaczenia, czy <table>samo jest position: fixedbezwzględne, czy też bezwzględne, ponieważ wszystkie pozycje komórek są statyczne względem tabeli.

http://jsfiddle.net/ExplosionPIlls/Mkq8L/4/

EDYCJA: Nie mogę wziąć kredytu, ale jak mówią komentarze, możesz min-widthzamiast tego użyć zamiast widthkomórki tabeli.


31
+1 - już wcześniej korzystałem z tego obejścia. Co dziwne, min-widthna TDnie wydają się działać w Chrome i FF: jsfiddle.net/Mkq8L/7
Tim Medora

2
Właściwie, jak zawsze, po opublikowaniu pytania stwierdzam, że to min-width: 300pxdziała! (@TimMedora byłeś kilka sekund szybszy!)
Jake,

Myślę, że najlepszą odpowiedzią jest wspomnienie zachowania display: table-cell. Dzięki!
Jake,

To zachowanie ma dla mnie sens: co powinno się stać, jeśli ustawisz dwie różne szerokości dla dwóch komórek w tej samej kolumnie? Ponieważ min-widthnie ma problemu, weź największy.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

3
To hack, nie polecam. Połączona szerokość td przekracza szerokość tabeli. To jest problem. Nie powinieneś tego naprawiać dodając więcej struktur HTML.
David

28

Lepiej jest używać table-layout: fixed

Wartością domyślną jest Auto, a przy dużych tabelach może powodować pewne opóźnienie po stronie klienta, gdy przeglądarka iteruje ją, aby sprawdzić, czy wszystkie rozmiary pasują.

Naprawiono jest znacznie lepsze i szybciej wyświetla się na stronie. Struktura tabeli jest zależna od całkowitej szerokości tabel i szerokości każdej z kolumn.

Tutaj jest to zastosowane do oryginalnego przykładu: JSFIDDLE , Zauważysz , że pozostałe kolumny są zgniecione i zachodzą na swoją zawartość. Możemy to naprawić, używając więcej CSS (wszystko, co musiałem zrobić, to dodać klasę do pierwszego TR):

    table {
        width: 100%;
        table-layout: fixed;
    }

    .header-row > td {
        width: 100px;
    }

    td.rhead {
        width: 300px
    }

Widziany w akcji tutaj: JSFIDDLE


11

Powodem, dla którego nie działa w podanym łączu, jest to, że próbujesz wyświetlić kolumnę 300px PLUS 52 kolumny, każda z 7 kolumn. Zmniejsz liczbę kolumn i działa. Nie możesz zmieścić tylu na ekranie.

Jeśli chcesz wymusić dopasowanie kolumn, spróbuj ustawić:

body {min-width:4150px;}

zobacz mój jsfiddle: http://jsfiddle.net/Mkq8L/6/ @mike Nie mogę jeszcze komentować.


2
+1 za odkrycie, że próg szerokości stołu rośnie wraz z szerokością korpusu.
Jake,

8

Powodem jest to, że nie określiłeś szerokości tabeli, a cała masa td jest przepełniona.

Na przykład dałem tabeli szerokość 5000 pikseli, co moim zdaniem będzie pasować do twoich wymagań.

table{
    width:5000px;
}

Jest to dokładnie ten sam kod, który podałeś, a ja po prostu dodałem do szerokości tabeli.

Wierzę, że to, co się dzieje, jest spowodowane tym, że twoje TD są daleko poza domyślną szerokością tabeli. Co możesz zobaczyć, jeśli wyciągniesz około 45 swoich td w każdym tr, (tj. Kod, który podałeś w swoim pytaniu, a nie jsfiddle), działa dokładnie dobrze


2
+1 za wzmiankę, że istnieje próg szerokości stołu. Problem polega na tym, że czasami nie znamy wcześniej całkowitej szerokości. Jaka jest domyślna szerokość tabeli?
Jake,

Właściwie nie wiem. Wiem tylko, że jeśli masz zbyt wiele kolumn, tabela się zmniejszy, sprawiając, że wszystkie szerokości węzłów podrzędnych będą bezużyteczne. Spotkałem się z tym wcześniej, ale jeszcze nie znalazłem wartości domyślnej. Może powinienem zadać to jako pytanie.
He Hui,

Uważam, że rozwiązałem ten problem stackoverflow.com/questions/14767459/…
He Hui

To jest właściwa odpowiedź, a nie wysoko oceniana. Szerokość można ustawić tylko wtedy, gdy zawartość nie przekracza całej szerokości tabeli.
David


5

Spróbuj użyć

table {
  table-layout: auto;
}

Jeśli używasz Bootstrap, klasa tablema table-layout: fixed;domyślnie.


4

Użyj właściwości układu tabeli i „stałej” wartości w tabeli.

table {
   table-layout: fixed;
   width: 300px; /* your desired width */
}

Po ustawieniu całej szerokości stołu, możesz teraz ustawić szerokość w% td.

td:nth-child(1), td:nth-child(2) {
   width: 15%;  
}

Możesz dowiedzieć się więcej na ten temat pod tym linkiem: http://www.w3schools.com/cssref/pr_tab_table-layout.asp


3

Moje szalone rozwiązanie.)

$(document).ready(function() {
    $("td").each(function(index) { 
    var htmlText = "<div style='width:300px;'>" + $(this).text() +"</div>";
    $(this).html(htmlText);
  });
});

2

Jeśli szerokość tabeli wynosi na przykład 100%, spróbuj użyć procentowej szerokości td, takiej jak 20%.


2

Zawijaj zawartość z pierwszej komórki w div, np. W ten sposób:

HTML:

<td><div class="rhead">a little space</div></td>

CSS:

.rhead {
  width: 300px;
}

Oto plik jsfiddle .


1

Możesz także użyć:

.rhead {
    width:300px;
}

ale będzie to tylko z niektórymi przeglądarkami, jeśli dobrze pamiętam, IE8 na to nie pozwala. Ogólnie rzecz biorąc, bezpieczniej jest po prostu umieścić width=""atrybut w <td>sobie.

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.