Ich habe es endlich richtig gemacht mit reinem CSS, indem ich diesen Anweisungen gefolgt bin:
http://tjvantoll.com/2012/11/10/creating-cross-browser-scrollable-tbody/
Der erste Schritt besteht darin, das auf display: block zu setzen, damit ein Überlauf und eine Höhe angewendet werden können. Von dort aus müssen die Zeilen im auf position: relative und display: block gesetzt werden, damit sie auf dem jetzt scrollbaren sitzen.
tbody, thead { display: block; overflow-y: auto; }
Weil das relativ positioniert ist, muss jede Tabellenzelle eine explizite Breite haben
td:nth-child(1), th:nth-child(1) { width: 100px; }
td:nth-child(2), th:nth-child(2) { width: 100px; }
td:nth-child(3), th:nth-child(3) { width: 100px; }
Aber leider reicht das nicht aus. Wenn eine Scrollleiste vorhanden ist, reservieren Browser dafür Platz. Daher hat das letztendlich weniger verfügbaren Platz als das . Beachten Sie die leichte Verschiebung, die dadurch entsteht...
Der einzige Workaround, den ich gefunden habe, war, auf allen Spalten außer der letzten eine min-width zu setzen.
td:nth-child(1), th:nth-child(1) { min-width: 100px; }
td:nth-child(2), th:nth-child(2) { min-width: 100px; }
td:nth-child(3), th:nth-child(3) { width: 100px; }
Gesamtes Codepen-Beispiel unten:
CSS:
.fixed_headers {
width: 750px;
table-layout: fixed;
border-collapse: collapse;
}
.fixed_headers th {
text-decoration: underline;
}
.fixed_headers th,
.fixed_headers td {
padding: 5px;
text-align: left;
}
.fixed_headers td:nth-child(1),
.fixed_headers th:nth-child(1) {
min-width: 200px;
}
.fixed_headers td:nth-child(2),
.fixed_headers th:nth-child(2) {
min-width: 200px;
}
.fixed_headers td:nth-child(3),
.fixed_headers th:nth-child(3) {
width: 350px;
}
.fixed_headers thead {
background-color: #333333;
color: #fdfdfd;
}
.fixed_headers thead tr {
display: block;
position: relative;
}
.fixed_headers tbody {
display: block;
overflow: auto;
width: 100%;
height: 300px;
}
.fixed_headers tbody tr:nth-child(even) {
background-color: #dddddd;
}
.old_ie_wrapper {
height: 300px;
width: 750px;
overflow-x: hidden;
overflow-y: auto;
}
.old_ie_wrapper tbody {
height: auto;
}
Html:
Name
Color
Description
Apple
Red
These are red.
Pear
Green
These are green.
Grape
Purple / Green
These are purple and green.
Orange
Orange
These are orange.
Banana
Yellow
These are yellow.
Kiwi
Green
These are green.
Plum
Purple
These are Purple
Watermelon
Red
These are red.
Tomato
Red
These are red.
Cherry
Red
These are red.
Cantelope
Orange
These are orange inside.
Honeydew
Green
These are green inside.
Papaya
Green
These are green.
Raspberry
Red
These are red.
Blueberry
Blue
These are blue.
Mango
Orange
These are orange.
Passion Fruit
Green
These are green.
EDIT: Alternativlösung für Tabellenbreite 100% (oben ist eigentlich für feste Breite und beantwortet die Frage nicht):
HTML:
Name
Color
Description
Apple
Red
These are red.
Pear
Green
These are green.
Grape
Purple / Green
These are purple and green.
Orange
Orange
These are orange.
Banana
Yellow
These are yellow.
Kiwi
Green
These are green.
CSS:
table {
width: 100%;
text-align: left;
min-width: 610px;
}
tr {
height: 30px;
padding-top: 10px
}
tbody {
height: 150px;
overflow-y: auto;
overflow-x: hidden;
}
th,td,tr,thead,tbody { display: block; }
td,th { float: left; }
td:nth-child(1),
th:nth-child(1) {
width: 20%;
}
td:nth-child(2),
th:nth-child(2) {
width: 20%;
float: left;
}
td:nth-child(3),
th:nth-child(3) {
width: 59%;
float: left;
}
/* einige Farben */
thead {
background-color: #333333;
color: #fdfdfd;
}
table tbody tr:nth-child(even) {
background-color: #dddddd;
}
Demo: http://codepen.io/anon/pen/bNJeLO