Ich bin auf das Feature-Tabellen-Design von Shopify auf Pattern Tap gestoßen und dachte mir: VERDAMMT SHOPIFY, das ist eine verdammt schicke Tabelle. Ich war inspiriert, es nachzuahmen. Zuerst in Photoshop, dann in HTML/CSS. Das Nachbauen von coolen Dingen, die man im Web findet, ist definitiv eine Übung, die ich empfehle (ein paar Tage später las ich dies – ich könnte dem nicht mehr zustimmen). Wie diese Übungen typischerweise, führte es mich auf einige interessante Wege.
Hier ist mein Nachbau

Demo anzeigen Dateien herunterladen
Der Markup
Hier ist das gekürzte HTML
<table id="feature-table">
<colgroup class="basic"></colgroup>
<colgroup class="plus"></colgroup>
<colgroup class="premium" id="featured"></colgroup>
<colgroup class="pro"></colgroup>
<thead>
<tr>
<th id="header-basic"><span>$15 Basic</span> <a class="button" href="#">Sign Up</a></th>
<th id="header-plus"><span>$35 Plus</span><a class="button" href="#">Sign Up</a></th>
<th id="header-premium"><span>$99 Premium</span><a class="button" href="#">Sign Up</a></th>
<th id="header-pro"><span>$150 Pro</span><a class="button" href="#">Sign Up</a></th>
</tr>
</thead>
<tbody>
<tr>
<td>50 pages</td>
<td>75 pages</td>
<td>Unlimited</td>
<td>Unlimited</td>
</tr>
<!-- More rows here -->
</tbody>
</table>
Ziemlich sauber. Das Einzige, was nicht perfekt sauber ist, ist der <span> im Header. Dort gibt es diesen ganzen schicken Farbverlauf und schicken Schriftzug. Theoretisch könnte das mit einer Menge CSS3 gemacht werden, aber wissen Sie, manchmal ist ein Bild einfach gut so, verdammt, besonders wenn es sich um CSS-Bildersetzung handelt, die perfekt zugänglich ist.
Bemerkenswert ist das <colgroup>-Element, das meiner Meinung nach unterbewertet wird. Colgroups ermöglichen es Ihnen, eine ganze Spalte von Tabellenzellen anzusprechen und Stile anzuwenden, auch wenn diese Tabellenzellen nicht tatsächlich Nachkommen der <colgroup> sind. Eine seltsame Vorstellung, aber es funktioniert und ist einfacher, als jeder einzelnen Tabellenzelle einen Klassennamen zu geben, der angibt, zu welcher Spalte sie gehört.
Wenn Sie ein schnelles Markup benötigen, habe ich etwas, das Sie auf HTML-Ipsum kopieren und einfügen können.
Das CSS
Jede Header-Zelle (<th>) hat eine ID. Wir werden ihnen eine feste Höhe geben und Hintergrundbilder dafür festlegen. Vertikale Ausrichtung unten mit etwas unterem Polster ermöglicht es uns, den Link-Button gleichmäßig zu platzieren. Der Span in diesen Headern wird über absolute Positionierung von der Seite geschoben (d. h. zugängliches Ausblenden).
#feature-table th { height: 120px; padding-bottom: 14px; vertical-align: bottom; }
#header-basic { background: url(../images/header-15.png) no-repeat; }
#header-plus { background: url(../images/header-35.png) no-repeat; }
#header-premium { background: url(../images/header-99.png) no-repeat; }
#header-pro { background: url(../images/header-150.png) no-repeat; }
#feature-table th span { position: absolute; top: -9999px; left: -9999px; }

Apropos Buttons. Ich habe einfach den CSS Button Maker verwendet, um schnell einen Button zu entwerfen, der meiner Meinung nach gut aussah und zum Farbschema passte, und den CSS-Code in diese Demo kopiert und eingefügt.
Um die Zellen einzufärben, habe ich einen Fallback-Hex-Code und dann einen HSLa-Farbwert festgelegt. Diese Klassennamen zielen auf die Colgroup-Elemente ab.
.basic { background-color: #d5e4bc; background-color: hsla(85, 30%, 80%, 1); }
.plus { background-color: #c1dcb7; background-color: hsla(110, 30%, 80%, 1); }
.premium { background-color: #bad6c8; background-color: hsla(150, 30%, 80%, 1); }
.pro { background-color: #bbd3dc; background-color: hsla(190, 30%, 80%, 1); }

Das Endergebnis ist zebragestreift und hat diese "Featured Column"-Funktion. Aber wir können das mit JavaScript angehen...
Das JavaScript
jQuery, offensichtlich. Wir können die Klasse "odd" für ungerade Tabellenzeilen und auch eine Klasse "final-row" mit jQuery super einfach anwenden
$("tr:odd").addClass("odd"); // Zebra action
$("tr:last").addClass("final-row"); // For extra padding
Die letzte Zeile hat zusätzliches Polster
Um die "Featured"-Spalte zu behandeln und semantisch zu bleiben, weisen wir der Colgroup einfach eine ID zu
<colgroup class="premium" id="featured"></colgroup>
Nun muss das JavaScript herausfinden, welche Spalte das ist.
// Figure out which column # is featured.
var featuredCol;
$("colgroup").each(function(i) {
if (this.id == "featured") featuredCol = i+1;
});
Jetzt werden wir durch alle Tabellenzellen schleifen und herausfinden, ob sich die Zelle in der Spalte direkt vor der Featured Column befindet (wenn ja, weisen wir eine Klasse "leftOfFeatured" zu) oder in der Spalte direkt nach der Featured Column (wenn ja, weisen wir eine Klasse "rightOfFeatured" zu).
Während wir dabei sind, können wir auch allen Tabellenzellen Klassennamen zuweisen, die ihre Spalte angeben. Colgroups sollten diesen Bedarf beseitigen, aber es stellt sich heraus, dass sie eine ziemlich signifikante Schwäche haben. Sie können nicht etwas tun wie
.basic .odd {
/*
.basic is the colgroup, .odd is the row
the row really isn't a descendant of the colgroup
in other words, this doen't work
*/
}
Dieses Design erfordert unterschiedliche Farbvariationen je nach Spalte. Also, während wir diesen Loop durchlaufen, werden wir einfach Klassennamen zu den Tabellenzellen hinzufügen und diese Klassennamen verwenden, um zu tun, was wir wollen.
// Apply classes to each table cell indicating column
// Also applies classes if cell is right or left of featured column
var numCols = $("colgroup").length;
$("td, th").each(function(i) {
$(this).addClass("table-col-" + ((i % numCols) + 1));
if (((i%numCols)+1) == (featuredCol-1)) $(this).addClass("leftOfFeatured");
if (((i%numCols)+1) == (featuredCol+1)) $(this).addClass("rightOfFeatured");
});
Die Variable i in dieser Funktion ist der Index. Sie gibt uns im Grunde an, auf welcher Iteration des Loops wir uns befinden. Also die 50. Tabellenzelle, die sie findet, der Index ist 49 (Index ist nullbasiert). Wenn wir also den Index modulo der Anzahl der Spalten nehmen (bestimmt durch Testen der Länge des jQuery-Sets) und eins addieren, haben wir die Nummer der Spalte, in der sich die Zelle befindet. Beispiel: 4 Spalten, 10. gefundene Zelle. 9 % 4 = 1, plus 1 ist 2, also ist die 10. Zelle in der 2. Spalte. Und somit erhält diese Zelle die Klasse "table-col-2".
Mit den .odd-Klassen der Zeile und den neuen table-col-x-Klassen können wir jetzt wirklich zebragestreift sein, wie das Design es verlangt
.odd .table-col-1 { background-color: #edf3e2; background-color: hsla(85, 30%, 94%, 1); }
.odd .table-col-2 { background-color: #edf3e2; background-color: hsla(110, 30%, 94%, 1); }
.odd .table-col-3 { background-color: #edf3e2; background-color: hsla(150, 30%, 94%, 1); }
.odd .table-col-4 { background-color: #e2ecf0; background-color: hsla(190, 30%, 94%, 1); }
Zebra-Aktion abgeschlossen.
Beachten Sie, dass es sich wieder um Hex-Code-Fallbacks und HSLa handelt. Das Tolle an der Verwendung von HSLa hier war, dass die Werte bis auf den dritten Wert (die "Helligkeit") exakt gleich sind. Wir erhöhen diesen Wert um 14% und das ist der wahrnehmbare Unterschied im Ton.
Die Klassen "leftOfFeatured" und "rightOfFeatured" wenden ein Hintergrundbild an, nur einen alpha-transparenten PNG-Schatten, der nach links bzw. rechts ausgerichtet und wiederholt ist.
.leftOfFeatured { background-image: url(../images/shadow-left.png); background-repeat: repeat-y; background-position: right center; }
.rightOfFeatured { background-image: url(../images/shadow-right.png); background-repeat: repeat-y; background-position: left center; }
Fazit
Das war's also, Leute. Es hat mir Spaß gemacht, etwas nachzubilden, das ich für großartig hielt, aber auf eine Art und Weise, wie "so würde ich es machen", anstatt ihren Code zu spähen. Ich empfehle diese Art von Übung sehr, wenn Ihr Zeitplan es zulässt.
Sehr schöner Nachbau, wenn ich das so sagen darf.
Hallo Chris,
Das ist ein wirklich großartiger Artikel und ich glaube nicht, dass er nur für HTML und CSS gilt. Das inspiriert mich wirklich, Dinge in meinem letzten Beitrag über Grafikdesign-Inspiration auf http://mographtv.com auszuprobieren.
Es wäre cool, schöne Designs nachzubauen, um meinen eigenen Sinn dafür zu verbessern.
Cooler Artikel,
Prost.
Genau das, was der Arzt verordnet hat, VIELEN DANK, Chris, DU BIST DER MANN !!!
Guter Artikel, es gibt jedoch einen Tippfehler. excise sollte exercise sein.
Das sieht wirklich gut aus und ist gut gemacht. Nützliche Dinge für einen Design-Noob wie mich :)
Ganz am Rande bemerkt, ich habe auf Ihrer Demoseite eine Anzeige für "HTML Rockstars" gesehen. Ich habe mir deren Website angesehen und den Quelltext betrachtet. Jesus, das ist ein seltsames Markup.
Jede Zeile wird vor einem HTML-Attribut umgebrochen. Es sieht einfach falsch aus. Es validiert aber, also gehe ich davon aus, dass das gut ist...
Nie gedacht, dass wir Tabellen dafür verwenden könnten.
Perfekt. Das ist so cool.
Wow, danke Chris für die netten Worte und dass du meinen Code nicht so hart beurteilst – er könnte definitiv verbessert werden :)
Chris,
Ich bin mir nicht sicher, wie gut das funktionieren würde oder nicht, aber ich wette, Sie könnten auch einige coole Stile erzielen, wenn Sie eine Hover-Eigenschaft zu colgroup hinzufügen. Würde gerne ein Update mit etwas Ähnlichem sehen.
-Chris
Hallo Chris, noch ein unglaublicher Artikel mit Beispiel. Ich nutze Ihre Beispiele oft zum Lernen und sie sind für mich so unschätzbar wertvoll. Wenn ich die Gelegenheit habe, verweise ich andere auf Ihre Website, damit sie vom Meister lernen können :) Sie sind der Mann, Chris.
Bringen Sie weiterhin gute Sachen und danke für alles, Kumpel.
Jim Zak
Macht die <colgroup> im Grunde dasselbe oder negiert sie die Notwendigkeit, <th scope=”col”> zu haben? Ich glaube nicht, dass ich colgroup jemals benutzt habe.
Ein zusammenfassendes Attribut in Ihrer Tabelle wäre eine schöne Ergänzung.
Ich gebe zu, ich habe "scope" selten bis nie verwendet. Ich denke, der Sinn von "scope" liegt eher in der Zugänglichkeit, um anzugeben, für welche Gruppe von Zellen dies ein Header ist. Zum Beispiel sind in dieser Tabelle die <th>-Elemente der Header für eine Informationsspalte, aber ein <th> könnte genauso gut verwendet werden, um eine Datenzeile zu überschreiben. Sie sollten es also "scopen", um anzugeben, was es ist.
<colgroup> hingegen erlaubt es Ihnen buchstäblich, Stile auf eine Spalte von Zellen anzuwenden, obwohl das <colgroup>-Element diese Zellen nicht tatsächlich "umschließt".
Das ist großartig, ich würde jQuery nicht verwenden, um hier irgendwelche Magie anzuwenden, aber ich liebe Ihre Philosophie zu all dem, Chris.
Optionen erkunden, zerlegen, aufbauen und das Endziel mit welchen Mitteln auch immer erreichen, die für Sie gerade passen.
100% der Zeit sind Ihre Artikel technisch einwandfrei und geeignet.
Wenn Sie jetzt Flash verwendet hätten, um das oben zu erreichen, wäre das lustig. Ich fordere Sie heraus.
Ziemlich beeindruckend, Chris! Ich mag, was Sie über das Nachbilden von Dingen gesagt haben, die Sie inspirieren – ich stimme dem definitiv zu.
Nebenbei bemerkt, ich habe mich gefragt, warum Sie jQuery verwendet haben, um abwechselnde Stile hinzuzufügen, anstatt :nth-of-type? Scheint die perfekte Anwendung für diesen Selektor zu sein :)
großartig!!! Chris, du hast Wahnsinnskenntnisse...
Vielen Dank. Dieser Artikel ist so großartig :) Eine Frage, wie können wir ein PSD-Preistabelle in HTML umwandeln? Denn es gibt viele schöne PSD-Preistabellen online, aber ich frage mich, wie Leute sie in CSS codieren können?
Ausgezeichnet, Chris. Sehr einfach zu folgen und eine großartige Grundlage für die Erstellung exzellenter Tabellendesigns.
Ich hätte die "Featured"-Spalte etwas breiter gemacht.
Der Schatten lässt es so aussehen, als ob die Spalte im Vordergrund ist, und sollte daher größer erscheinen.
Ich bin zu Shopify gegangen und das haben sie getan.
Hey, danke fürs Teilen deiner Ideen.
Nur ein kleiner Hinweis: Anstatt durch die Elemente zu iterieren, könnten wir die "index()"-Methode von jQuery verwenden, die meiner Meinung nach wirklich praktisch ist.
// Herauszufinden, welche Spalte # featured ist.
var featuredCol = ($("colgroup")).index($("#featured"));
Toller Artikel wie immer.. ;)
erstens, ziemlich langweilige Sache…
zweitens, und wichtiger, warum benutzt du Javascript, wenn alles mit CSS allein gemacht werden kann? heißt diese Seite nicht CSS-Tricks? Sicher, tr:odd / tr:nth-child funktionieren nicht mit allen Browsern, aber es ist CSS, also solltest du es zumindest erwähnen!
Sie könnten das Ganze ohne Hunderte von Klassenattributen (und ohne JS!) mit nth-child ftw machen!
noch etwas... warum immer jQuery? hast du jemals ein anderes JS-Framework ausprobiert (ok, jQuery ist kein Framework, sondern ein Toolkit...)? offensichtlich nicht... diese Seite heißt nicht "jQuery-Tricks", oder?
Entschuldigung, aber ich werde wirklich genervt, wenn ich hier jedes Mal dummes jQuery statt schickes CSS sehe, immer und immer wieder...
Ich stimme vollkommen zu – lasst uns ein bisschen mehr CSS, ein bisschen weniger Bildersetzung und viel weniger jQuery haben – wenn Sie unbedingt etwas mit Javascript machen müssen, dann tun Sie es wenigstens in reinem Javascript, damit jeder es nutzen kann.
Ich weiß, wirklich, dieser Blog geht wirklich den Bach runter. Der Autor veröffentlicht immer Dinge, die ihn persönlich interessieren, mit Technologien, die für ihn relevant sind und sich auf sein Arbeitsleben beziehen. Er sollte einfach den Mund halten und mit Roundups beginnen wie jeder anständige Webdesign-Blog. Wir sollten uns alle abmelden und wieder auf Digg trollen.
Hahaha, gut gemacht Chris, gut gemacht
Ich denke, tom317 hat Recht. Nichtsdestotrotz enthält dieser Beitrag einige 'CSS-Tricks' und mehr.
Ja, er hat mehr als ein paar 'CSS-Tricks', was ihn wie ein Thema abseits des Themas für diese Seite erscheinen lässt, aber wenn man mit den CSS-Tricks beginnt, ist es interessant zu sehen, welche anderen Dinge damit zusammenhängen: das Skripting und die Lehre, zu versuchen, etwas nachzubilden, das wir im Web sehen.
Ich denke, was Chris' Seite ruiniert, ist der Name: Es geht nicht nur um CSS-Tricks oder nicht mehr, es geht um CSS-Tricks, Skripting, allgemeine Webdesign-Ratschläge (und manchmal im Detail).
Mit anderen Worten, Chris erstellt Webdesign-Inhalte, rahmen sie aber unter dem Begriff "CSS Tricks" ein, und da denke ich, hat tom317 Recht.
Grrr, Blog-Namen! Smashing Magazine sollte definitiv Artikel über das Zerschlagen von Dingen schreiben. Noupe sollte sich mehr auf das "Noupeln" von Dingen konzentrieren.
Es ist ein Name, Leute. Bauen Sie die Brücke und gehen Sie darüber hinweg.
Chris, hör nicht auf, was du tust, Mann, ich liebe deine jQuery-Tutorials, Tipps und TRICKS.
Danke fürs Teilen. Obwohl ich diese Art von Daten in einer Definitionsliste platzieren würde.
@tom317: Ich bin sicher, du findest genug reine CSS-Artikel zum Thema nth-child/odd auf css-tricks :-D
Sehr schön, aber ich glaube, ich bin mehr von Ihrer Demoseite beeindruckt, lol.
Chris,
Ich liebe Ihre Philosophie, von anderen zu lernen. Als Musiker, der versucht, sich in dieser Webprogrammierungswelt zurechtzufinden, liebte ich die Analogie in dem 37-Signals-Link über das Erlernen von Teilen von Melodien, wenn man anfängt.
Ich habe das Gefühl, dieses Webzeug ist in dieser Hinsicht der Musik sehr ähnlich. Der Unterschied ist, dass es so viel Mist im Web gibt. Danke, dass Sie so viel an die Community zurückgeben, von der Sie gelernt haben, und uns Web-Hacks Ihre "Web-Tabulaturen" zur Verfügung stellen.
Ich sehe gerne gut gemachte Tabellen. sauber und knackig.
Hallo Chris,
Ich bin ein langjähriger Follower, zum ersten Mal Kommentator.
Es sieht in IE anders aus als in Firefox. Auch wenn Sie die Schatten auf der letzten Zeile haben wollten, wie gehe ich das an?
Newbie
Es ist in Ordnung, ich habe es verstanden.
Habe mit den JavaScript-Werten herumgespielt.
Toller Beitrag
Hey,
Ein toller kleiner Artikel. Ich habe Sie gefunden, als ich etwas über das jQuery-Akkordeon recherchiert habe, und habe Ihren kleinen Schnipsel des Grid-Akkordeons gefunden. Habe beschlossen, die Website weiter zu durchstöbern, und hier bin ich...
Eine Frage jedoch: Ihre Lösung verwendet ein TH mit Klassennamen zur Definition des Hintergrundbilds und einen Span, der den Text (für Screenreader) aus der Seite platziert. Warum eine Klasse und einen Span verwenden, wenn ein einfaches IMG-Tag mit Titel (d. h. "title='$15 Basic'") den Screenreader-Bedürfnissen genügen würde?
Fehlt mir etwas?
Colgroups scheinen großartig für das Setzen von Hintergründen und den Zugriff per Javascript zu sein, aber ich war überrascht, ihre Grenzen beim Styling mit font-weight, color usw. festzustellen.
Sind wir einfach darauf beschränkt, Klassen zu einer bestimmten Spalte hinzuzufügen, die wir stylen möchten, um den Text dieser Spalte zu gestalten?
Das sind wirklich tolle Ratschläge, vielen Dank.