Der „Checkbox Hack“ verwendet ein verbundenes <label> und <input type="checkbox"> und normalerweise ein *anderes Element*, das Sie steuern möchten, so etwa
<label for="toggle">Do Something</label>
<input type="checkbox" id="toggle">
<div class="control-me">Control me</div>
Dann verstecken wir die Checkbox mit CSS komplett. Wahrscheinlich, indem wir sie mit absoluter Positionierung von der Seite schieben oder ihre Opazität auf Null setzen. Aber nur weil die Checkbox versteckt ist, schaltet das Klicken auf das <label> seinen Wert ein und aus. Dann können Sie den benachbarten Geschwister-Kombinator verwenden, um das <div> basierend auf dem :checked-Status des Inputs unterschiedlich zu gestalten.
.control-me {
/* Default state */
}
#toggle:checked ~ .control-me {
/* A toggled state! No JavaScript! */
}
Sie können also ein Element komplett anders gestalten, abhängig vom Status dieser Checkbox, die man gar nicht sieht. Ziemlich raffiniert. Schauen wir uns eine Reihe von Dingen an, die der „Checkbox Hack“ leisten kann.
Siehe den Pen
Der Checkbox Hack von Chris Coyier (@chriscoyier)
auf CodePen.
Einiges davon überschreitet die Grenzen dessen, was man mit CSS tun „sollte“ und führt einige fragwürdige Semantiken ein. Es macht immer noch viel Spaß damit zu spielen und es ist cool, dass es möglich ist, aber im Allgemeinen sollte das funktionale Verhalten durch JavaScript gesteuert werden.
Benutzerdefinierte Radio-Buttons und Checkboxen
Siehe den Pen
Benutzerdefinierte Checkboxen nur mit CSS von Geoffrey Crofte (@GeoffreyCrofte)
auf CodePen.
Sie können die Standard-Oberfläche eines Radio-Buttons oder einer Checkbox ausblenden und eine benutzerdefinierte Version direkt darüber anzeigen.
Dateisystem-ähnliches "Tree Menu"

Tabbed Areas
Das „Tabs“-Designmuster besteht lediglich aus dem Ein- und Ausschalten von Bereichen, was sich perfekt für den Checkbox-Hack eignet. Aber anstatt Checkboxen, bei denen jede Checkbox unabhängig von den anderen ein- oder ausgeschaltet sein kann, werden hier Radio-Buttons verwendet, bei denen nur einer pro Gruppe gleichzeitig aktiviert sein kann (so wie nur ein Tab gleichzeitig aktiv sein kann).
Demo aus Functional CSS tabs revisited
Siehe den Pen
Funktionale CSS-Tabs von Chris Coyier (@chriscoyier)
auf CodePen.
Dropdown-Menüs
Siehe den Pen
Radio-Button-Dropdowns von Chris Coyier (@chriscoyier)
auf CodePen.
Push-Schalter
Ein Schalter kann die Form von AN/AUS haben, was mit einer einzelnen <input type="checkbox"> erreicht werden kann. Wie Emoji-Schalter!
Siehe den Pen
CSS Checkbox Toggle Switch von Chris Coyier (@chriscoyier)
auf CodePen.
Oder es können mehrere <input type="checkbox">-Elemente sein, um zwischen verschiedenen unterschiedlichen Werten zu wechseln.
FAQ Antwort-Aufdeckung
Heutzutage würden Sie wahrscheinlich einfach eine <details>/<summary>-Kombination verwenden, aber erweiterbare Abschnitte können mit dem Checkbox-Hack realisiert werden.
Siehe den Pen
FAQ ohne Details/Summary (Checkbox Hack) von Chris Coyier (@chriscoyier)
auf CodePen.
Seitenleiste ausblenden
Wie das Octopress-Theme der alten Schule.
Siehe den Pen
Seitenleiste mit dem Checkbox Hack ausblenden von Chris Coyier (@chriscoyier)
auf CodePen.
Das Beispiel „FAQ Answer Revealing“ ist der perfekte Anwendungsfall für die HTML5-Elemente
details/summary.Sicher, und mit jemandes jQuery-Fallback ist das eine gute Wahl.
@Mathias: Das war auch mein erster Gedanke. Aber dann habe ich es mir anders überlegt; ich glaube nicht. Wie würde das funktionieren? Für Browser, die
details/summaryunterstützen, ist so etwas nicht nötig. Für alle anderen Browser bräuchten wir sowieso ein Polyfill-Skript. Ich gehe davon aus, dass Sie nicht vorschlagen, manuell eine Checkbox neben jederdetails/summary-Instanz einzufügen, da dies das Schlechteste von beiden Welten wäre.Ein schöner Trick, aber die Semantik leidet :)
Mehr Leid: Ich habe es gerade verwendet, um einen Farbwähler für einen benutzerdefinierten Blog-Editor zu erstellen, den ich gerade für mich gemacht habe. Es funktioniert überall perfekt, außer auf iOS. Wie kann ich das beheben?
Wie Ihre Anspielung auf Soul Coughing da drin! Nett!
Soul Coughing rockt! Sehr gut!
Ich war besonders beeindruckt von der Demo mit Modal-Dialogen von CSS Ninja (schauen Sie hier), die den gleichen Trick verwendet.
Ich habe vor einem Monat einen iOS-Style On/Off-Schalter mit genau dieser Technik erstellt. http://forrst.com/posts/iOS_Pure_CSS_On_Off_switch_Now_with_100_less_i-rMA Es ist einen Blick wert.
Eigentlich. Vergessen Sie das. Andere Methode, aber immer noch ziemlich cool.
Das ist eine sehr schlechte Idee: Stile wie „left: -9999px“ zu verwenden. Sobald Sie die Richtung auf rtl umstellen, wird es eine *große* horizontale Scrollbar geben. Vielleicht wäre sie schon da, wenn jemand mit RTL-Systemeinstellungen wie Hebräisch, Arabisch oder Hindi Ihre Website besucht – ich habe das nicht getestet.
Es ist eine *viel bessere Idee*, Stile wie „position:absolute;clip:rect(0 0 0 0);“ zu verwenden (wie in Lea Verous Präsentation gesehen). „visibility:hidden“ ist auch in Ordnung, wenn IE-Browser keine Rolle spielen.
Ich habe die Clip-Methode bei Whats My MPG für das Beispiel der Radio-Buttons verwendet, das in diesem Beitrag vorgestellt wird.
left: -9999pxist in Ordnung, wenn das übergeordnete Elementoverflow: hiddenhat.visibility:hiddenfür Checkboxen ist eine schlechte Idee, denn dann funktioniertinput.checked > labelin IE7/8 nicht.Diese sind großartig! Ich wäre wirklich daran interessiert, mehr darüber zu lesen, wer die Meinung vertritt, dass selbst das Spielen mit diesen Hacks schlecht für die Branche ist. Für mich sind es einfach eine wirklich spaßige Denkaufgabe.
Vom CSS-Teil gibt es viel zu lernen, aber der HTML-Teil ist Unsinn: Formularelemente sind für Formulare (*), nicht für Navigationslisten, Tabs oder Baumlisten vorgesehen.
Einfache Fragen: Wo ist das Formularelement? Wo ist der Absende-Button?
Ratschlag: Wenn es kein Formular ist, verwenden Sie keine Formularelemente.
Das andere „Problem“ ist, dass CSS Tricks eine erfolgreiche Website mit vielen Besuchern ist: Chris Coyer verdient diesen Erfolg, aber andererseits kommt „eine gewisse“ Verantwortung für Anfänger und Nicht-ganz-Anfänger, die sich ihrer Fähigkeiten und Kenntnisse guter Praktiken nicht sicher sind.
Meiner Meinung nach ist dies „Zeug, das man nicht tun darf, aber trotzdem daraus lernen kann“. Chris hat einen Haftungsausschluss hinzugefügt (auch riesige Haftungsausschlüsse würden einige Leute nicht davon abhalten, alles zu kopieren, was sie sehen, aber das ist ihr Problem), aber ich lese immer noch den Titel als „Das kann ich tun? OK, das mache ich“. Und Leute wie ich werden sich beschweren, dass „einiges davon die Grenzen überschreitet“ und „schlechte Semantik“ zu vage ist (gute Semantik habe ich hier nicht gesehen, aber auch hier gibt es viel vom CSS-Teil zu lernen).
Wenn Sie Tabs oder eine Baumliste auf Ihrer Website benötigen, verwenden Sie JS, um Inhalte zu verbergen und anzuzeigen, und schauen Sie sich http://hanshillen.github.com/jqtest/ an.
(*) Ich weiß, dass aufgrund von Einschränkungen in der HTML4.01-Empfehlung (es gibt keine Möglichkeit, die Tatsache auszudrücken, dass ein Input in einem %block% wie p oder einem Fieldset oder einem Fieldset in einem Fieldset etc. verschachtelt sein kann) viele Dinge wie ein Fieldset außerhalb eines Formulars gültig sind, aber es macht auf einer Website immer noch keinen Sinn.
Ich stimme im Allgemeinen zu, dass Inputs nicht außerhalb von Formularen verwendet werden sollten, aber es ist nichts Falsches daran, ein
<button type="button">außerhalb eines Formulars zu verwenden. Es gibt also sicherlich Situationen für alles. Es ist ein fokussierbares Element und in manchen Fällen eine zugänglichere Lösung zum Ausblenden/Anzeigen von Inhalten als gängige Methoden.Ihr Kommentar war etwas hart und ich denke, Sie nehmen diese Proof-of-Concept-Sachen zu ernst.
Das Internet ist größtenteils eine Ansammlung von Links, Formularen und Text. Es ist schön, von Zeit zu Zeit etwas anderes zu sehen.
@Felipe Chris hat dort einen Haftungsausschluss eingefügt, und wer lernen möchte, kann tun, was er will. Heutzutage werden Formulare so oft verwendet, dass sie kaum noch als solche bezeichnet werden könnten. Dies ist ohnehin eher ein Blogbeitrag als ein Tutorial.
Leute können mit dem, was sie gelernt haben, tun, was sie wollen; wenn Sie alleine arbeiten, müssen Sie technisch nur so semantisch sein, wie Sie es brauchen.
Nun, ich sehe keinen „Hack“...
das ist reines CSS :) Dinge darin verwende ich fast jeden Tag...
Für mich ist der Haftungsausschluss bereits im Titel. „Hack“. Chris macht deutlich, dass dies etwas ist, das Ihnen ein tieferes Verständnis der Leinwand verschafft, auf der Sie malen, und aufgrund seiner mangelnden Semantik nur in den spaßigsten Fällen (oder denen, die uns als Web-Manipulatoren betreffen, wie Dabblet) implementiert werden sollte.
Gute Ausarbeitung, Chris!
Sie sollten user-select: none; für das Label hinzufügen, um die Auswahl von Text in Schaltflächen zu verhindern und die Benutzerfreundlichkeit zu verbessern.
Hinzufügen
Ich wollte gerade dasselbe sagen (ja, ich bin eine andere Person als Arto, nur ein zufällig ähnlicher Name). Wenn ich mich recht erinnere, bleibt jedoch eine Situation bestehen, in der ein schnelles Klicken auf das Label nicht jeden Klick als Umschalten der zugehörigen Checkbox registriert.
In Anbetracht dessen muss ich normalerweise JavaScript und einen Nicht-Label-Trigger mit zweiseitiger Zustandsänderung verwenden (das Klicken auf den Nicht-Label-Trigger aktualisiert den Checkbox-Status, das Ändern des Checkbox-Status aktualisiert das Erscheinungsbild des Triggers). In Kombination mit der Positionierung der Checkbox außerhalb der Seite, aber nicht sichtbar, bleibt die Checkbox über Tastenkombinationen zugänglich (was immer ein Anliegen ist, wenn ein vorhandenes Element ersetzt wird).
Ich würde gerne eine Version dieses Hacks sehen, die mit schnellen Klickfolgen auf das Label funktioniert. Das JavaScript für das oben Genannte ist nicht gerade einfach.
Was bedeutet das „~“ in dieser Zeile?
input[type=checkbox]:checked ~ div { … }
Danke.
Das ist der allgemeine Geschwister-Kombinator. Siehe hier.
Habe das oben verifiziert. Selbst mit der Benutzerauswahl auf dem Label und dem Input werden schnelle Klicks auf das Label nicht jeden Klick registrieren.
http://dabblet.com/gist/1510457
Dies wurde in Firefox 8 getestet, aber ich habe dieses Verhalten auch in anderen Browsern beobachtet.
Warum sollte ich mich an Semantik halten? Ist es nicht besser, das Verfügbare zu nutzen, um die bestmögliche Lösung zu erzielen? (Optimierung, Duplizierung, Lesbarkeit usw.)
Ich kann die Tabs nicht zum Laufen bringen, wenn sie verschachtelt sind. Hat jemand eine Idee, wie man dieses Problem beheben kann?
http://dl.dropbox.com/u/14080718/CSSTabs/index.html
Funktioniert bei mir unter Safari 5.1.2 und Firefox 8.0.1.
Eine Sache, die ich letztes Mal beim Spielen bemerkt habe, war, dass unter Safari keine Selektoren mit mehr als einem Kombinator funktionierten. Firefox akzeptierte zwei Kombinatoren, aber nichts darüber hinaus. Zum Beispiel würde
:checked + div pdasp-Element in Safari nicht abgleichen.Ich habe vor kurzem ein Lion CSS UI Kit erstellt und den aktivierten Zustand für die Quellliste verwendet, sodass Radio-Buttons das ausgewählte Element verfolgen und Checkboxen die Baumansicht steuern.
Das manuelle Schreiben des HTML für ein Baummenü wird ziemlich mühsam. Für segmentierte Push-Schalter fühlt sich die Technik jedoch richtig an.
Obwohl ich zustimme, dass die meisten dieser Beispiele wahrscheinlich nicht in der Praxis verwendet werden sollten, denke ich, dass die Beispiele für „Push Toggle“ tatsächlich ein perfekter Anwendungsfall für diese Technik sind. Semantisch gesehen sind das *Radio-Buttons*, daher macht es Sinn, tatsächliche Radio-Buttons in Ihrem Markup zu haben. Sie könnten in Browsern, die dies nicht unterstützen, auf einfache alte Radio-Buttons mit Labels zurückgreifen.
Ich habe den gleichen Effekt mit zusätzlichem Markup für die stilisierten Schalter und JavaScript zur Verwaltung des Status der versteckten Radio-Buttons erzielt, aber dieser Ansatz ist viel sauberer.
Damit es in IE7/8 funktioniert, können Sie ein kleines jQuery-Skript hinzufügen
und kopieren Sie einfach den Stil und ersetzen Sie
:checkeddurch.checkedEs wäre großartig, wenn im Titelbereich aller Artikel eine kleine Unterüberschrift ähnlich der Autoren-Überschrift oder ein Symbol oder ähnliches wäre, um zu klassifizieren, auf welche HTML- und CSS-Versionen sich der Artikel konzentriert (z. B. HTML5 & CSS3 oder HTML4 & CSS3 usw.).
Leider ist es für einige von uns (vielleicht nur für mich) nicht sofort ersichtlich, auf welche Version sich der Artikel bezieht.
Wirklich großartiger und hilfreicher Artikel. Hacks sind immer für Abkürzungen, aber sie funktionieren immer und werden zu Langzeitlösungen. Ich habe einen schönen Artikel über CSS-Hacks gefunden.
http://wordpressapi.com/2011/01/24/50-css-tequniqe-tips-web-developer-check/
Weiß jemand, ob es möglich wäre, mit reinem CSS einige Übergänge auf die Tabs anzuwenden? Ich versuche, die Tabs ein- und auszublenden. Ich habe ein paar Dinge versucht und es scheint nicht zu funktionieren.
Ich mag den Kommentarstil, wie kann ich diesen Stil auf meiner Website haben?
Wenn jemand Probleme hat, Label-Klicks auf iOS anzuwenden, versuchen Sie, ein leeres onclick=”” zu einem übergeordneten Element (z. B. dem <form>) hinzuzufügen...
Danke, dass Sie auf die Anwendungsfälle von input@type=checkbox neben dem Offensichtlichen aufmerksam gemacht haben.
Ich habe einmal einen Beitrag darüber geschrieben, wie man Bilder mit Checkboxen dreht, um zu steuern, welches Bild gerade aktiv ist.
Ich dachte, verschachtelte Inputs in Labels wären jetzt der richtige Weg?
<label> <input type="checkbox" /> My label text here... </label>Und aus dem Stegreif könnte dies vielleicht die Notwendigkeit für das andere zusätzliche div überflüssig machen...?
Ich habe ein Problem damit in IE 8....
Weiß jemand, wie man es in diesem bösen Browser zum Laufen bringt??
Ich habe diesen Code
input[type=checkbox]{
position: absolute;
left: -9999px;
overflow: hidden;
}
input[type=checkbox].checked ~ div {
background-position: 5% -19px;
background-color: #E5F6FF;
border: 1px solid #D1EFFF;
}
Der IE 8 ignoriert es, während alle anderen Browser (Chrome, FF, Safari und Opera) es problemlos handhaben.
Was soll ich tun?
Gibt es eine Möglichkeit, zu verhindern, dass die Seite springt, wenn ein Benutzer das Label auswählt? Wenn ein gewisses Scrollen erforderlich ist, um zum Label zu gelangen, bewirkt das Anklicken, dass die Seite ganz nach oben springt.
Gibt es Ideen, wie man das umgehen kann?
Es ist auch hilfreich zu erwähnen, dass das Label *vor* der Checkbox platziert, nicht gestylt werden kann, da CSS meines Wissens nicht rückwärts (nur vorwärts) durch den DOM traversieren kann. Etwas wie das
wird nicht funktionieren, aber der exakt gleiche Code mit den beiden umgedrehten HTML-Zeilen funktioniert einwandfrei. Das liegt daran, dass das
label-Element für den CSS-Selektor:checkednicht existiert.Da der
~-Selektor nur Zugriff auf unmittelbare Geschwister hat, funktioniert das Verschachteln der Checkbox in einem Label ebenfalls nicht, es sei denn, das Ziel befindet sich ebenfalls innerhalb des Labels.Sehr nützlicher Beitrag, ich verwende ihn für eine responsive Fly-Down-Navigationsleiste für mobile Geräte, die gut zu funktionieren scheint!
Warum nicht einfach
display:nonefür das input.checkbox-Element verwenden? Warum müssen wir es über die Seite schieben?