Das Hervorheben von Tabellenzeilen ist mit CSS ziemlich einfach. tr:hover { background: yellow; } funktioniert dort gut. Aber das Hervorheben von Spalten war schon immer etwas kniffliger, da es kein einzelnes HTML-Element gibt, das den Zellen einer Spalte übergeordnet ist. Ein Schuss JavaScript kann das leicht erledigen, aber Andrew Howe hat mir kürzlich eine kleine Methode geteilt, die er auf StackOverflow gefunden hat, gepostet von Matt Walton.
Es war ein paar Jahre alt, also dachte ich, ich würde es einfach aufräumen und hier posten.
Der Trick besteht darin, riesige Pseudo-Elemente an den <td>s zu verwenden, die durch den Tabellenüberlauf verborgen sind
Man weiß nicht wirklich, wie groß die Tabelle aus CSS-Sicht ist, also macht man die Pseudo-Elemente einfach super hoch mit einem negativen oberen Wert von der Hälfte davon.
table {
overflow: hidden;
}
tr:hover {
background-color: #ffa;
}
td, th {
position: relative;
}
td:hover::after,
th:hover::after {
content: "";
position: absolute;
background-color: #ffa;
left: 0;
top: -5000px;
height: 10000px;
width: 100%;
z-index: -1;
}
Der negative z-index hält es unter dem Inhalt. Negativer z-index ist ein lustiger Trick, aber Vorsicht, diese Tabelle kann dann nicht mehr in andere Elemente mit Hintergründen verschachtelt werden, sonst geht die Hervorhebung darunter verloren.
Das können Sie hier in Aktion sehen
Sehen Sie den Pen Zeilen- und Spaltenhervorhebung nur mit CSS von Chris Coyier (@chriscoyier) auf CodePen.
Funktioniert es mit Touch?
Pseudo-Klassen für Hover funktionieren auf Touch-Geräten nur so halbwegs. Erstens muss das Element fokussierbar sein, was Tabellenzellen standardmäßig nicht sind. Sie könnten sicherlich einen Klick-Event-Handler an die Tabellenzellen anhängen und alles in JavaScript erledigen, aber hier ist eine Methode, um den Großteil der Arbeit in CSS zu belassen.
// Whatever kind of mobile test you wanna do.
if (screen.width < 500) {
// :hover will trigger also once the cells are focusable
// you can use this class to separate things
$("body").addClass("nohover");
// Make all the cells focusable
$("td, th")
.attr("tabindex", "1")
// When they are tapped, focus them
.on("touchstart", function() {
$(this).focus();
});
}
Dann fügen Sie in CSS auch :focus-Stile hinzu.
td:focus::after,
th:focus::after {
content: '';
background-color: lightblue;
position: absolute;
left: 0;
height: 10000px;
top: -5000px;
width: 100%;
z-index: -1;
}
td:focus::before {
background-color: lightblue;
content: '';
height: 100%;
top: 0;
left: -5000px;
position: absolute;
width: 10000px;
z-index: -1;
}
In meiner finalen Demo habe ich die CSS-Selektoren etwas ausgefeilter gestaltet, um sicherzustellen, dass leere Tabellenzellen nichts auslösen, Tabellenköpfe in <thead> nur Spalten auswählen und Tabellenköpfe in <tbody> nur Zeilen auswählen.
Das können Sie in der finalen Demo sehen. Und hier funktioniert Touch.

Das ist großartig. Es wird mir bei einigen größeren Tabellen helfen, bei denen das Hervorheben von Zeilen und Spalten das Lesen der Tabellen erheblich erleichtert... Code für zukünftige Projekte gespeichert, danke fürs Posten.
Ich erinnere mich, gelesen zu haben, dass die Verwendung riesiger divs auch dann zu Leistungseinbußen führen kann, wenn sie über Overflow versteckt sind. Haben Sie dazu irgendwelche Details? Ähnlich wie beim alten Text-Ersetzungs-Trick text-index: -99999px;
Das ist „SUPER“ raffiniert. Ich werde das auf meiner Seite verwenden. Danke. Machen Sie weiter so mit exzellenter Arbeit.
In CSS 4 kommt ein neuer Spaltenselektor, der dies „nativ“ ermöglichen wird: https://grack.com/blog/2015/01/11/css-selectors-4/#column-combinator–and-nth-column
Die Browserunterstützung ist derzeit null, aber die Daumen sind gedrückt, dass es bald kommt.
Ja, ich glaube, dafür kann man auch einfach colgroup im HTML verwenden.
Wenn ich diesen Beitrag lese: Mir ist gerade erst aufgefallen, dass der Bug mit der absoluten Positionierung innerhalb einer td in FF behoben wurde. Darauf kann man sich in Zukunft gut verlassen.
Wirklich?! Um Himmels willen, endlich! :D Das war doch ein Bug, der etwa 15 Jahre alt war, seit Netscape!
Ich würde diesen Trick nicht verwenden, da w3c eindeutig besagt
„Die Auswirkung von ‚position:relative‘ auf die Elemente table-row-group, table-header-group, table-footer-group, table-row, table-column-group, table-column, table-cell und table-caption ist undefiniert.“
Es mag laut Spezifikation undefiniert sein, aber so ziemlich jeder Vendor stimmt inzwischen darin überein, dass es zumindest das Element als Offset-Parent definieren sollte.
Also kann man Elemente absolut innerhalb einer Zelle positionieren! Hurra!
Pseudo-Elemente zur Rettung... schon wieder!
Gut zu wissen für das nächste Mal, wenn ich eine Tabelle aufpeppen muss.
Ich stimme zu, Pseudo-Elemente sind unglaublich mächtig. Ich kreiere allerhand Magie mit ihnen. (Und das habe ich hier gelernt! Also danke dafür.)
Ich frage mich nur, ob man dort wegen Touch-Geräten etwas JS einfügt, dann kann man JS ja komplett verwenden, da es dann eine einzige JS-Lösung ist und kein CSS-Hacking benötigt, so etwas wie
und
Gibt es keinen genaueren Trigger für Touch?
screen.width < 500scheint ein „schmutziger“ Check zu sein.Ich denke, das ist eine lustige Sache zum Nachdenken. Soweit ich gehört habe, ist es „unmöglich, Touch zu testen“, also ist es vielleicht eine vergebliche Mühe? Bildschirmbreite scheint mir nicht allzu schlimm, da: gibt es relevante Beispiele für Bildschirme dieser Größe, die Touch *nicht* unterstützen? Und in diesen Fällen von Hybridgeräten ist es wahrscheinlich keine große Sache, dass sie hier keine Touch-Funktionalität erhalten, da sie nicht kritisch ist (in dieser völlig hypothetischen Situation).
Der beste Weg, die tatsächliche Anwesenheit von Touch zu erkennen, ist meiner Meinung nach, einfach auf ein Touchdown-Ereignis in der Erfassungsphase zu hören.
Dies funktioniert gut genug für alles, das keine Touch-spezifische Logik benötigt, bis ein Benutzer mit Inhalten zu interagieren beginnt.
Ich denke, selbst der Versuch, Touch anders zu behandeln als Maus oder jede andere Eingabemethode, ist der falsche Ansatz. Was ist mit Geräten, die beides unterstützen? Auf einem Touch-Notebook benutze ich vielleicht die Maus, aber um auf etwas in einer großen Tabelle (wie im Beispiel) zu zeigen, benutze ich vielleicht den Finger. Natürlich ist dies hauptsächlich für Windows-Geräte interessant, da OSX natürlich keine Touch-Screens unterstützt. Aber selbst auf z. B. Android-Tablets mit angeschlossener Maus ist dies ein Problem.
Ich schätze, der Einstieg mit Pointerevents ist eine verlorene Sache, da Google sie hasst, aber das wäre ein Punkt, sie zu nutzen (nicht sicher wie, aber das ist nicht mein Punkt).
Jedenfalls hasse ich Dinge, die auf dem Desktop funktionieren, aber z.B. auf meinem Surface nicht. Selbst kleine, aber nette Dinge wie diese Demo.
Entschuldigung, aber der Touch-Hack macht es noch beleidigender :-(
Sie können den Modernirz-Test verwenden -> Touch Events
if (Modernizr.touch) {
alert(‘Touch Screen’);
} else {
alert(‘No Touch Screen’);
}
http://modernizr.com/docs/#features-css
Auf der Download-Seite stellen Sie sicher, dass die Option Touch-Ereignisse ausgewählt ist.
Toller Artikel!
$(this).focus()→this.focus()Es ist wirklich großartig, ist es möglich, diesen Trick mit vorhandenen CSS-Dateien von WordPress-Tabellen-Plugins anzuwenden?
Haben Sie Nachforschungen darüber angestellt, ob diese wirklich riesigen Pixelgrößen oben und in der Höhe Leistungsprobleme verursachen? Oder sind die Browser schlau genug, nur die Mathematik durchzuführen, die gerenderte Form zu ermitteln und von dort auszugehen?
Super Teilen. Danke!!!
Wie kann ich nur die Zeile hervorheben?
Um nur eine Zeile hervorzuheben, setzen Sie eine Hintergrundfarbe auf
tr:hoverDemo
@Myriam @R. Otten
selbst wenn Sie wissen, dass das Gerät einen Touchscreen *unterstützt*, wissen Sie nicht, ob es ihn tatsächlich benutzt oder eine Maus, eine Tastatur oder Sprache oder was auch immer. Sie müssen also vorsichtig sein. Ich habe viele Websites gesehen, die auf Touchscreen „funktionieren“ und fehlschlagen, sobald ich auf demselben Gerät eine Maus benutze, was sooo nervig ist.
Sie können auch
colgroupund ein kleines bisschen jQuery verwenden, um dasselbe zu erreichen (Demo)HTML (fügen Sie für jede Spalte eine
colgrouphinzu)Skript
Eine einfache Lösung dafür ist, einen
z-indexfür die Tabelle anzugeben.Demo
Interessanter Punkt dazu – ich habe Schwierigkeiten gehabt, das Spalten-Pseudo-Element anzeigen zu lassen, bis ich den z-index entfernt habe. Danach hatte ich ein weiteres Problem, dass sich die Zeile nicht aktualisierte, wenn der Hover vertikal nach oben über das Spalten-Pseudo-Element bewegt wurde (man konnte eine Spalte mit der Zeile auf gleicher Höhe nach unten bewegen, aber wenn man sich wieder nach oben über die Spalte bewegte, aktualisierte sich die Zeile nicht).
Schließlich hatte ich die Idee, „pointer-events:none“ einzufügen, um Hover-Events über das Element zuzulassen.
(http://codepen.io/joshharrington/pen/gbjyNZ)
Dann müssen Sie nur noch beheben, wie Sie den Inhalt über die Spalte anzeigen!
Das funktioniert bei mir nur, wenn keine Hintergrundfarbe angegeben ist, auch nicht auf der Seite.