← Zurück zur Übersicht
Editorial-Bild: Onpage-Optimierung: Title, Meta & H1

Das Wichtigste zuerst

On-page-Optimierung bedeutet, jede einzelne Seite zur bestmöglichen Antwort auf ihre Ziel-Suchanfrage zu machen.

Einleitung

Es gibt diese Seiten, die alles richtig machen und trotzdem nicht ranken. Der Content ist gut. Die Ladezeit stimmt. Backlinks sind da. Und trotzdem: Seite zwei, Position 14, unsichtbar.

Dann schaut jemand in den HTML-Code. Der Title-Tag ist eine Aneinanderreihung von Keywords ohne Satzstruktur. Die Meta-Description ist auf jeder Unterseite identisch. Die H1 fehlt, stattdessen steht die Hauptüberschrift in einem

. Und die ersten 500 Zeichen des Fließtexts sind eine Einleitung über das Unternehmen, die mit dem eigentlichen Thema der Seite nichts zu tun hat.

Das ist Onpage-Optimierung. Oder besser: das Fehlen davon.

Onpage-Optimierung beschreibt alle Maßnahmen, die du direkt auf deiner eigenen Website umsetzt, um Suchmaschinen das Verständnis deiner Inhalte zu erleichtern. Offpage-Faktoren wie Backlinks lassen sich dagegen nur indirekt steuern. Erlhofer definiert es so: „Bei der Onpage-Optimierung berücksichtigt man alle Faktoren, die innerhalb der eigenen Website zur besseren Bewertung durch Suchmaschinen beitragen" (Erlhofer, 11. Aufl., S. 649).

Das Besondere daran: Es ist der einzige SEO-Bereich, über den du vollständige Kontrolle hast. Du kannst niemanden zwingen, auf dich zu verlinken. Du kannst nicht steuern, wie schnell Googlebot deine Seite crawlt. Aber du kannst jedes einzelne HTML-Element deiner Seite so gestalten, dass es Suchmaschinen und Nutzern gleichermaßen hilft.

Dieser Artikel erklärt die inhaltlichen Onpage-Elemente nach ihrer tatsächlichen Ranking-Bedeutung: Title, Meta-Description, Überschriften, Textstruktur und interne Links. Keine Checkliste zum Abhaken, sondern ein Verständnis davon, warum diese Elemente wirken, wie Google sie verarbeitet und wo die häufigsten Fehler liegen.

Merksatz: „Onpage-Optimierung ist kein Häkchen-System. Es ist die Sprache, in der du mit Suchmaschinen redest."

50–60
Zeichen, optimale Title-Tag-Länge
60 %
aller Meta-Descriptions werden von Google umgeschrieben
1
H1 pro URL, nicht mehr, nicht weniger
1.000
Zeichen, hier müssen Keywords stehen

Warum Onpage-Optimierung der einzige Bereich ist, den du vollständig kontrollierst

Bevor wir ins Detail gehen, lohnt sich ein Blick auf die Gesamtarchitektur der Suchmaschinen-Optimierung. Erlhofer teilt die Ranking-Faktoren in drei Bereiche:

Onpage-Faktoren umfassen alles, was auf der Website selbst passiert: Title-Tags, Überschriften, Textinhalt, HTML-Struktur, interne Verlinkung, Bilder-Attribute. Offpage-Faktoren umfassen externe Signale wie Backlinks, Mentions, Social Signals. Und seit einigen Jahren gibt es eine dritte Kategorie: User-Signale wie Klickrate in den SERPs, Verweildauer und Pogo-Sticking, die sich irgendwo zwischen Onpage und Offpage bewegen, weil sie zwar auf der Seite entstehen, aber von Google extern gemessen werden (vgl. Erlhofer, S. 166–168).

Die Realität ist ernüchternd: Die meisten Websites werden nie systematisch onpage-optimiert. Erlhofer beschreibt es mit einer Beobachtung, die sich in 25 Jahren SEO-Praxis nicht verändert hat: „Der durchschnittliche Privatanwender, der seine Seiten im Web publiziert, ist meist schon froh, überhaupt eine komplette Seite erstellt zu haben" (S. 650). Selbst professionelle Agenturen priorisieren Design und Usability oft über Suchmaschinen-Optimierung, nicht aus Nachlässigkeit, sondern weil die verschiedenen Zielaspekte miteinander konkurrieren.

Das macht Onpage-Optimierung zum unterschätzten Hebel: Wer es systematisch macht, hat einen Vorteil gegenüber der Mehrheit, die es nicht tut. Besonders wirkungsvoll ist Onpage-Arbeit bei BOFU-Artikeln, Seiten mit transaktionalem Intent, bei denen jede Ranking-Position direkt mehr Conversions bedeutet. (→ BOFU-First: Warum der Verkaufsartikel zuerst kommt)

Merksatz: „Du kontrollierst keinen einzigen Backlink. Aber jedes einzelne HTML-Element auf deiner Seite."

Kernerkenntnis

On-Page ist deshalb unterschaetzt, weil die Konkurrenz hier nicht arbeitet, nicht weil der Hebel klein ist. Wer ein Element systematisch besser macht, das 80 Prozent der Mitbewerber halbherzig pflegen, gewinnt nicht durch Talent, sondern durch Disziplin.

Das Title-Tag: das mächtigste Element im HTML-Code

Wenn du aus diesem gesamten Artikel nur eine Sache mitnimmst, dann diese: Das </code>-Tag ist das wichtigste Onpage-Element. Es wird von allen Suchmaschinen in hohem Maße gewichtet, erscheint prominent in jeder Ergebnisliste und dient gleichzeitig als Bookmark-Bezeichnung im Browser (vgl. Erlhofer, S. 651).</p> <h3>Warum der Title so stark gewichtet wird</h3> <p>Nirgendwo sonst muss der Inhalt eines Dokuments so komprimiert und präzise formuliert werden wie im Title. Die Beschränkung auf eine einzige Zeile erzwingt Relevanz. Erlhofer formuliert es treffend: „Die enorme Bedeutung des Titels basiert darauf, dass nirgendwo sonst der Inhalt des Dokuments so knapp und präzise formuliert werden muss" (S. 651).</p> <p>Deshalb ranken kürzere Titles bei gleichen Keywords oft besser als längere: Sie haben eine höhere Informationsdichte. Jedes Wort in einem kurzen Title ist mit hoher Wahrscheinlichkeit ein Keyword. In einem langen Title verwässern Füllwörter die Keyword-Dichte, ohne Mehrwert zu schaffen (vgl. Erlhofer, S. 655).</p> <h3>Die optimale Länge: Pixel, nicht Zeichen</h3> <p>Die Frage „Wie lang darf ein Title sein?" wird falsch gestellt. Google bemisst die Snippet-Breite in Pixeln, nicht in Zeichen. Der Buchstabe „W" nimmt deutlich mehr Pixel ein als „I", weshalb eine exakte Zeichenzahl irrelevant ist (vgl. Erlhofer, S. 655).</p> <p>Da aber niemand mit Pixelbreiten arbeiten kann, gilt als Orientierung: <strong>50–60 Zeichen</strong>, also etwa vier bis zehn Wörter. Suchmaschinen indexieren zwar bis zu 250 Zeichen des Title-Tags, aber die sichtbare Anzeige in der SERP beschränkt sich auf diesen Bereich. Alles darüber wird abgeschnitten, und was nicht sichtbar ist, kann keine Klicks generieren.</p> <p>Für die Praxis bedeutet das: <strong>Die wichtigsten Keywords gehören in die ersten 50 Zeichen.</strong> Nicht weil Google den Rest ignoriert, sondern weil der Rest in der SERP nicht erscheint. Eye-Tracking-Studien zeigen, dass Nutzer sich nur einen kurzen Moment die Titel innerhalb einer Ergebnisliste anschauen und dann schnell entscheiden (vgl. Erlhofer, S. 652).</p> <h3>Keyword-Position und das Proximity-Verfahren</h3> <p>Google analysiert nicht nur, ob ein Keyword im Title vorkommt, sondern auch wo und in welcher Nähe zu anderen Keywords. Der Query-Prozessor berechnet mit dem Proximity-Verfahren den Abstand zwischen Suchbegriffen und vergibt höhere Gewichtungen an Dokumente, bei denen die Terme näher beieinanderstehen (vgl. Erlhofer, S. 654).</p> <p>Das bedeutet konkret: Wenn jemand nach „Jacht Charter Elba" sucht, rankt ein Title mit „Segeln: Professionelle Jacht-Charter auf Elba" besser als einer mit „Segeln auf Elba, individuelle Reisen und Charter für Jachten", weil die Suchbegriffe im ersten Beispiel näher beieinanderstehen.</p> <p><strong>Achtung:</strong> Beim „Verschönern" des Titels für menschliche Leser schleichen sich Proximity-Fehler ein. Stoppwörter zwischen Keywords sind akzeptabel. Sie werden bei der Normalisierung entfernt. Aber zu viel Abstand oder vertauschte Reihenfolge kostet Ranking-Punkte (vgl. Erlhofer, S. 654).</p> <h3>Stoppwörter im Title: mehr Schaden als Nutzen?</h3> <p>Ein häufiges Missverständnis: Stoppwörter wie „der", „die", „für", „und" im Title seien SEO-schädlich. Das Gegenteil ist der Fall. Stoppwörter machen einen Title lesbarer und damit klickbarer. Suchmaschinen entfernen sie ohnehin bei der Normalisierung, sodass die Keyword-Bewertung nicht leidet (vgl. Erlhofer, S. 652–653).</p> <p>Der Vergleich:</p> <p>| Variante | Title | Problem |</p> <p>|----------|-------|---------|</p> <p>| Keyword-Dump | <code>segeln jacht charter elba</code> | Unlesbar, unseriös, keine Klicks |</p> <p>| Optimiert | <code>Segeln: Professionelle Jacht-Charter auf Elba</code> | Lesbar, keywords nah beieinander, Doppelpunkt als optischer Trenner |</p> <p>Nach der Normalisierung sind beide Titles identisch. Aber die Klickrate unterscheidet sich drastisch. Und bei Suchmaschinen, die Click-Popularity einbeziehen, also bei Google, gewinnt der attraktivere Title zusätzlich an Ranking-Bedeutung (vgl. Erlhofer, S. 652).</p> <h3>Google schreibt Title-Tags um, und das ist kein Bug</h3> <p>Seit 2021 generiert Google verstärkt eigene Title-Tags für SERP-Snippets, statt die vom Webmaster vorgegebenen zu übernehmen. Verantwortlich sind KI-Algorithmen, die versuchen, passgenaue Snippets für bestimmte Suchanfragen zu erzeugen (vgl. Erlhofer, S. 656).</p> <p>Das sollte dich aber nicht davon abhalten, optimierte Titles zu schreiben. Denn: „Sind diese passgenau und gut formuliert, dann werden Ihre Titel häufiger verwendet, und damit haben Sie einen Optimierungsvorteil gegenüber Wettbewerbern in den SERPs" (Erlhofer, S. 656).</p> <p>Google schreibt Titles besonders oft um, wenn sie nicht zur Suchanfrage passen, zu lang oder zu kurz sind, Keyword-Stuffing enthalten oder wenn der Title identisch mit der H1 ist, der Fließtext aber relevantere Phrasen enthält.</p> <h3>Die 5 häufigsten Title-Tag-Fehler</h3> <p>1. <strong>Identischer Title auf allen Seiten</strong>, Google kann nicht unterscheiden, welche URL für welche Suchanfrage relevant ist. Jede Seite braucht einen einzigartigen Title.</p> <p>2. <strong>Keyword-Stuffing</strong>, „SEO Agentur SEO Beratung SEO Optimierung München" wird als Spam erkannt und abgewertet. Wiederholung im Title bringt keine messbare Verbesserung (vgl. Erlhofer, S. 655).</p> <p>3. <strong>Firmenname am Anfang</strong>, Der Firmenname verschwendet die wertvollen ersten Zeichen. Er gehört ans Ende, getrennt durch Pipe oder Dash.</p> <p>4. <strong>Übermäßige Sonderzeichen</strong>, Typografische Spielereien wie <code>★★★ BESTE ANGEBOT ★★★</code> wirken unseriös und verschwenden Pixel-Platz.</p> <p>5. <strong>Title ohne Bezug zum Content</strong>, Google merkt, wenn ein Title eine Erwartung weckt, die der Inhalt nicht einlöst. Das führt zu Pogo-Sticking und langfristig zu Ranking-Verlust.</p> <blockquote class="merksatz"> <p><strong>Merksatz:</strong> „Ein Title-Tag ohne Keyword ist wie ein Ladenschild ohne Namen." (Erlhofer)</p> </blockquote> </section> <section class="reveal"> <h2>Meta-Description: kein Rankingfaktor, und trotzdem entscheidend</h2> <p>Hier wird es kontraintuitiv. Die Meta-Description ist laut Google seit 2009 kein direkter Rankingfaktor mehr. Google hat das explizit bestätigt (vgl. Google Search Blog, September 2009). Erlhofer ordnet es ein: „Eine gut und attraktiv formulierte Meta-Description regt aber eher zu einem Klick in den SERPs an als eine schlechte. Insofern kann eine Meta-Description als indirekter Rankingfaktor gesehen werden" (S. 657).</p> <p>Die Logik: Eine bessere Description → höhere Klickrate (CTR) → Google registriert erhöhtes Nutzerinteresse → bessere Rankings. Der Umweg über die CTR macht die Description zu einem der wirkungsvollsten Hebel, die kein direkter Rankingfaktor sind.</p> <h3>60 % werden von Google umgeschrieben</h3> <p>Eine Ahrefs-Studie von 2020 zeigt: In über 60 % aller Fälle verändert Google die Meta-Description (vgl. Erlhofer, S. 657; Ahrefs Blog 2020). Heute ist die Quote wahrscheinlich noch höher. Google extrahiert stattdessen eine Textpassage aus der Seite, die besser zur jeweiligen Suchanfrage passt.</p> <p>Das passiert besonders oft, wenn die Description nicht zum Suchbegriff passt, zu kurz ist (unter 5–6 Wörter), identisch auf mehreren URLs vorkommt, oder wenn das gesuchte Keyword in der Description nicht enthalten ist, aber im Fließtext der Seite.</p> <h3>Warum eine leere Description besser ist als eine doppelte</h3> <p>Erlhofer ist hier unmissverständlich: „Vermeiden Sie unbedingt doppelte Description-Meta-Tags! Lassen Sie die Angaben lieber weg, als dass Sie hier Duplicate Content produzieren" (S. 658).</p> <p>Die Logik: Eine fehlende Description signalisiert Google, dass es selbst ein passendes Snippet generieren soll, was es ohnehin tut. Eine identische Description auf 500 Produktseiten signalisiert dagegen: Hier hat niemand die Inhalte individuell aufbereitet. Das ist ein negatives Qualitätssignal. Besonders kritisch ist das für Händler, die Herstellertexte 1:1 übernehmen, auf Marktplätzen und im eigenen Shop. (→ Warum das ein strategisches Problem ist: <a href="/posts/d2c-vs-marktplatz">D2C vs. Marktplatz</a>)</p> <p>Der pragmatische Ansatz: Schreibe individuelle Descriptions für die 20–30 URLs mit den besten Rankings oder dem höchsten Traffic-Potenzial. Lass die Descriptions für den Rest leer und lass Google selbst generieren. Du kannst sie dann Stück für Stück nachrüsten (vgl. Erlhofer, S. 658).</p> <h3>Die optimale Länge: 150–160 Zeichen</h3> <p>Auch bei Descriptions bemisst Google die Länge in Pixeln, nicht Zeichen. Aber als Arbeitswert gilt: <strong>Die wesentlichen Inhalte sollten in 150–160 Zeichen abgehandelt sein</strong>, das entspricht etwa 20 Wörtern (vgl. Erlhofer, S. 659).</p> <p>2017 führte Google Long Descriptions mit bis zu vier Zeilen ein, was die Empfehlung kurzzeitig auf 300–325 Zeichen hochschraubte. Heute zeigt Google je nach Device und Suchanfrage unterschiedliche Längen an, mobil eher drei Zeilen mit weniger Zeichen, Desktop meist zwei Zeilen. Der wichtigste Tipp: <strong>Alles Relevante gehört in die ersten zwei Sätze</strong> (vgl. Erlhofer, S. 659).</p> <h3>Emojis in der Description: ja, aber selektiv</h3> <p>Google erlaubt Emojis und Icons in Title und Description. Die Anzeige ist allerdings nicht zuverlässig. Sie hängt vom Suchbegriff und Thema ab. Einige Symbole haben sich als stabil etabliert: (Häkchen für Aufzählungen), → (Pfeil für Aufmerksamkeitslenkung). Fünf Sterne nacheinander als Bewertungssimulation blockt Google jedoch aktiv (vgl. Erlhofer, S. 660–661).</p> <p>Der Ansatz: Teste ein bis zwei Häkchen oder Pfeile in Descriptions für Seiten mit hoher Impression-Zahl. Miss die CTR-Veränderung in der Google Search Console über 2–4 Wochen. Wenn die CTR steigt, behalte sie. Wenn nicht, entferne sie.</p> <blockquote class="merksatz"> <p><strong>Merksatz:</strong> „Die Meta-Description ist dein 160-Zeichen-Verkaufsgespräch. Google hört nicht zu, aber die Suchenden tun es."</p> </blockquote> </section> <section class="reveal"> <h2>Überschriften-Hierarchie: von H1 bis H6 die semantische Architektur deiner Seite</h2> <p>Überschriften sind das dritte Kernelement der Onpage-Optimierung. Und gleichzeitig das Element, das am häufigsten falsch umgesetzt wird. Nicht technisch, sondern semantisch.</p> <h3>Nur eine H1 pro URL: die Regel, die fast alle brechen</h3> <p>Erlhofer ist eindeutig: „Verwenden Sie idealerweise nur eine einzige <code><h1></code>-Überschrift auf einer URL. Am besten enthält diese Hauptüberschrift noch das Seiten-Keyword, sodass Suchmaschinen eindeutig feststellen können, dass das Thema dieser Seite sich mit dem Haupt-Keyword deckt" (S. 670).</p> <p>Eine H1 sagt Google: „Das ist das Hauptthema dieser Seite." Zwei H1-Tags sagen: „Diese Seite hat zwei Hauptthemen", was entweder falsch ist oder darauf hinweist, dass die Seite thematisch nicht fokussiert ist. Google kann damit arbeiten, aber es verwässert das Signal.</p> <p>Häufiger Fehler: CMS-Templates, die das Logo oder den Seitentitel in eine H1 verpacken. Dann hat die eigentliche Content-Überschrift nur noch eine H2, und das stärkste Heading-Signal geht an den Firmennamen statt an das Thema.</p> <h3>Die semantische Hierarchie: H2 unter H1, H3 unter H2</h3> <p>Die Heading-Tags von H1 bis H6 bilden eine Gliederung, ähnlich einem Buch-Inhaltsverzeichnis. H2 ist die „Unterüberschrift" zu H1, H3 die Unterüberschrift zu H2 und so weiter. Erlhofer empfiehlt H5 und H6 für weniger wichtige Bereiche wie Footer oder Randspalten. In der Navigation sollten keine Heading-Tags verwendet werden (vgl. Erlhofer, S. 670).</p> <p>Korrekte Struktur:</p> <pre>�PROT_7�</pre> <p><strong>Falsche Struktur</strong> (aber erschreckend häufig):</p> <pre>�PROT_8�</pre> <h3>Warum CSS-formatierte Überschriften für Google unsichtbar sind</h3> <p>Einer der häufigsten technischen Fehler: Webdesigner verzichten auf HTML-Heading-Tags und formatieren stattdessen einen <code><div></code> oder <code><span></code> per CSS als Überschrift. Visuell sieht es identisch aus. Für Suchmaschinen ist der Unterschied fundamental.</p> <p>Erlhofer warnt explizit: „Suchmaschinen haben dann keine Chance mehr, diese Inhalte als Überschriften zu gewichten" (S. 669). Ein <code><div class="headline">Segeln auf Elba</div></code> ist für Google ein Absatz unter vielen, keine Überschrift. Ein <code><h2>Segeln auf Elba</h2></code> ist ein klar erkennbares Heading-Signal.</p> <p>Die Lösung ist einfach: Verwende die Standard-HTML-Tags H1–H6 und passe ihr Aussehen per CSS an. So bekommt Google die semantische Information, und die Designer ihre typografische Freiheit:</p> <pre>�PROT_13�</pre> <blockquote class="merksatz"> <p><strong>Merksatz:</strong> „Überschriften sind keine Formatierung. Sie sind die Gliederung deines Dokuments für Mensch und Maschine."</p> </blockquote> </section> <section class="reveal"> <h2>Fließtext, Hervorhebungen und die invertierte Pyramide</h2> <p>Der Fließtext innerhalb des <code><body></code> ist das Herzstück jeder optimierten Seite. Hier liegt der meiste Content, hier verteilen sich die Keywords, hier entscheidet sich, ob eine Seite thematisch erschöpfend behandelt wird oder nur die Oberfläche kratzt.</p> <h3>Die invertierte Pyramide: ein Prinzip aus dem Journalismus</h3> <p>Jakob Nielsen hat bereits 1997 in einer Studie über Web-Leseverhalten gezeigt: Im Web wird nicht gelesen, sondern gescannt. Nutzer überfliegen Texte, springen zwischen Absätzen und entscheiden in Sekunden, ob eine Seite relevant ist (vgl. Erlhofer, S. 663–664).</p> <p>Die Konsequenz ist die <strong>invertierte Pyramide</strong>, ein journalistisches Grundprinzip, das perfekt für Webtexte funktioniert: Das Wichtigste steht am Anfang, die Details folgen mit abnehmender Bedeutung. Erlhofer beschreibt den Ursprung: „Angeblich ist dieses Prinzip entstanden, als Nachrichten noch per Telegraf übermittelt wurden. Bei einem Abbruch sollte der bisher übertragene Text dennoch verständlich und nutzbar sein" (S. 664).</p> <p>Für SEO bedeutet das: <strong>Alle Schlüsselbegriffe sollten möglichst mehrfach in den ersten 1.000 Zeichen auftreten.</strong> Nicht als Keyword-Stuffing, sondern als natürliche Konsequenz davon, dass du sofort zum Thema kommst, statt mit einer Unternehmensvorstellung oder allgemeinen Einleitung zu beginnen (vgl. Erlhofer, S. 664–665).</p> <h3>Die Erste-1.000-Zeichen-Regel</h3> <p>Die ersten 1.000 Zeichen einer Seite sind der Bereich, den sowohl Suchmaschinen als auch Scanner-Leser als erstes verarbeiten. Wenn dein Haupt-Keyword erst nach 1.500 Zeichen auftaucht, nach einer Hero-Section, einem Cookie-Banner-Dummy und drei Absätzen Firmengeschichte, verlierst du doppelt: Die Suchmaschine bewertet die Keyword-Position als weniger prominent, und der Nutzer hat längst abgesprungen.</p> <p>Was in die ersten 1.000 Zeichen gehört: das Haupt-Keyword (mindestens einmal), die Kernaussage der Seite, der wichtigste Mehrwert für den Leser. Was nicht hineingehört: „Willkommen auf unserer Seite", Firmenhistorie, allgemeine Branchenbeschreibungen, oder Absätze die mit „heute" beginnen. Welches Keyword du hier platzierst, Shorthead, Midtail oder Longtail, entscheidet sich in der <a href="/posts/longtail-vs-shorthead-keywords">Keyword-Strategie</a>, nicht erst bei der Onpage-Optimierung.</p> <h3>Absätze mit <code><p></code>: ein Gedanke pro Absatz</h3> <p>Suchmaschinen erkennen <code><p></code>-Tags als semantische Einheiten und werten Absätze in vielen Fällen einzeln aus. Ein Absatz mit einem klaren Hauptgedanken liefert ein deutlicheres Signal als ein Block, in dem drei verschiedene Themen durcheinanderlaufen (vgl. Erlhofer, S. 664–665).</p> <p>Die Faustregel: Ein Absatz, ein Gedanke. Wenn du innerhalb eines Absatzes das Thema wechselst, mach einen neuen auf. Das hilft gleichzeitig der Lesbarkeit und der semantischen Auswertung.</p> <h3>Texthervorhebungen: <code><strong></code> und <code><em></code> statt CSS-Bold</h3> <p>Suchmaschinen bewerten hervorgehobene Begriffe höher als normalen Fließtext, aber nur, wenn die Hervorhebung über HTML-Tags wie <code><strong></code> oder <code><em></code> erfolgt. Eine CSS-Klasse wie <code>.fett { font-weight: bold; }</code> sieht visuell identisch aus, ist für Suchmaschinen aber unsichtbar (vgl. Erlhofer, S. 667).</p> <p>Erlhofer erklärt den Fehler: „Mit einer entsprechenden CSS-Klasse mag das Beispiel in jedem Browser zum gewünschten Ziel führen; Suchmaschinen erwarten jedoch die Verwendung von Standard-HTML-Auszeichnungen" (S. 667).</p> <p>Die praktische Empfehlung: Nutze <code><strong></code> für wichtige Begriffe, die du visuell und semantisch hervorheben willst. Aber übertreibe es nicht, nicht jedes Keyword bei jedem Auftreten muss fett sein. Erlhofer rät, die Hervorhebung primär für Nutzer einzusetzen, nicht für Suchmaschinen. Fette Begriffe, die Kernelemente eines Textes markieren und den Lesefluss leiten, sind sinnvoll. Keywords als Selbstzweck fett zu setzen, ist es nicht (vgl. Erlhofer, S. 668).</p> <blockquote class="merksatz"> <p><strong>Merksatz:</strong> „Die invertierte Pyramide: Das Wichtigste zuerst, für Leser und für Crawler."</p> </blockquote> </section> <section class="reveal"> <h2>Interne Links und Anchor-Texte: der unterschätzte Onpage-Hebel</h2> <p>Interne Verlinkung wird in den meisten Onpage-Guides als Randnotiz behandelt. Tatsächlich gehören Anchor-Texte zu den am stärksten gewichteten Onpage-Elementen. Erlhofer zählt sie neben Title, Fließtext und Überschriften zur „ersten Klasse" der optimierbaren Elemente (vgl. Erlhofer, S. 677).</p> <h3>Anchor-Text als thematische Empfehlung</h3> <p>Der entscheidende Punkt bei internen Links ist nicht der Link selbst, sondern der Text, der den Link trägt. Wenn Seite A auf Seite B verlinkt und der Anchor-Text „Charterverträge" lautet, passieren zwei Dinge: Seite B erhält ein Signal, dass sie relevant für „Charterverträge" ist. Und Seite A erhält ein Signal, dass sie thematisch passend verlinkt, die „thematische Passgenauigkeit des Anchor-Textes mit dem zu erwartenden Inhalt verstärkt die Bewertung" beider Seiten (vgl. Erlhofer, S. 672).</p> <p>Das bedeutet: Vermeide generische Anchor-Texte wie „hier klicken", „mehr erfahren" oder „weiterlesen". Diese sagen der Suchmaschine nichts über die Zielseite. Verwende stattdessen das Keyword der Zielseite als Anchor-Text, nicht als Manipulation, sondern als präzise Beschreibung dessen, was den Leser erwartet.</p> <h3>Links nicht als Grafiken einsetzen</h3> <p>Erlhofer betont einen Punkt, der 2026 immer noch relevant ist: „Deshalb sollten Sie in jedem Fall auf die Verwendung von Grafiken als Ersatz für einen Text verzichten" (S. 672). Aus einem Bild-Link ohne Text kann die Suchmaschine keinen Anchor-Text extrahieren. Das Alt-Attribut des Bildes wird als Ersatz gewertet, erhält aber eine geringere Bewertung als reiner Text (vgl. Erlhofer, S. 673).</p> <p>Die Lösung: Jede Navigation sollte responsiv, ohne texttragende Bilder und per HTML + CSS umgesetzt sein. Falls Bilder als Links unvermeidbar sind, setze immer ein aussagekräftiges <code>alt</code>- und <code>title</code>-Attribut.</p> <h3>Das title-Attribut bei Links</h3> <p>Das <code>title</code>-Attribut in einem <code><a></code>-Tag bietet eine zusätzliche Möglichkeit, dem Browser (und der Suchmaschine) Kontext zu geben. Es erscheint als Tooltip beim Mouseover. Ob Google das <code>title</code>-Attribut direkt in die Ranking-Berechnung einbezieht, ist unklar, aber es ist ein positives Signal, und es verbessert die Usability (vgl. Erlhofer, S. 674).</p> <p>Erlhofer empfiehlt, Text-Navigationslinks selektiv mit <code>title</code>-Attributen zu versehen: „Sie können auch Flexionen des Navigationsbegriffs verwenden oder bestimmte Zusätze wie ‚zu' oder ‚mehr erfahren über' einsetzen" (S. 674).</p> <blockquote class="merksatz"> <p><strong>Merksatz:</strong> „Jeder interne Link ist eine Empfehlung. Der Anchor-Text sagt, wofür du die Zielseite empfiehlst."</p> </blockquote> </section> <section class="reveal"> <h2>Die Onpage-Elemente nach Gewichtung: was zählt am meisten</h2> <p>Nicht alle Onpage-Elemente sind gleich wichtig. Erlhofer unterscheidet explizit zwischen „erster Klasse" und „zweiter Klasse" der Optimierungselemente:</p> <h3>Erste Klasse (höchste Ranking-Bedeutung)</h3> <p>| Element | Warum | Häufigster Fehler |</p> <p>|---------|-------|-------------------|</p> <p>| <strong>Title-Tag</strong> | Stärkste Keyword-Gewichtung, erscheint in SERP | Identisch auf allen Seiten, Keyword-Stuffing |</p> <p>| <strong>H1-Überschrift</strong> | Definiert das Hauptthema der URL | Fehlt oder ist auf Firmennamen gesetzt |</p> <p>| <strong>Fließtext (erste 1.000 Zeichen)</strong> | Themenrelevanz, Keyword-Dichte, semantische Tiefe | Einleitung ohne Themenbezug |</p> <p>| <strong>Anchor-Texte interner Links</strong> | Thematische Zuordnung für Quell- und Zielseite | „Hier klicken" statt beschreibender Text |</p> <h3>Zweite Klasse (unterstützend, aber nicht entscheidend)</h3> <p>| Element | Warum | Praxis-Empfehlung |</p> <p>|---------|-------|-------------------|</p> <p>| <strong>Meta-Description</strong> | Kein direkter Rankingfaktor, aber CTR-Hebel | Individuell für Top-30-Seiten schreiben |</p> <p>| <strong>H2–H4-Überschriften</strong> | Gliederung und Neben-Keywords | Semantisch korrekte Hierarchie einhalten |</p> <p>| <strong>Texthervorhebungen (strong/em)</strong> | Leichte Gewichtungserhöhung für markierte Begriffe | Sparsam für Kernbegriffe einsetzen |</p> <p>| <strong>Alt-/Title-Attribute (Bilder)</strong> | Bilder-SEO, Barrierefreiheit | Beschreibend, Keyword wenn natürlich |</p> <p>| <strong>Aufzählungen (ul/ol)</strong> | Höhere Gewichtung als reiner Fließtext | Für Featured-Snippet-Potenzial nutzen |</p> <p>| <strong>Tabellen (mit thead/tbody)</strong> | Strukturierte Information, Snippet-fähig | Semantisch korrekte HTML-Tabellen verwenden |</p> <h3>Dritte Klasse (minimal bis kein Einfluss)</h3> <p>| Element | Warum | Einordnung |</p> <p>|---------|-------|------------|</p> <p>| <strong>Meta-Keywords</strong> | Von Google vollständig ignoriert seit Jahren | Weglassen, spart Arbeit |</p> <p>| <strong>HTML-Kommentare</strong> | Werden nicht gewichtet | Für Code-Dokumentation, nicht für SEO |</p> <p>| <strong>Hidden Input-Felder</strong> | Kein messbarer Effekt (vgl. Erlhofer, S. 679) | Ignorieren |</p> <p>| <strong>Noscript-Tags</strong> | Google berücksichtigt sie nicht direkt (seit 2018) | Nur als Lazy-Loading-Fallback relevant |</p> <p>Diese Hierarchie ist der Grund, warum viele Onpage-Audits Zeitverschwendung sind: Sie prüfen 50 Elemente mit gleichem Gewicht, anstatt die 4 Elemente der ersten Klasse zu priorisieren. Wenn dein Title falsch ist, hilft dir kein noch so perfektes Alt-Attribut.</p> <blockquote class="merksatz"> <p><strong>Merksatz:</strong> „Die einflussreichen Bereiche sind Title, Fließtext, Überschriften und Verweise. Alles andere ist Sahnehäubchen." (nach Erlhofer, S. 677)</p> </blockquote> </section> <section class="reveal"> <h2>7 Fehler, die ich in jedem zweiten Onpage-Audit finde</h2> <p>Die meisten Onpage-Probleme sind keine Edge-Cases, sondern wiederkehrende Muster, die sich durch ganze Websites ziehen.</p> <p><strong>1. Ein Title für alle Seiten.</strong> Content-Management-Systeme wie WordPress setzen im Standard oft einen globalen Title. Wer das nicht ändert, hat auf 200 URLs denselben Seitentitel. Google kann die Seiten nicht unterscheiden.</p> <p><strong>2. Die H1 ist der Firmenname.</strong> Im Theme-Template steht <code><h1>{{site.title}}</h1></code> im Header. Die eigentliche Überschrift wird zu einer H2 degradiert. Das stärkste Heading-Signal geht an „Max Mustermann GmbH" statt an das Seitenthema.</p> <p><strong>3. Meta-Description per Textbaustein.</strong> „Willkommen bei [Firma]. Wir bieten [Branche] in [Stadt]. Kontaktieren Sie uns!", auf jeder Seite identisch. Google ignoriert sie und generiert ein eigenes Snippet, das oft schlechter ist.</p> <p><strong>4. Keine interne Verlinkung im Content.</strong> Die Navigation existiert, aber im Fließtext verlinkt nichts auf andere Seiten. Damit fehlt das wichtigste Signal für thematische Zusammenhänge zwischen den URLs.</p> <p><strong>5. CSS-Überschriften statt HTML-Headings.</strong> Der Designer hat <code><div class="h2"></code> statt <code><h2></code> verwendet. Visuell kein Unterschied. Für Google existieren die Überschriften nicht.</p> <p><strong>6. Keywords erst nach 2.000 Zeichen.</strong> Der Text beginnt mit einer allgemeinen Einleitung, die mit dem Seitenthema nichts zu tun hat. Die Suchmaschine findet das Keyword erst nach dem dritten Absatz, zu spät für eine starke Gewichtung.</p> <p><strong>7. Anchor-Texte ohne Aussage.</strong> Interne Links sind „hier", „mehr dazu", „weiterlesen". Google weiß nicht, worum es auf der Zielseite geht. Die Link-Bewertung verpufft.</p> </section> <section class="reveal"> <h2>Was hat sich seit Erlhofers erster Auflage verändert, und was nicht?</h2> <p>Erlhofers Standardwerk liegt mittlerweile in der 11. Auflage vor. Die Grundprinzipien der Onpage-Optimierung haben sich seit der 1. Auflage erstaunlich wenig verändert. Title-Tags waren 2004 das wichtigste Element, und sind es 2026 immer noch.</p> <p>Was sich verändert hat: <strong>Google ist besser geworden darin, schlechte Optimierung zu ignorieren.</strong> Keyword-Stuffing im Title wird erkannt und umgeschrieben. Doppelte Descriptions werden durch eigene Snippets ersetzt. CSS-Tricks zur Keyword-Platzierung verpuffen.</p> <p>Was sich nicht verändert hat: <strong>Die Grundlogik, dass klar strukturierter, semantisch korrekter HTML-Code besser rankt als unstrukturiertes Design-First-Markup.</strong> Eine saubere Heading-Hierarchie, ein präziser Title, ein Fließtext der sofort zum Thema kommt, das sind keine Tricks, sondern die Grundlage dafür, dass Suchmaschinen eine Seite überhaupt korrekt verstehen können.</p> <p>Der vielleicht wichtigste Wandel: Die Onpage-Optimierung ist 2026 nicht mehr von der Content-Qualität zu trennen. Ein technisch perfekt optimierter Title nützt nichts, wenn der Content dahinter dünn ist. Und ein brillanter 3.000-Wörter-Artikel nützt nichts, wenn sein Title „Untitled" lautet und seine H1 fehlt.</p> <p>Onpage-Optimierung 2026 bedeutet: Die technische Grundlage schaffen, damit großartiger Content auch gefunden wird.</p> <blockquote class="merksatz"> <p><strong>Merksatz:</strong> „Die Technik hat sich verändert. Die Logik nicht: Sag klar, worum es geht, im Title, in der H1, im ersten Absatz."</p> </blockquote> </section> <section class="reveal"> <h2>Onpage-Faktoren im Detail</h2> <p>Jeder Onpage-Faktor hat eine andere Wirkung. Die folgenden Tabs zeigen dir, worauf es bei den fünf wichtigsten Elementen ankommt, und was du konkret tun kannst.</p> <div class="tab-widget" role="region" aria-label="Onpage-Faktoren: Tipps pro Element"> <div class="tab-buttons" role="tablist" aria-label="Onpage-Faktor-Kategorien"> <button class="tab-btn" role="tab" id="tab-title" aria-selected="true" aria-controls="panel-title">Title</button> <button class="tab-btn" role="tab" id="tab-meta" aria-selected="false" aria-controls="panel-meta">Meta</button> <button class="tab-btn" role="tab" id="tab-headings" aria-selected="false" aria-controls="panel-headings">Headings</button> <button class="tab-btn" role="tab" id="tab-content" aria-selected="false" aria-controls="panel-content">Content</button> <button class="tab-btn" role="tab" id="tab-links" aria-selected="false" aria-controls="panel-links">Links</button> </div> <div class="tab-panel" id="panel-title" role="tabpanel" aria-labelledby="tab-title" aria-hidden="false"> <p><strong>Title-Tag</strong>, das stärkste Onpage-Signal. 50–60 Zeichen, Keyword vorne, keine Wiederholungen. Stoppwörter sind erlaubt und erhöhen die Klickrate. Firmenname gehört ans Ende.</p> <p><strong>Tipp:</strong> Prüfe in der Google Search Console, welche Titles Google umschreibt. Wenn dein Title übernommen wird, hast du alles richtig gemacht.</p> </div> <div class="tab-panel" id="panel-meta" role="tabpanel" aria-labelledby="tab-meta" aria-hidden="true"> <p><strong>Meta-Description</strong>, kein direkter Rankingfaktor, aber CTR-Hebel. 150–160 Zeichen, relevante Keywords erwähnen, Call-to-Action einbauen. Lieber leer lassen als identisch auf allen Seiten.</p> <p><strong>Tipp:</strong> Schreibe individuelle Descriptions nur für deine Top-30-Seiten. Den Rest kann Google selbst generieren.</p> </div> <div class="tab-panel" id="panel-headings" role="tabpanel" aria-labelledby="tab-headings" aria-hidden="true"> <p><strong>H1–H6 Hierarchie</strong>, genau eine H1 pro URL. H2 unter H1, H3 unter H2. Keine Heading-Level überspringen. HTML-Tags statt CSS-Klassen verwenden.</p> <p><strong>Tipp:</strong> Prüfe mit dem Browser-DevTool, ob dein CMS die H1 auf den Firmennamen statt auf das Seitenthema setzt.</p> </div> <div class="tab-panel" id="panel-content" role="tabpanel" aria-labelledby="tab-content" aria-hidden="true"> <p><strong>Fließtext</strong>, invertierte Pyramide: Wichtigstes zuerst. Keyword in den ersten 1.000 Zeichen. Ein Gedanke pro Absatz. <code><strong></code> statt CSS-Bold für Hervorhebungen.</p> <p><strong>Tipp:</strong> Zähle die Zeichen bis zum ersten Keyword-Auftreten. Liegt es über 1.000? Dann kürze die Einleitung.</p> </div> <div class="tab-panel" id="panel-links" role="tabpanel" aria-labelledby="tab-links" aria-hidden="true"> <p><strong>Interne Links</strong>, beschreibende Anchor-Texte statt „hier klicken". Jeder Link ist eine thematische Empfehlung. Text-Links statt Bild-Links verwenden.</p> <p><strong>Tipp:</strong> Suche in deinem Content nach „hier" und „mehr dazu", ersetze jeden generischen Anchor durch das Keyword der Zielseite.</p> </div> </div> </section> <section class="faq-section reveal" role="region" aria-label="Häufige Fragen zur Onpage-Optimierung"> <p class="faq-label">FAQ</p> <p class="faq-title">Häufige Fragen zur Onpage-Optimierung</p> <div class="faq-item"> <button class="faq-q" aria-expanded="false" aria-controls="faq-a1">Was ist der wichtigste Onpage-Faktor?<span class="faq-chevron" aria-hidden="true">▼</span></button> <div class="faq-a" id="faq-a1" role="region"><div class="faq-a-inner">Das Title-Tag ist der wichtigste Onpage-Faktor. Es wird von allen Suchmaschinen stark gewichtet, erscheint prominent in den SERPs und beeinflusst die Klickrate direkt. Alle Keywords gehören in die ersten 50 Zeichen.</div></div> </div> <div class="faq-item"> <button class="faq-q" aria-expanded="false" aria-controls="faq-a2">Ist die Meta-Description ein Rankingfaktor?<span class="faq-chevron" aria-hidden="true">▼</span></button> <div class="faq-a" id="faq-a2" role="region"><div class="faq-a-inner">Nein, seit 2009 ist die Meta-Description kein direkter Rankingfaktor mehr. Sie beeinflusst aber die Klickrate in den SERPs und wirkt dadurch indirekt auf Rankings. Eine gute Description ist ein 160-Zeichen-Verkaufsgespräch.</div></div> </div> <div class="faq-item"> <button class="faq-q" aria-expanded="false" aria-controls="faq-a3">Wie viele H1-Überschriften darf eine Seite haben?<span class="faq-chevron" aria-hidden="true">▼</span></button> <div class="faq-a" id="faq-a3" role="region"><div class="faq-a-inner">Idealerweise genau eine H1 pro URL. Sie definiert das Hauptthema der Seite und sollte das wichtigste Keyword enthalten. Zwei H1-Tags verwässern das Signal, häufig verursacht durch CMS-Templates, die das Logo in eine H1 verpacken.</div></div> </div> <div class="faq-item"> <button class="faq-q" aria-expanded="false" aria-controls="faq-a4">Was sind die ersten 1.000 Zeichen Regel?<span class="faq-chevron" aria-hidden="true">▼</span></button> <div class="faq-a" id="faq-a4" role="region"><div class="faq-a-inner">Suchmaschinen und Nutzer verarbeiten die ersten 1.000 Zeichen einer Seite zuerst. Das Haupt-Keyword und die Kernaussage sollten in diesem Bereich stehen, nicht nach einer langen Unternehmensvorstellung oder allgemeinen Einleitung.</div></div> </div> <div class="faq-item"> <button class="faq-q" aria-expanded="false" aria-controls="faq-a5">Wie oft schreibt Google Title-Tags um?<span class="faq-chevron" aria-hidden="true">▼</span></button> <div class="faq-a" id="faq-a5" role="region"><div class="faq-a-inner">Google generiert seit 2021 verstärkt eigene Title-Tags mittels KI-Algorithmen. Gut formulierte, passende Titles werden seltener umgeschrieben. Das macht optimierte Titles zu einem Wettbewerbsvorteil gegenüber Seiten mit generischen oder überlangen Titeln.</div></div> </div> <div class="faq-item"> <button class="faq-q" aria-expanded="false" aria-controls="faq-a6">Warum sollte der Firmenname am Ende des Titles stehen?<span class="faq-chevron" aria-hidden="true">▼</span></button> <div class="faq-a" id="faq-a6" role="region"><div class="faq-a-inner">Die ersten 50 Zeichen des Titles sind die wertvollsten. Sie erscheinen in der SERP vollständig, werden stärker gewichtet und entscheiden über die Klickrate. Der Firmenname ist für Ranking und CTR weniger relevant als das Ziel-Keyword. Trenne ihn durch Pipe oder Dash am Ende: „Keyword-Thema, Firmenname“.</div></div> </div> <div class="faq-item"> <button class="faq-q" aria-expanded="false" aria-controls="faq-a7">Welche Onpage-Elemente haben den größten Einfluss auf die Klickrate?<span class="faq-chevron" aria-hidden="true">▼</span></button> <div class="faq-a" id="faq-a7" role="region"><div class="faq-a-inner">Title-Tag und Meta-Description sind die beiden sichtbaren Elemente in der SERP, die direkt über Klicks entscheiden. Ein gut geschriebener Title mit dem Ziel-Keyword in den ersten 50 Zeichen und eine aktionsorientierte Description von 150, 160 Zeichen können die Klickrate deutlich steigern, ohne dass sich Rankings ändern müssen.</div></div> </div> </section> <section class="sources reveal" aria-label="Quellen und weiterführende Literatur"> <h2>Quellen</h2> <ol> <li>Erlhofer, Sebastian: <em>Suchmaschinen-Optimierung</em>, 11. Auflage, Rheinwerk Verlag, 2024. Kapitel 14: Onpage-Optimierung, S. 649–680.</li> <li>Google Search Central: <a href="https://developers.google.com/search/docs/appearance/title-link" target="_blank" rel="noopener">Title Links in Google Search</a>, zuletzt aktualisiert 2024.</li> <li>Ahrefs Blog: <a href="https://ahrefs.com/blog/meta-description-study/" target="_blank" rel="noopener">How Often Does Google Rewrite Meta Descriptions?</a>, 2020.</li> <li>Nielsen, Jakob: <em>How Users Read on the Web</em>, Nielsen Norman Group, 1997 (aktualisiert 2020).</li> </ol> </section> </article> <a class="back-link back-link--end" href="/artikel">Zurück zur Übersicht</a> <!-- back-link-end-injected --> </main> <aside class="article-end-cta"> <span class="article-end-cta-label">// hat dir das geholfen?</span> <h3>Brauchst du Sparring für dein SEO?</h3> <p>Ich bin Max, SEO Strategist aus Bochum. Von Audit über Content-Strategie bis Local SEO. KMU im DACH-Raum, evidenzbasiert, ohne Hype-Versprechen.</p> <div class="article-end-cta-row"> <a class="primary" href="mailto:hello@while.chat?subject=Anfrage%20SEO">projekt anfragen →</a> <a href="https://wa.me/4915222623657" target="_blank" rel="noopener">WhatsApp</a> <a href="/blog">mehr Artikel</a> </div> </aside> <section class="related-articles reveal" aria-label="Weiterlesen"> <h3>Weiterlesen</h3> <div class="related-grid"> <a class="related-card" href="/posts/google-updates-algorithmus-verstehen"><span class="related-title">Google Updates verstehen: Core Updates, Spam Updates und was du tun kannst</span><span class="related-desc">Google Updates erklärt, Core Updates, Helpful Content, Spam Updates. Warum Rankings schwanken, wie du reagierst und was du langfristig tun ...</span></a> <a class="related-card" href="/posts/seo-vs-sea-organisch-bezahlt"><span class="related-title">SEO vs. SEA: Wann organisch, wann bezahlt, und wann beides?</span><span class="related-desc">SEO oder SEA, oder beides? Der ehrliche Vergleich für KMU: Kosten, Zeitrahmen, ROI, Vor- und Nachteile. Mit Entscheidungsmatrix für dein Bu...</span></a> <a class="related-card" href="/posts/interne-verlinkung-seo-strategie"><span class="related-title">Interne Verlinkung als SEO-Strategie: Linkjuice, Siloing und Crawl-Effizienz</span><span class="related-desc">Interne Verlinkung für SEO richtig nutzen, Silo-Struktur, Ankertexte, Linkjuice-Verteilung und Crawl-Budget. Die Strategie für bessere Rank...</span></a> </div> </section> <footer class="footer"> <div class="footer-brand">while.chat</div> <p>Verstehen. Anwenden. Wachsen. Erstellt in Bochum</p> <p class="footer-nap"><a href="https://www.google.com/maps/search/?api=1&query=Hauptstra%C3%9Fe+278+44892+Bochum" rel="noopener" aria-label="Adresse in Maps öffnen">Hauptstr. 278 · 44892 Bochum</a> · <a href="tel:+4915222623657" aria-label="Anrufen">+49 1522 2623657</a></p> <div class="footer-links"> <a href="/datenschutz">Datenschutz</a> <a href="/impressum">Impressum</a> </div> <div class="footer-social"> <a href="https://www.facebook.com/profile.php?id=61577505480981" target="_blank" rel="noopener noreferrer" aria-label="Facebook"><svg viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path d="M24 12.073c0-6.627-5.373-12-12-12s-12 5.373-12 12c0 5.99 4.388 10.954 10.125 11.854v-8.385H7.078v-3.47h3.047V9.43c0-3.007 1.792-4.669 4.533-4.669 1.312 0 2.686.235 2.686.235v2.953H15.83c-1.491 0-1.956.925-1.956 1.874v2.25h3.328l-.532 3.47h-2.796v8.385C19.612 23.027 24 18.062 24 12.073z"/></svg></a> </div> </footer> <script>window.va=window.va||function(){(window.vaq=window.vaq||[]).push(arguments)};</script> <script defer src="/_vercel/insights/script.js"></script> <script defer src="/_vercel/speed-insights/script.js"></script> <script> document.addEventListener('DOMContentLoaded', function() { // === Scroll Reveal === if (!window.matchMedia('(prefers-reduced-motion: reduce)').matches) { var obs = new IntersectionObserver(function(entries) { entries.forEach(function(e) { if (e.isIntersecting) e.target.classList.add('visible'); }); }, { threshold: 0.12 }); document.querySelectorAll('.reveal').forEach(function(el) { obs.observe(el); }); } else { document.querySelectorAll('.reveal').forEach(function(el) { el.classList.add('visible'); }); } // Immediate reveal for above-fold document.querySelectorAll('.reveal').forEach(function(el) { var r = el.getBoundingClientRect(); if (r.top < window.innerHeight && r.bottom > 0) el.classList.add('visible'); }); // === Progress Bar === var bar = document.getElementById('progress-bar'); if (bar) window.addEventListener('scroll', function() { var t = document.documentElement.scrollHeight - window.innerHeight; if (t > 0) bar.style.width = (window.scrollY / t * 100) + '%'; }, { passive: true }); // === Nav === var nav = document.getElementById('nav'); if (nav) window.addEventListener('scroll', function() { nav.classList.toggle('scrolled', window.scrollY > 40); }, { passive: true }); // === Burger === var burger = document.getElementById('burger'), overlay = document.getElementById('nav-overlay'); if (burger && overlay) { burger.addEventListener('click', function() { var o = burger.classList.toggle('open'); overlay.classList.toggle('open'); burger.setAttribute('aria-expanded', o); overlay.setAttribute('aria-hidden', !o); document.body.style.overflow = o ? 'hidden' : ''; }); overlay.querySelectorAll('a').forEach(function(a) { a.addEventListener('click', function() { burger.classList.remove('open'); overlay.classList.remove('open'); burger.setAttribute('aria-expanded', 'false'); overlay.setAttribute('aria-hidden', 'true'); document.body.style.overflow = ''; }); }); } // === FAQ Accordion with keyboard support === document.querySelectorAll('.faq-q').forEach(function(q) { function toggle() { var item = q.parentElement; var wasOpen = item.classList.contains('open'); document.querySelectorAll('.faq-item').forEach(function(i) { i.classList.remove('open'); i.querySelector('.faq-q').setAttribute('aria-expanded', 'false'); }); if (!wasOpen) { item.classList.add('open'); q.setAttribute('aria-expanded', 'true'); } } q.addEventListener('click', toggle); q.addEventListener('keydown', function(e) { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); toggle(); } }); }); // === Tab Widget with keyboard support === var tabBtns = document.querySelectorAll('.tab-btn'); var tabPanels = document.querySelectorAll('.tab-panel'); function activateTab(btn) { tabBtns.forEach(function(b) { b.setAttribute('aria-selected', 'false'); }); tabPanels.forEach(function(p) { p.setAttribute('aria-hidden', 'true'); }); btn.setAttribute('aria-selected', 'true'); var panel = document.getElementById(btn.getAttribute('aria-controls')); if (panel) panel.setAttribute('aria-hidden', 'false'); } tabBtns.forEach(function(btn) { btn.addEventListener('click', function() { activateTab(btn); }); btn.addEventListener('keydown', function(e) { var idx = Array.prototype.indexOf.call(tabBtns, btn); if (e.key === 'ArrowRight') { e.preventDefault(); tabBtns[(idx + 1) % tabBtns.length].focus(); activateTab(tabBtns[(idx + 1) % tabBtns.length]); } if (e.key === 'ArrowLeft') { e.preventDefault(); tabBtns[(idx - 1 + tabBtns.length) % tabBtns.length].focus(); activateTab(tabBtns[(idx - 1 + tabBtns.length) % tabBtns.length]); } }); }); // === Three.js Hero Scene === var canvas = document.getElementById('three-hero'); if (canvas && typeof THREE !== 'undefined' && !window.matchMedia('(prefers-reduced-motion: reduce)').matches && window.innerWidth >= 768) { function getThemeColors() { var dark = document.documentElement.getAttribute('data-theme') === 'dark' || (!document.documentElement.getAttribute('data-theme') && window.matchMedia('(prefers-color-scheme: dark)').matches); return { accent: dark ? 0x5B85D6 : 0x2D5FC2, crema: dark ? 0x5B85D6 : 0x5B85D6, bg: dark ? 0x25201A : 0xFAF7F0, line: dark ? 0x334155 : 0xD6CDBE }; } var isMobile = window.innerWidth < 768; var scene = new THREE.Scene(); var c = getThemeColors(); scene.background = new THREE.Color(c.bg); var cam = new THREE.PerspectiveCamera(60, canvas.clientWidth / canvas.clientHeight, 0.1, 100); cam.position.set(0, 0, 14); var renderer = new THREE.WebGLRenderer({ canvas: canvas, antialias: !isMobile, alpha: false }); renderer.setSize(canvas.clientWidth, canvas.clientHeight); renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); var pCount = 140; var pGeo = new THREE.BufferGeometry(); var pPos = new Float32Array(pCount * 3); var pVel = []; for (var i = 0; i < pCount; i++) { pPos[i*3] = (Math.random() - 0.5) * 20; pPos[i*3+1] = (Math.random() - 0.5) * 12; pPos[i*3+2] = (Math.random() - 0.5) * 10; pVel.push((Math.random()-0.5)*0.008, (Math.random()-0.5)*0.008, (Math.random()-0.5)*0.005); } pGeo.setAttribute('position', new THREE.BufferAttribute(pPos, 3)); var pMat = new THREE.PointsMaterial({ color: c.accent, size: 0.06, transparent: true, opacity: 0.6 }); var particles = new THREE.Points(pGeo, pMat); scene.add(particles); var lineMax = 2000; var lineGeo = new THREE.BufferGeometry(); var linePos = new Float32Array(lineMax * 6); lineGeo.setAttribute('position', new THREE.BufferAttribute(linePos, 3)); var lineMat = new THREE.LineBasicMaterial({ color: c.line, transparent: true, opacity: 0.12 }); var lines = new THREE.LineSegments(lineGeo, lineMat); scene.add(lines); var dodGeo = new THREE.DodecahedronGeometry(1.8, 0); var dodMat = new THREE.MeshBasicMaterial({ color: c.crema, wireframe: true, transparent: true, opacity: 0.1 }); var dod = new THREE.Mesh(dodGeo, dodMat); dod.position.set(-3, 1, -2); scene.add(dod); var icoGeo = new THREE.IcosahedronGeometry(1.4, 0); var icoMat = new THREE.MeshBasicMaterial({ color: c.accent, wireframe: true, transparent: true, opacity: 0.08 }); var ico = new THREE.Mesh(icoGeo, icoMat); ico.position.set(4, -1.5, -3); scene.add(ico); var boxes = []; for (var bi = 0; bi < 5; bi++) { var s = 0.3 + Math.random() * 0.5; var bGeo = new THREE.BoxGeometry(s, s, s); var bMat = new THREE.MeshBasicMaterial({ color: c.crema, wireframe: true, transparent: true, opacity: 0.06 }); var box = new THREE.Mesh(bGeo, bMat); box.position.set((Math.random()-0.5)*12, (Math.random()-0.5)*6, (Math.random()-0.5)*6); box.rotation.set(Math.random()*Math.PI, Math.random()*Math.PI, 0); scene.add(box); boxes.push(box); } var fc = 0; function animate() { requestAnimationFrame(animate); fc++; var pos = pGeo.attributes.position.array; for (var i = 0; i < pCount; i++) { pos[i*3] += pVel[i*3]; pos[i*3+1] += pVel[i*3+1]; pos[i*3+2] += pVel[i*3+2]; if (Math.abs(pos[i*3]) > 10) pVel[i*3] *= -1; if (Math.abs(pos[i*3+1]) > 6) pVel[i*3+1] *= -1; if (Math.abs(pos[i*3+2]) > 5) pVel[i*3+2] *= -1; } pGeo.attributes.position.needsUpdate = true; var li = 0, lp = lineGeo.attributes.position.array; for (var i = 0; i < pCount && li < lineMax; i++) { for (var j = i+1; j < pCount && li < lineMax; j++) { var dx = pos[i*3]-pos[j*3], dy = pos[i*3+1]-pos[j*3+1], dz = pos[i*3+2]-pos[j*3+2]; if (dx*dx+dy*dy+dz*dz < 6) { lp[li*6]=pos[i*3];lp[li*6+1]=pos[i*3+1];lp[li*6+2]=pos[i*3+2]; lp[li*6+3]=pos[j*3];lp[li*6+4]=pos[j*3+1];lp[li*6+5]=pos[j*3+2]; li++; } } } for (var k = li*6; k < lineMax*6; k++) lp[k] = 0; lineGeo.attributes.position.needsUpdate = true; lineGeo.setDrawRange(0, li * 2); dod.rotation.x += 0.002; dod.rotation.y += 0.003; ico.rotation.x -= 0.0015; ico.rotation.z += 0.002; boxes.forEach(function(b, i) { b.rotation.x += 0.001*(i+1); b.rotation.y += 0.0015*(i+1); }); cam.position.x = Math.sin(fc * 0.0015) * 1.5; cam.position.y = Math.cos(fc * 0.001) * 0.8; renderer.render(scene, cam); } animate(); var themeObs = new MutationObserver(function() { c = getThemeColors(); scene.background.set(c.bg); pMat.color.set(c.accent); lineMat.color.set(c.line); dodMat.color.set(c.crema); icoMat.color.set(c.accent); boxes.forEach(function(b) { b.material.color.set(c.crema); }); }); themeObs.observe(document.documentElement, { attributes: true, attributeFilter: ['data-theme'] }); window.addEventListener('resize', function() { cam.aspect = canvas.clientWidth / canvas.clientHeight; cam.updateProjectionMatrix(); renderer.setSize(canvas.clientWidth, canvas.clientHeight); }); } }); </script> <script defer src="/components/cookie-consent.js"></script> <script defer src="/components/bottom-nav.js"></script> </body> </html>