Der CSS :target-Pseudoselektor in CSS passt, wenn der Hash in der URL und die ID eines Elements gleich sind.

<section id="voters">
Content
</section>
:target {
background: yellow;
}
Solange diese URL so ist, erhält das section-Element einen gelben Hintergrund, wie in unserem CSS festgelegt.
Wann würden Sie das verwenden?
Eine Möglichkeit besteht darin, wenn Sie mit "Zuständen" stylen möchten. Wenn die Seite einen bestimmten Hash hat, befindet sie sich in diesem Zustand. Es ist nicht ganz so vielseitig wie die Manipulation von Klassennamen (da es nur eine geben kann und sie nur mit einem Element in Beziehung stehen kann), aber es ist ähnlich. Alles, was Sie tun könnten, um eine Klasse zu ändern, um den Zustand zu ändern, könnten Sie tun, wenn das Element im Zustand :target ist. Zum Beispiel: Farben ändern, Position ändern, Bilder ändern, Dinge ein-/ausblenden, was auch immer.
Ich würde diese Faustregeln verwenden, wann :target eine gute Wahl ist
- Wenn ein "Zustand" benötigt wird
- Wenn das Sprungverhalten akzeptabel ist
- Wenn es akzeptabel ist, die Browserhistorie zu beeinflussen
Wir werden all diese Dinge in diesem Artikel behandeln.
Wie bekommt man Hashes in URLs?
Der häufigste Weg ist, dass ein Benutzer auf einen Link klickt, der einen Hash enthält. Es kann ein interner (gleiche Seite) Link oder eine vollständige URL sein, die zufällig mit einem Hash und einem Wert endet. Beispiele
<a href="#voters">Go To There</a>
<a href="http://example.com/#specific-part">Go To There</a>
Sprungverhalten
Unabhängig davon, ob es sich um einen Link zur gleichen Seite handelt oder nicht, **scrollt der Browser die Seite, bis das Element am oberen Rand des Fensters angezeigt wird**. Oder so weit wie möglich, wenn er nicht so weit scrollen kann. Das ist sehr wichtig zu wissen, denn das bedeutet, dass die Ausnutzung dieses "Zustands"-Verhaltens etwas knifflig/begrenzt ist.
Zum Beispiel habe ich einmal eine Vielzahl von Techniken ausprobiert, um funktionale CSS-Tabs zu replizieren, aber letztendlich entschieden, dass die Verwendung des Checkbox-Hacks eine bessere Idee war, da dies die Probleme mit dem Seiten-Springen vermeidet. Ian Hansson von CSS Science hat auch einige Beispiele für Tabs. Sein drittes Beispiel verwendet :target, und absolut positionierte Elemente, die oberhalb der Oberseite der Seite versteckt sind, um das Seiten-Springen zu verhindern. Das ist clever, aber keine wirkliche Lösung, da die Seite nach oben springen würde, wenn die Tabs weiter unten auf der Seite wären. Die Anker sind tatsächlich fixiert positioniert, was bedeutet, dass sie mit der Seite scrollen und kein Top-Jumping-Verhalten aufweisen. Extra clever!
Ein perfekter Anwendungsfall: Hervorheben von Abschnitten
Hier ist ein Problem: Wenn ein Hash-Link Sie durch die Seite zum relevanten Abschnitt springen lässt, versucht er, diesen Abschnitt bündig am oberen Rand des Browserfensters zu platzieren.
Aber was, wenn nicht genug Platz vorhanden ist, um unter diesem Abschnitt zu scrollen? Dieser Abschnitt ist sichtbar, aber er liegt nicht bündig oben, was seltsam und verwirrend sein kann.

Ich erfinde das nicht. Aus eigener Erfahrung kann ich sagen, dass Seiten-Sprunglinks, die mich nicht genau an die Stelle bringen, zu der ich verlinkt habe, mich durcheinanderbringen. Das passiert meiner Meinung nach zu oft bei FAQ-Seiten, wo die verlinkten Abschnitte oft nicht sehr hoch sind.
Lösen wir das also!
Eine historische Methode hieß die Yellow Fade Technique. Sie wurde von 37signals in Situationen eingesetzt, in denen neue Inhalte zur Seite hinzugefügt wurden, und man versuchte, die Aufmerksamkeit des Benutzers darauf zu lenken. Jonathan Snook übernahm diese Idee für CSS und kombinierte sie mit :target.
Anstatt eines gelben Verblassens zeigen wir durch leichte Verschiebung nach rechts und Aufblitzen eines roten Randes an, auf welchen Abschnitt der gerade angeklickte Link verwies. Um Ihnen das Denken abzunehmen, hier ist es
Die Struktur besteht aus einer Navigationsleiste, die mit IDs auf Abschnitte verlinkt
<nav>
<a href="#one">1</a>
<a href="#two">2</a>
<a href="#three">3</a>
</nav>
<section>
<div id="one"><h2>One</h2>Pellentesque habitant morbi ...</div>
<div id="two"><h2>Two</h2>Pellentesque habitant morbi ...</div>
<div id="three"><h2>Three</h2>Pellentesque habitant morbi ...</div>
</section>
Wenn die Abschnitte im Zustand :target sind, verschieben sie sich mithilfe des translateX-Transforms leicht nach rechts (verhindert unschöne Textumbrüche oder ähnliches, was wir mit Padding bekommen könnten) und ein roter Rand wird durch Keyframe-Animationen eingeblendet.
:target {
animation: highlight 1s ease;
transform: translateX(20px);
}
@keyframes highlight {
0% { border-left-color: red; }
100% { border-left-color: white; }
}
section > div {
border-left: 40px solid white;
padding: 10px;
transition: all 0.5s ease;
padding-right: 50px;
margin-left: -20px;
}
Das war's im Grunde schon. Ich würde das unter progressive enhancement einordnen, wenn Sie sich Sorgen um die Browserunterstützung machen. Das heißt, es ist nur ein schöner Touch, nicht lebensnotwendig.
Das Springen bekämpfen!
Nehmen wir an, Ihnen gefällt die Idee, :target für Zustände zu verwenden, aber Sie mögen das Seiten-Sprungverhalten nicht. Sie *können* den Hash-Link in einer URL ändern, ohne dass die Seite springt.
Mit jQuery könnten Sie alle Hash-Links ansprechen, ihr Standardverhalten verhindern und pushState (oder replaceState, nehme ich an) verwenden, um die URL zu ändern (was die Seite nicht verschiebt).
$("a[href^=#]").on("click", function(e) {
e.preventDefault();
history.pushState({}, "", this.href);
});
Sie könnten auch replaceState austauschbar verwenden, was die URL ändern würde, ohne einen Eintrag in die Browserhistorie hinzuzufügen. Manchmal möchten Sie das vielleicht, manchmal nicht. Zumindest haben Sie hier eine Wahl, die Sie nicht haben, wenn Sie dem Standardverhalten beim Klicken auf einen Hash-Link folgen, der immer hinzufügt.
Aber es gibt schlechte Nachrichten
Wenn sich die URL zu einem neuen Hash ändert, würde man denken, dass sich das aktuelle Ziel ändert und neuer CSS wirksam wird. Das tut es nicht (getestet bei aktuellen WebKit- und Firefox-Versionen zum Zeitpunkt des Schreibens). Das ist ein Bug.
Theoretisch könnten Sie die aktuelle Scrollposition der Seite messen und speichern, den Link natürlich springen lassen und sie dann auf die ursprüngliche Position zurücksetzen. Aber das klingt so furchtbar, dass ich mir nicht einmal die Mühe gemacht habe, eine Testseite dafür zu erstellen.
Mehr
- Der Standard in Selectors Level 4 (keine wesentlichen neuen Dinge gegenüber dem oben Genannten)
- Eine einfache Bildergalerie mit :target (leidet unter dem Seiten-Sprung-Problem, gutes Beispiel dafür) von Chris Heilmann
- Demo der Yellow Fade-Technik (wenn auch für vorhandene Inhalte, nicht für neu hinzugefügte) von Web Designer Notebook.
- Ein CSS Target, wörtlich, von Caleb Ogden. (Offline, aber die Wayback Machine hat eine verstümmelte Version davon.)
Die übliche Erwähnung der Browserkompatibilität, die in Ihren anderen Artikeln zu finden ist, fehlt. Wann kann man diese Technik sicher verwenden und wie gut ist die Rückwärtskompatibilität?
Sie können sie in allen modernen Browsern und IE9+ verwenden. Aber IE hat ein Problem
Von der Quirksmode-Seite
Ich habe diese Methode vor einiger Zeit verwendet, um eine reine CSS-Klick-Diashow zu erstellen. Sie funktioniert ziemlich gut. http://sitesbypalmer.com/themes/contrast/portfolio
Off-Topic: Ich mag deine Fotos.
In Bezug auf das CSS Science Tabs-Beispiel, würde das Hinzufügen von "position: fixed;" zu den ausgeblendeten Elementen das Sprungproblem lösen, da sie dann immer im Viewport wären?
kluuug. Versuchen Sie, eine Demo zu erstellen?
Ich bin verwirrt – verwendet die CSS Science-Seite nicht bereits "position:fixed;" für das dritte Beispiel? Soweit ich das beurteilen kann, gibt es kein Springen.
Ah ja, bei der Inspektion seines Beispiels verwenden die spans tatsächlich "position: fixed;".
Ich habe hier einen Fiddle dazu erstellt: http://jsfiddle.net/pq9hx/1/embedded/result/
(sehr, sehr einfache Demo!!)
Warte, macht dieser Bug die Verwendung der pushState/replaceState-Technik nicht praktisch unbrauchbar für den Moment (und vielleicht, solange fehlerhafte Versionen dieser Browser existieren)?
Äh, obwohl laut dem Bug-Report die Verwendung von location.hash funktioniert, obwohl ich den Unterschied zu pushState oder replaceState im Moment nicht ganz verstehe.
(seltsamerweise hat Paul Irish diesen Bug gerade heute gemeldet. Ach, dieser Paul Irish, immer einen Schritt voraus.)
Ich habe früher "return false;" nach jeglichem Code verwendet, um das Seiten-Springen zu verhindern. Zum Beispiel (das war, bevor ich mit jQuery angefangen habe) habe ich immer, wenn ich ein onclick-Ereignis hatte, href auf "#" gesetzt, was zu einem Seiten-Sprung führte. Wenn ich "return false;" nach meinem JavaScript-Code hinzugefügt habe, tat es das nicht (onclick="example('test'); return false;"). Ich bin mir nicht sicher, ob es andere Probleme verursachen würde, es schien es nicht zu tun, als ich es benutzte.
Tolle Artikel über :target, zuvor habe ich nach diesen Tutorials gearbeitet http://webstutorial.com/css3-tabs/css3 und http://webstutorial.com/html5-css3-toggle-slideup-slidedown/html-5
Frühere Tutorials + Ihr Tutorial haben mich zu Experten für :target gemacht
Danke Chris
Ich habe vor nicht allzu langer Zeit ein jQuery-Plugin gesehen, das dafür sorgte, dass beim Aufruf einer Beispielsseite von einer anderen Website mit einem #hash im Link das automatische "sofort nach unten werfen"-Ding gestoppt wurde und stattdessen sanft von oben nach unten zu diesem Element gescrollt wurde. So werden Leute, die von verschiedenen Websites kommen und auf einen Link klicken, der mitten auf Ihrer Website zu etwas führt, besser orientiert.
Es hat nicht wirklich funktioniert, es schien trotzdem zu springen. Ich frage mich, ob jemand wissen würde, wie man das mit jQuery macht (richtig). Ich glaube, Sie haben in diesem Artikel etwas Ähnliches angeschnitten, aber ich bin nicht sehr gut in jQuery, daher würde ich es nicht wissen.
Ich habe noch nie jemanden gesehen, der das "richtig" macht, vielleicht lohnt es sich nicht?
Ich bin mir nicht ganz sicher, ob Sie mein Beispiel im Sinn hatten, denn es springt nicht, es scrollt wirklich: http://osvaldas.info/incoming/examples/more-noticeable-html-bookmarks/#bookmark (Artikel)
Eine weitere Variante: Ich habe kürzlich eine kleine Demo mit :target gemacht, um Inhalte auf kleineren Geräten "off-canvas" auszublenden. Sehen Sie http://sandbox.webpro.nl/css3/adaptive-layout-pattern-off-canvas-variation.html (verwenden Sie eine kleine Breite, um den Effekt zu sehen).
Lustig, ich habe gestern etwas gemacht, das den :target-Selektor übermäßig missbraucht. Ich empfehle, es in Opera anzusehen, da es in meinen Tests der einzige Browser war, der Übergänge auf transform: scaleY unterstützte.
http://www.informatik.uni-freiburg.de/~dufners/gryth
Ich unterstütze die
position: fixed-Methode, um zu verhindern, dass Seiten bei:targetspringen. Ich habe sie für Popups verwendet, siehe http://kizu.ru/en/fun/popups/Vor ein paar Monaten habe ich mit :target gespielt http://rkrupinski.com/stuff/target/
Ich habe mich immer gefragt, was es genau tut.
Jetzt ist mein Geist voller monströser Kreationen, die den :target-Selektor verwenden!
Mwahahahaha!!!
Hallo!
Ich habe vor ein paar Monaten mit :target auf http://creativejuiz.fr/trytotry/juizy-slideshow-full-css3-html5/ herumgespielt und den allgemeinen Geschwister-CSS-Selektor in Kombination mit der :target-Pseudoklasse in einem "versteckten" Element verwendet (siehe Quelle). Es funktioniert! Kein Sprung!
Siehe auch diesen CSS3-Parallax-Effekt, der mit :target-Pseudoklasse und Übergängen erstellt wurde: http://www.creativejuiz.fr/trytotry/css3-parallax/
Danke für den Artikel ;)
Im Artikel erwähnen Sie, dass meine, die auf csscience, nicht funktionieren würde, wenn die Tabs weiter unten auf der Seite wären.
Die Objekte, die mit :target ausgewählt werden, sind jedoch fixiert positioniert, sodass das keinen Unterschied machen würde. Ich habe die Seite bewusst lang gemacht, damit Sie ein wenig nach unten scrollen und prüfen können.
Das ist verdammt cool. Wirklich nützlich für Blogs und Wissensdatenbanken.
Dieses Tutorial ist interessant, es verwendet CSS-Animation, soweit ich weiß, werden nicht alle Browser CSS-Animation unterstützen, aber es gefällt mir, ist es in Ordnung, CSS-Animation zu verwenden?
Nachdem ich dies gelesen hatte, fragte ich mich, ob man :target für ein reines CSS-Modalfenster verwenden könnte (ich habe einige Beispiele dafür gesehen, aber keines, das :target verwendet). Es stellt sich heraus, dass man das kann...
http://jsfiddle.net/leonard_mcginty/SzhLq/
Ich habe es nicht viel getestet, und natürlich stürzt es in den üblichen Browsern ab, aber es macht immer Spaß zu experimentieren.
Wie immer ein Top-Tipp, Herr Coyier :-)
Danke für die Daten, es gibt viel zu lernen, ich habe noch nie von ":target" gehört, es ist schwer, mit allem Schritt zu halten
Ich bin so glücklich, auf dieses Skript gestoßen zu sein, ich war ein oder zwei Tage davon entfernt, eine Menge Ziel-Links zu einer Website hinzuzufügen, an der ich gearbeitet habe, und diese Methode wird das Endergebnis rocken lassen.
Ziemlich begeistert, hoffe, die Webkit-Animation, die ich im Sinn habe, wird in älteren Browsern gut abgebaut...
Hallo!
Ich habe ein Experiment mit Ihrer Technik erstellt, sehen Sie mal!
http://cssdeck.com/item/307/animated-list-with-target
Hallo Chris,
Ich habe nach dem Lesen dieses Beitrags ein wenig mit :target herumgespielt. Funktioniert großartig, außer natürlich bei älteren IE-Versionen.
Ich habe früher "return false;" nach jeglichem Code verwendet, um das Seiten-Springen zu verhindern. Zum Beispiel (das war, bevor ich mit jQuery angefangen habe) habe ich immer, wenn ich ein onclick-Ereignis hatte, href auf "#" gesetzt, was zu einem Seiten-Sprung führte. Wenn ich "return false;" nach meinem JavaScript-Code hinzugefügt habe, tat es das nicht (onclick="example('test'); return false;"). Ich bin mir nicht sicher, ob es andere Probleme verursachen würde, es schien es nicht zu tun, als ich es benutzte.
Wie wäre es, das Seiten-Sprungverhalten mit javascript:void() zu vermeiden? Ich benutze es so href="javascript:void()"
Ich habe die :target-Pseudoklasse bereits mehrmals in Projekten verwendet, die für moderne Browser bestimmt waren. Zuletzt habe ich sie tatsächlich zur Erstellung von reinen CSS-Akkordeons verwendet.
Zugegeben, ich weiß, dass jQuery Akkordeons erstellen kann und HTML5 `summary` und `details` hat. Aber `summary` und `details` haben keine breite Browserunterstützung, während :target so gut wie IE9 und alle modernen Browser unterstützt.
Wenn Sie sich also in einer Situation befinden, in der der sehr große Unternehmenskunde nicht möchte, dass Sie JS-Bibliotheken verwenden, aber mit CSS3 einverstanden sind (ja, das ist mir passiert), ist dies ein Ansatz, der es wert ist, in Betracht gezogen zu werden. Ich habe einen Blogbeitrag über den Ansatz geschrieben.
http://blog.frankmtaylor.com/2012/04/17/clever-css-tricks-using-target-to-create-accordions/
Chris, ich glaube, ich habe das Problem gelöst, das Sie in "Fighting the Jump!" beschrieben haben.
Anstatt pushState/replaceState zu verwenden, verwende ich location.hash und location.replace, um den Hash entsprechend zu aktualisieren. Diese Mechanismen werten den CSS korrekt neu aus und umgehen die WebKit/Gecko-Bugs.
Ich habe hier einen Blogbeitrag geschrieben
http://www.zachleat.com/web/moving-target/
Ugh, egal – es ist keine Lösung, um den Sprung zu bekämpfen. Entschuldigung Chris!
Ich habe mit der Idee von Non-JS-Pop-ups herumgespielt (ein Freund bei der Arbeit fragte, ob das möglich sei) und als ich daran arbeitete, stolperte ich über Ihren Text hier. Ich habe gelesen, dass das Springen beim Scrollen unvermeidlich ist, und das machte mich traurig, aber dann begann ich trotzdem, es zu versuchen. Schließlich kam ich zu einer Lösung, und sie kann hier eingesehen werden: http://laboratorium.krazov.com/css-pop-up/. Sie hat natürlich ihre Mängel, aber das war nur zum Spaß.
(Ich habe die Kommentare bemerkt, nachdem ich fertig war, und ich zeige wahrscheinlich nichts Neues mit meinem Kommentar.)