Hallo Mathias!
BTW: ':target' ist schei ... - da fehlt ein Attribut à la 'history="no"' für das 'A' Element.
Ein solches Attribut existiert aus Gründen nicht. target heißt ja gerade: Wenn die URL ein Fragment Identifier enthält der Browser das entsprechende Element im Viewport fokussiert.
Das ist eine "mögliche" Betrachtungsweise. Eine andere ist, dass man sich bei der Einführung der Target-Pseudoklasse einfach an dem bereits Vorhandenen orientiert hat. Leider wie so oft, ohne es vernünftig zu Ende zu denken ...!
Denn Links, die den Browser veranlassen sollen zu einem Seitenanker zu springen, und Links, die dazu gedacht sind andere CSS Eigenschaften auf Elemente anzuwenden, sind imho zwei völlig verschiedene Paar Schuhe. Und aktuell bietet HTML eben genau keine Möglichkeit, zwischen diesen beiden Arten zu differenzieren.
Das Verlinken auf ein Fragment erzeugt natürlich immer einen History-Eintrag. Das ist eine Grundlage des Webs. (Klar, mit JavaScript und replaceState kann man das ggf. fälschen, aber nicht ohne.)
Das ist gar nicht nötig, denn wer trotz aktiviertem JS auf :target setzt, macht etwas grundlegend falsch.
Und wie man das "Problem" ganz einfach lösen/ umgehen könnte, habe ich ja schon geschrieben. Bei :hover käme ja auch keiner auf die Idee, dass das einen History-Eintrag erzeugt und zu dem jeweilige Element gescrollt wird ...!
Natürlich ist :target ungeeignet für das Triggern von Animationen bei Elementen durch einen Klick, wenn obiges Verhalten unerwünscht ist. Insofern ist der Anwendungsbereich von :target ziemlich begrenzt.
Es ist aber bei deaktiviertem JS oftmals die einzige Möglichkeit (z.B. Menü einblenden auf Touchscreens).
Zusätzlich wird der Anwendungsbereich von :target noch durch das Fehlen eines Parent-Selektors in CSS begrenzt.
Gruß Gunther