ghost-toc-plugin Vorschau
Ändern Sie Optionen im linken Panel. Das Inhaltsverzeichnis wird live neu gezeichnet und der Einbettungscode aktualisiert sich mit. Scrollen Sie, um den aktuellen Abschnitt hervorgehoben zu sehen.
Einführung
ghost-toc-plugin ist ein winziges (~3 KB), abhängigkeitsfreies schwebendes Inhaltsverzeichnis für Ghost. Es begann als Widget für Ghost, funktioniert aber auch in Notion-basierten Blogs und überall, wo du ein Skript einbinden kannst. Es liest die Überschriften deines Beitrags, erstellt die Liste automatisch, folgt dir beim Scrollen und hebt den gerade gelesenen Abschnitt hervor. Diese Seite ist ein Live-Beispiel: Die Liste an der Seite ist das echte Widget.
Installation
Einmal mit diesem Snippet einbinden, ohne Build-Schritt und ohne Theme-Dateien zu bearbeiten:
<link rel="stylesheet" href="https://cdn.jsdelivr.net/gh/GreedyLabs/ghost-toc-plugin@1/toc.css">
<script src="https://cdn.jsdelivr.net/gh/GreedyLabs/ghost-toc-plugin@1/toc.min.js"
data-content=".gh-content"
data-headings="h2,h3"
data-title="Inhalt"></script>
Code-Injection
Füge es in Ghost unter Settings → Code injection → Site Footer ein. Auf Notion-basiertem Hosting fügst du es im Feld für eigenen Code ein: oopy hat in den Site-Einstellungen ein head/footer-Codefeld, super.so hat einen Custom-Code-Bereich, und dort setzt du data-content auf .notion-page-content. Auf jeder anderen Seite platzierst du es direkt vor dem schließenden </body>-Tag. Lass es ohne async oder defer, damit es seine eigenen data-*-Optionen lesen kann.
Optionen
Alles wird über data-*-Attribute am Script-Tag konfiguriert: der Inhalts-Selektor, welche Überschriften einbezogen werden, der Titel, die Position und mehr:
data-content=".gh-content"
data-headings="h2,h3"
data-position="right"
data-min-width="1200"
data-top="100"
Anpassung
Farben und Platzierung sind voll anpassbar. Jede Klasse und CSS-Variable ist unter greedylabs-ghost-toc benannt, sodass das Widget nie mit deinem Theme kollidiert.
Farben
Das aktive Element folgt standardmäßig der Akzentfarbe deines Ghost-Themes (--ghost-accent-color); setze data-accent oder überschreibe die CSS-Variablen, um sie zu ändern. Das Widget bringt helle und dunkle Standardwerte mit und passt sich automatisch dem Systemthema an. Für bessere Lesbarkeit im Dunkelmodus überschreibe die Farben nur für Dunkel, ein einzelner fester Wert würde im Hellmodus unpassend wirken:
@media (prefers-color-scheme: dark) {
.greedylabs-ghost-toc {
--greedylabs-ghost-toc-muted: #c9d1d9;
--greedylabs-ghost-toc-border: rgba(255,255,255,.22);
}
}
Position
Nutze data-position für links oder rechts, data-top für den oberen Abstand, data-gap für den Abstand zum Inhalt und data-width für die Panelbreite. Unterhalb von data-min-width (oder wenn neben dem Inhalt kein Platz ist) blendet sich das Inhaltsverzeichnis selbst aus.
Häufige Fragen
Verlangsamt das Widget meine Seite?
Kaum. Es ist rund 3KB groß, ohne Abhängigkeiten und ohne externe Anfragen. Scrollen wird über einen passiven Listener verarbeitet und per requestAnimationFrame auf eine Berechnung pro Frame gebündelt; neu berechnet wird nur bei Änderungen der Dokumenthöhe (lazy geladene Bilder, giscus und ähnliche Widgets) über einen ResizeObserver.
Warum wird das Inhaltsverzeichnis nicht angezeigt?
Prüfe drei Dinge: ob dein data-content-Selektor zum tatsächlichen Artikel-Container passt, ob es mindestens zwei Überschriften gibt (darunter wird nichts erzeugt), und ob das Fenster breiter als data-min-width (standardmäßig 1200px) ist und neben dem Inhalt Platz für das Panel bleibt. Auf schmalen Bildschirmen und mobil blendet es sich bewusst aus.
Kann ich tiefere Überschriften wie h4 ins Inhaltsverzeichnis aufnehmen?
Ja. Liste die gewünschten Tags in data-headings kommagetrennt auf (z. B. h2,h3,h4). Du bestimmst genau, welche Überschriftenebenen in der Liste erscheinen.
Fazit
ghost-toc-plugin ist Open Source unter der MIT-Lizenz; Code und Issues findest du auf GitHub. Probiere die Optionen im linken Panel aus, beobachte die Live-Vorschau und kopiere das Snippet, wenn es passt. Wenn es dir geholfen hat, freue ich mich über einen Kaffee ☕.