Wie ein Tic-Tac-Toe-Brett. Ich habe neulich darüber nachgedacht, wie man eine Tabelle nur mit inneren Rändern erstellt, wie man das eben so macht. Mir fallen drei Wege ein. Einer davon erfordert eine ganze Reihe von Regeln und ist die Art, wie ich intuitiv denke. Einer verwendet ein veraltetes Attribut, und einer ist sehr einfach und fühlt sich ein bisschen wie ein CSS-Trick an.

Möglichkeit #1) Die nicht benötigten Ränder entfernen
Das ist die erste Methode, die mir einfällt. Füge überall einen Rand hinzu und entferne dann den Rand auf der
- Oberseite jeder Zelle in der ersten Zeile
- Unterseite jeder Zelle in der letzten Zeile
- Linken Seite der ersten Zelle in jeder Zeile
- Rechten Seite der letzten Zelle in jeder Zeile
table {
border-collapse: collapse;
}
table td {
border: 5px solid black;
}
table tr:first-child td {
border-top: 0;
}
table tr td:first-child {
border-left: 0;
}
table tr:last-child td {
border-bottom: 0;
}
table tr td:last-child {
border-right: 0;
}
Möglichkeit #2) Das rules Attribut
Dies wird nicht empfohlen, da es ein veraltetes Attribut ist. Aber genau dafür war das rules Attribut gedacht.
Sie können die Farbe mit border-color steuern, aber nicht border-width oder border-style.
Möglichkeit #3) Verwendung von border-style: hidden;
Dies ist die, die sich für mich wie ein CSS-Trick anfühlt.
table {
border-collapse: collapse;
border-style: hidden;
}
table td {
border: 5px solid black;
}
MDN hat eine Erklärung
Im Falle von Tabellenzellen und Randkollaps hat der Wert `hidden` die höchste Priorität: Das bedeutet, dass, wenn ein anderer widersprüchlicher Rand gesetzt ist, dieser nicht angezeigt wird.
Indem man border-style: hidden; auf die Tabelle selbst anwendet, bedeutet dies, dass "hidden" am äußeren Rand gewinnt, aber nur am äußeren Rand, nicht an den anderen Rändern der inneren Zellen.
Möglichkeit #4: Verwenden der outline Eigenschaft
Carter Li schrieb darüber und forderte mich dann heraus
Vielleicht könnte etwas wie dieses Tic-Tac-Toe-Brett, das Chris vor einigen Jahren zusammengestellt hat, von
outlineprofitieren, anstatt auf individuell gestaltete Zellränder zurückzugreifen. Herausforderung angenommen, Herr Coyier? 😉
Ich muss diese Herausforderung annehmen! Es sieht so aus, als ob es dank outline-offset möglich ist!
table {
outline: 2px solid white;
outline-offset: -2px;
}
table td {
outline: 2px solid black;
}
Möglichkeit #5: Verläufe
Bonus! Temani Afif hat einen Weg gefunden, dies mit einem einzelnen konischen Verlauf zu tun. Es haut mich um, daher werde ich nicht versuchen, es zu erklären.
Können Sie sich andere Wege vorstellen?
Für keine dieser Techniken sind Overrides erforderlich. Das bedeutet, Sie könnten sie mit anderen Regeln kombinieren, die den umgebenden Tabellenrand festlegen, ohne sich um die Quellreihenfolge oder Spezifität kümmern zu müssen.
Nachbarselektor (
td + tdundtr + tr td)http://codepen.io/EvilOatmeal/pen/xgdOWw
Nicht-First-Child-Selektor (
td:not(:first-child)undtr:not(:first-child) td)http://codepen.io/EvilOatmeal/pen/QdvEmZ
Das scheint mir die sauberste Lösung zu sein
Das ist definitiv, wie ich es machen würde. Anstatt eine Regel festzulegen und sie dann zu überschreiben, wendet man das Styling einfach einmal dort an, wo es benötigt wird.
Der Nachbarselektor war auch mein erster Gedanke.
TIL über das `rules`-Attribut! Das Letzte ist ziemlich schlau – das muss ich ausprobieren, ich habe in letzter Zeit die `border-cancelling`-Methoden wie am Anfang des Artikels verwendet.
Ah! Das Letzte kannte ich nicht. Tabellen sind so alt und doch gibt es immer etwas Neues zu lernen, scheint es.
Ja, ich kann mir andere Wege vorstellen, aber sie sind nicht so schön, haha
http://codepen.io/MaxArt2501/pen/EZmgBo
Hier ist ein weiterer einfacher Weg, aber es ist wieder ein bisschen ein Hack.
http://codepen.io/paulobrien/full/wgdmZx/
Alles, was benötigt wird, ist, dem Tabellenelement einen transparenten Rand hinzuzufügen, der 1px breiter ist als der Rand der Zellen, und gemäß der Randkonfliktlösung wird der breitere Rand gegenüber dem schmaleren Rand bevorzugt.
Regel 3 hier
https://www.w3.org/TR/REC-CSS2/tables.html#border-conflict-resolution
Wie wäre es, einen
doubleRand hinzuzufügen, um die Außenseite zu überdecken?Es erzeugt ein paar seltsame schräge Linienenden in IE, funktioniert aber ansonsten anscheinend gut.