Wenn Sie so alt sind wie ich, erinnern Sie sich vielleicht noch an das Anschauen von Let’s Make a Deal im alten Fernsehprogramm. Die Show läuft heutzutage anscheinend immer noch in einem neuen Format, aber das Original hat mich wegen einer einfachen Sache immer beeindruckt: der Enthüllung.
Es ist etwas Aufregendes, nicht zu wissen, was sich hinter einem Vorhang verbirgt, und darum ging es bei Let’s Make a Deal. Die Kandidaten hatten die Wahl zwischen drei Türen, die sich jeweils öffneten, um einen Preis zu enthüllen.
Es war aufregend!
Diese Technik, bei der sich Vorhänge öffnen, um einen Schatz zu enthüllen (selbst wenn es ein Bob’s Big Boy Geschenkgutschein ist), ist eine nette kleine Taktik, die wir mit ein wenig CSS selbst anwenden können. Hier ist die finale Demo
Sehen Sie den Pen OXJMmY von Geoff Graham (@geoffgraham) auf CodePen.
Das HTML
Das lässt sich im Grunde auf drei Elemente reduzieren
- Der Vorhang-Wrapper
- Linkes Vorhangpaneel
- Rechtes Vorhangpaneel
Wir können visualisieren, was wir in einem Diagramm tun

…und wenn sich die Vorhangpaneele öffnen, enthüllen sie einen Preis als viertes Element

Nutzen wir das als Blaupause für unser HTML.
<!-- The parent component -->
<div class="curtain">
<!-- The component wrapper -->
<div class="curtain__wrapper">
<!-- The left curtain panel -->
<div class="curtain__panel curtain__panel--left">
</div> <!-- curtain__panel -->
<!-- The prize behind the curtain panels -->
<div class="curtain__prize">
</div> <!-- curtain__prize -->
<!-- The right curtain panel -->
<div class="curtain__panel curtain__panel--right">
</div> <!-- curtain__panel -->
</div> <!-- curtain__wrapper -->
</div> <!-- curtain -->
Das CSS-Layout
Nachdem wir unsere Elemente im HTML definiert haben, können wir mit dem Positionieren mit CSS beginnen.
Unser erstes Ziel ist es, die Vorhangpaneele so zu positionieren, dass sie nicht nur nebeneinander liegen, sondern auch vor dem eigentlichen Preis.
.curtain {
width: 100%; /* Ensures the component is the full screen width */
height: 100vh; /* We're using this for demo purposes */
overflow: hidden; /* Allows us to slide the panels outside the container without them showing */
}
.curtain__wrapper {
width: 100%;
height: 100%;
}
.curtain__panel {
background: orange;
width: 50%; /* Each panel takes up half the container */
height: 100vh; /* Used for demo purposes */
float: left; /* Makes sure panels are side-by-side */
position: relative; /* Needed to define the z-index */
z-index: 2; /* Places the panels in front of the prize */
}
.curtain__panel--left {
/* Styles for sliding the left panel */
}
.curtain__panel--right {
/* Styles for sliding the right panel */
}
.curtain__prize {
background: #333;
position: absolute; /* Forces the prize position into the container start */
z-index: 1; /* Places the prize behind the panels, which are z-index 2 */
width: 100%;
height: 100%;
}
Es könnte so aussehen, als hätten wir fast nichts getan, wenn wir hier aufhören und unsere Arbeit überprüfen würden. Tatsächlich sehen wir nur einen orangefarbenen Block.
Sehen Sie den Pen wWvJaO von Geoff Graham (@geoffgraham) auf CodePen.
Das ist gut! Wir sehen tatsächlich zwei Vorhangpaneele, die den gesamten Vorhang-Container ausfüllen, und ein Paneel für einen Preis, der hinter den Kulissen lauert.
Der Checkbox-Hack
Ich wäre nachlässig, die Tatsache zu vernachlässigen, dass wir den Checkbox-Hack hier in die Praxis umsetzen werden. Der Checkbox-Hack, falls Sie ihn nicht kennen, ist eine Methode, mit der wir die Darstellung von Elementen basierend auf dem bekannten Zustand einer einfachen Formular-Checkbox ändern können. Wir haben einen Artikel über die Methode, falls Sie tiefer in die Funktionsweise eintauchen möchten.
Die erste Regel für die Verwendung des Checkbox-Hacks ist, dass wir eine Checkbox in unserem Markup benötigen. Fügen wir sie dem HTML hinzu
<!-- The parent component -->
<div class="curtain">
<!-- The component wrapper -->
<div class="curtain__wrapper">
<!-- The checkbox hack! -->
<input type="checkbox" checked>
<!-- The left curtain panel -->
<div class="curtain__panel curtain__panel--left">
</div> <!-- curtain__panel -->
<!-- The prize behind the curtain panels -->
<div class="curtain__prize">
</div> <!-- curtain__prize -->
<!-- The right curtain panel -->
<div class="curtain__panel curtain__panel--right">
</div> <!-- curtain__panel -->
</div> <!-- curtain__wrapper -->
</div> <!-- curtain -->
Stellen wir zunächst sicher, dass unsere Checkbox sowohl unsichtbar ist als auch den gesamten Platz unseres Vorhang-Components einnimmt. Wir möchten, dass der gesamte Vorhang anklickbar ist, und das wird uns das ermöglichen.
input[type=checkbox] {
position: absolute; /* Force the checkbox at the start of the container */
cursor: pointer; /* Indicate the curtain is clickable */
width: 100%; /* The checkbox is as wide as the component */
height: 100%; /* The checkbox is as tall as the component */
z-index: 100; /* Make sure the checkbox is on top of everything else */
opacity: 0; /* Hide the checkbox */
}
Beachten Sie, dass der Standardzustand der Checkbox in unserem HTML checked ist. Dies ermöglicht es uns, unsere Elemente basierend auf dem :checked Zustand zu stylen.
/* When the checkbox is checked... */
/* Slide the first panel in */
input[type=checkbox]:checked ~ div.curtain__panel--left {
transform: translateX(0);
}
/* Slide the second panel in */
input[type=checkbox]:checked ~ div.curtain__panel--right {
transform: translateX(0);
}
Das bedeutet auch, dass wir unsere Vorhangpaneele aktualisieren können, sodass sie beim Auschecken der Checkbox aus dem Container gleiten.
/* Slide the panel to the left out of the container */
.curtain__panel--left {
transform: translateX(-100%);
}
/* Slide the panel to the right out of the container */
.curtain__panel--right {
transform: translateX(100%);
}
Jetzt geht es voran! Das Klicken auf den Vorhang-Component verschiebt die Paneele vom Bildschirm und enthüllt das Preis-Paneel.
Sehen Sie den Pen xOxqOL von Geoff Graham (@geoffgraham) auf CodePen.
Die Animation der Änderung
Als Nächstes müssen wir den Übergang der Paneele animieren, sobald der Zustand der Checkbox per Klick geändert wurde. Andernfalls, wie Sie vielleicht bemerkt haben, sieht die Änderung weniger wie eine Schiebetür und mehr wie ein Augenschlag aus.
Fügen wir der Klasse .curtain__panel eine transition hinzu
.curtain__panel {
background: orange;
width: 50%; /* Each panel takes up half the container */
height: 100vh; /* Used for demo purposes */
float: left; /* Makes sure panels are side-by-side */
position: relative; /* Needed to define the z-index */
z-index: 2; /* Places the panels in front of the prize */
transition: all 1s ease-out; /* Animates the sliding transition */
}
Wie cool sind wir?
Sehen Sie den Pen aZbJBw von Geoff Graham (@geoffgraham) auf CodePen.
Alles zusammenbringen
Nachdem wir nun alle funktionierenden Elemente vorhanden sind, können wir beginnen, Dinge anzupassen, indem wir den Vorhang- und Preis-Paneelen Inhalte hinzufügen.
Sehen Sie den Pen OXJMmY von Geoff Graham (@geoffgraham) auf CodePen.
Danke für den Artikel und den schönen visuellen Effekt. Nur eine kurze Info: Er funktioniert in Firefox standardmäßig nicht, weil die Checkbox aus irgendeinem Grund außerhalb des Canvas positioniert ist. Das Hinzufügen von
top: 0undleft: 0zu ihren Stilen hat das jedoch behoben.Ich kam, um dasselbe zu berichten. :)
Großartig, ich schätze den Hinweis!
Eine weitere Verwendung für den Checkbox-Hack! Ich dachte, ein bisschen JavaScript wäre involviert; aber es stellt sich heraus, dass das nicht der Fall ist. Das muss ich mir merken – Orte finden, an denen ein Mausklick-Handler angezeigt wird, aber wo stattdessen eine Checkbox verwendet werden könnte.
Funktioniert diese Technik auf Tablets/Handys (d. h. Tippen statt Klicken)?
Absolut – die Checkbox wird beim Tippen ausgelöst, genauso wie beim Klicken. :)
Vielen Dank! Ich habe Checkboxen nie als Möglichkeit gesehen, Klick-Events ohne JavaScript zu erzeugen!
Es eröffnet viele Möglichkeiten, nicht wahr?!?!
Es scheint, dass man das viel vereinfachen könnte, indem man den Container zu einem Label macht und Pseudoelemente für die Vorhangpaneele verwendet. Alles, was man wirklich für Markup braucht, ist
Genau das dachte ich auch. Nur ein Blockelement ist nicht in einem Label erlaubt. Aber das ist einfach zu lösen, indem man ein anderes Element nimmt.
Tatsächlich können die Vorhänge auch mit Pseudo-Elementen :before und :after erstellt werden, was sie noch semantischer macht. Text auf den Vorhängen könnte leicht durch das Befüllen des Inhalts in CSS mit einem Data-Attribut aus HTML gemacht werden, was ihn dynamischer macht.
Schön! Ja, Pseudoelemente würden das Markup sicherlich einiges aufgeräumter machen.
Und es würde die Checkbox automatisch auslösen, unabhängig von ihrer Positionierung, und man könnte einfach
{ visibility: hidden; }oder{ opacity: 0; }auf die Checkbox setzen. Der Inhalt selbst müsste nicht einmal in einen<div>gewrappt werden (was nicht innerhalb eines<label>erlaubt ist, solange die Checkbox{ position: absolute; }erhält und den Inhalt nicht verschiebt).Ich liebe das! Deine Version ist viel funktionsreicher als meine. Ich habe vor ein paar Jahren einen Ein-Elemente-Pen wie diesen gemacht.
http://codepen.io/WebRuin/pen/kEbGH
Wie ich bereits angedeutet habe, ist deine Version jedoch viel realistischer, und ich könnte sie sogar verwenden. :p
Das ist wirklich raffiniert! Ich liebe, dass es auf Hover eingestellt ist und sich mehr wie eine Tür anfühlt.
Cool! Vielleicht die Eingabe mit display: none ausblenden, nachdem sie ausgewählt wurde? Wenn Sie einen Rabattcode oder so etwas enthüllen, kann der Benutzer den Text nicht auswählen!
Wahr, guter Punkt!
Das Problem bei der Verwendung von
display: noneist, dass Sie den Vorhang nicht mehr schließen können. Das ist vielleicht kein großes Problem, je nachdem, was Sie tun möchten, aber es ist definitiv eine Überlegung wert.wirklich sauber
Ich würde auch vorschlagen, die Checkbox so einzustellen, dass sie keine Pointer-Events akzeptiert, wenn sie nicht ausgewählt ist, um zu verhindern, dass der Vorhang geschlossen wird (dies ist nicht immer anwendbar, aber wenn Sie diesen Effekt auf Containern mit interaktiven Inhalten verwenden, ist er wichtig). Es ist so einfach wie
Sehr schön!
Ich kann mich irren –
Aber ich hatte etwas Ähnliches, um Text beim Klicken anzuzeigen. Ich kannte den Checkbox-Hack nicht, und da der :hover-Zustand aus einem bestimmten Grund nicht funktionierte, habe ich einfach einen :focus-Zustand auf dem Objekt-Wrapper gesetzt. So wurde er beim Klicken angezeigt.
Jetzt meine Frage: Wäre das nicht besser, da es einen richtigen Event-Zustand und keine Workaround verwendet?
Das ist wirklich praktisch!
Ich werde das mal ausprobieren!