Hier ist eine Zwei-Sekunden-Zusammenfassung. Wenn ein Element eine ID hat, können Sie mit dem natürlichen Verhalten des Browsers darauf verlinken. Das ist großartig, wenn Überschriften IDs haben, da es oft nützlich ist, direkt zu einem bestimmten Inhaltsabschnitt zu verlinken.
<h3 id="step-2">Step 2</a>
Wenn ich dazu geneigt wäre, könnte ich direkt zu dieser Überschrift verlinken, sei es von einer URL wie https://meine-website.com/#schritt-2 oder einem Link auf der Seite wie
<a href="#step-2">Jump to Step 2</a>
Es ist also ideal, wenn alle Überschriften eindeutige IDs haben.
Ich finde es jedoch viel zu viel Arbeit, meinen Überschriften manuell IDs hinzuzufügen. Jahrelang habe ich es auf dieser Seite mit jQuery so gemacht (verklagen Sie mich)
// Adjust this for targetting the headers important to have IDs
const $headers = $(".article-content > h3");
$headers.each((i, el) => {
const $el = $(el);
// Probably a flexbox layout style page
if ($el.has("a").length != 0) {
return;
}
let idToLink = "";
if ($el.attr("id") === undefined) {
// give it ID
idToLink = "article-header-id-" + i;
$el.attr("id", idToLink);
} else {
// already has ID
idToLink = $el.attr("id");
}
const $headerLink = $("<a />", {
html: "#",
class: "article-headline-link",
href: "#" + idToLink
});
$el.addClass("has-header-link").prepend($headerLink);
});
Dieses Skript geht einen Schritt weiter als nur das Hinzufügen von IDs (wenn noch keine vorhanden ist), indem es einen #-Link direkt in die Überschrift einfügt, der auf diese Überschrift verlinkt. Der Sinn dahinter ist zu demonstrieren, dass die Überschriften IDs *haben* und macht es einfach, Dinge wie Rechtsklick-Kopieren-Link zu tun. Hier ist die Demo, wenn Sie sie sehen möchten.
Problem! Plötzlich funktionierte das nicht mehr.
Nicht das Skript selbst, das funktioniert einwandfrei. Aber das native Browserverhalten, das es dem Browser ermöglicht, beim Laden der Seite zur Überschrift zu springen, ist kaputt. Ich stelle mir das als ein Race Condition vor
- Der HTML-Code kommt an
- Die Seite beginnt mit dem Rendern
- Der Browser sucht nach der ID in der URL, zu der er scrollen soll
- Er findet sie nicht…
- Oh, warte, da ist sie!
- Scrolle dorthin.
Der Schritt *Oh, warte, da ist sie!* stammt aus der Ausführung des Skripts, das die ID der Überschrift hinzufügt. Ich mache den Browsern keinen Vorwurf, nicht zu dynamisch eingefügten Links zu springen. Ich bin überrascht, dass das so lange funktioniert hat.
Es ist viel besser, die IDs zu haben, sobald der HTML-Code ankommt. Diese Seite läuft mit WordPress, daher wusste ich, dass ich es mit einer Art Content-Filter machen könnte. Es stellt sich heraus, dass ich mich nicht einmal darum kümmern musste, denn dafür gibt es natürlich ein Plugin: Karolína Vyskočilovás Add Anchor Links. Funktioniert bei mir super. Seine Technik besteht darin, dass es die ID zum Ankerlink selbst hinzufügt, was auch völlig in Ordnung ist. Ich schätze, das ist eine weitere Möglichkeit, die bestehenden IDs nicht zu verändern.

Wenn ich kein WordPress hätte, hätte ich einen anderen Weg gefunden, den HTML-Code serverseitig zu verarbeiten, um sicherzustellen, dass irgendein Link zur Überschrift vorhanden ist. Es gibt immer einen Weg. Tatsächlich würde ich, wenn es zu seltsam oder umständlich wäre, es während des Build-Prozesses oder in einem serverseitigen Filter zu tun, in einem Service Worker danach suchen. Ich habe Spaß daran gehabt, mit Cloudflare's HTMLRewriter zu experimentieren, das dazu durchaus in der Lage ist.
Erwähnenswert ist das neue Scroll-to-Text Fragment, das Chrome standardmäßig aktiviert hat: https://caniuse.com/#feat=url-scroll-to-text-fragment
Ja, das bemerke ich in letzter Zeit bei Klicks auf Seiten von Google. Ich frage mich, ob es auch in alle Browser Einzug halten wird oder nicht? Ich weiß es nicht, es scheint nichts zu sein, was *eine* Web-Standard sein *muss*. Bisher finde ich es nicht sehr hilfreich, so wie sie es in den Suchergebnissen gemacht haben. Aber ich mag, dass es existiert, da es eine Möglichkeit ist, maßgeschneiderte Links zu Dingen zu erstellen, unabhängig davon, was die Seite enthält.
Man könnte das Skript wahrscheinlich etwas verbessern, indem man den Location-Hash beim Dokument-Bereit aktualisiert?
Funktioniert das? Ich würde denken, man bräuchte stattdessen ein setTimeout oder etwas Ähnliches, sonst könnte die JavaScript-Engine diese erste Hash-Einstellung vielleicht optimieren.
Oder, um zur Position mit `window.scrollTop` und ähnlichem zu scrollen, nur wenn ein URL-Hash existiert und die Seiten-Y-Offset des Fensters 0 ist.
Ja! Ich habe mit jemandem gesprochen, der mir erzählt hat, dass er das damit macht (was auch einen sanften Scroll nach unten ermöglicht). Aber ich wollte eigentlich nur das Standardverhalten des Browsers beibehalten. Weniger Code schreiben statt mehr, verstehst du? Aber das ist definitiv eine Option. Ich war auch neugierig, ob Links auf Überschriften für SEO oder die Suchmaschinenerfahrung von Vorteil wären, aber scheinbar nicht.
Früher haben Sie IDs wie diese Ihren Überschriften zugewiesen
#artikel-header-id-${index}Jetzt, mit dem WordPress-Plugin, werden die IDs basierend auf dem Text in der Überschrift generiert, z.B.
#der-einfache-weg.Das bedeutet, dass alle bestehenden Links zu Artikelüberschriften jetzt kaputt sind.
Ugh ja, das stimmt. Das hätte ich erwähnen sollen. Die URLs selbst verlinken immer noch auf die richtige Seite, daher war es für mich ein akzeptabler Kompromiss, dass die Links nicht wirklich kaputt sind und dieses neue System einfacher zu warten ist und auf dem Standardverhalten des Browsers beruht.
Das Hinzufügen von IDs mit Laufzeit-JavaScript zu einer statischen Seite ist keine richtige Lösung, da diese IDs bereits im HTML vorhanden sein müssen. Deshalb sind die oben genannten Lösungen Hacks und stoßen auf Probleme mit verschiedenen Browsern und verschwenden unnötig CPU-Ressourcen.
Der beste Weg ist entweder, die IDs manuell hinzuzufügen, aber da Sie das nicht wollen, ist die zweitbeste Lösung, das HTML automatisch zu modifizieren/kochen, zum Beispiel mit einem sehr kleinen Python- oder Node.js-Skript, Sie können jede Sprache wählen.
Das Skript kann so funktionieren 3) Das modifizierte HTML speichern, das war's.
1) Alle IDs auf der Seite sammeln, mit einem Regex, und sie in einem Wörterbuch speichern.
2) Alle Überschriften sammeln, wieder mit einem Regex oder einer einfachen `
Genau. Das ist es, worüber ich im Artikel spreche, haha. Wenn Sie das Python-Skript teilen möchten, wäre das hilfreich für zukünftige Nutzer.
Das gefällt mir. Was mir noch besser gefallen würde, wäre, wenn es sich nur auf HEADINGS (Überschriften) und nicht auf HEADERS beziehen würde, da das zwei verschiedene Dinge sind, oder? Es ist immer ein Moment des Innehaltens und Nachdenkens für mich, wenn ich von `
`, `` etc.) spreche. #Namensgebungistnichtleicht :)
Ich sehe, wir haben hier eine Instanz übersehen, aber es waren sicherlich "Überschriften" im Rest. Danke für den Hinweis! :)
Marc Jenkins:
Ich benutze auch `scrollTop` dafür, und ich denke, das Hinzufügen einer Animation gibt dem Benutzer etwas Kontext. "Oh, es springt mich zu dem gewünschten Inhalt", vielleicht. Zufälligerweise habe ich kürzlich ein Drupal-Modul genau für diesen Zweck entwickelt, das die Generierung eindeutiger IDs behandelt, indem es alle übereinstimmenden Elemente auf der Seite findet und Duplikate nummeriert. https://www.drupal.org/project/auto_anchors