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

Jake
źródło
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,
możliwy duplikat szerokości td tabeli CSS - stała, nieelastyczna
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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.

Pigułki wybuchowe
źródło
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

Hugo Yates
źródło
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ć.

Matthew Brown
źródło
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

He Hui
źródło
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 to działa.

<table>
<thead>
<tr>
<td width="300">need 300px</td>
amirali shahinpour
źródło
1
ŁAŁ! Dziękuję ♥
ivahidmontazer
Dodaj wyjaśnienie, dlaczego / jak ten kod pomaga PO. Pomoże to znaleźć odpowiedź, z której przyszli widzowie będą mogli się czegoś nauczyć. Zobacz to pytanie Meta i odpowiedzi, aby uzyskać więcej informacji.
Heretic Monkey
1
Zauważ, że atrybut szerokości jest przestarzały w HTML5.
simhumileco
5

Spróbuj użyć

table {
  table-layout: auto;
}

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

sambrmg
źródło
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

Cyan Baltazar
źródło
3

Moje szalone rozwiązanie.)

$(document).ready(function() {
    $("td").each(function(index) { 
    var htmlText = "<div style='width:300px;'>" + $(this).text() +"</div>";
    $(this).html(htmlText);
  });
});
mathewsun
źródło
2

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

Dally S
źródło
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 .

simhumileco
źródło
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.

KernelCurry
źródło