Idealerweise geben Sie diese Klasse serverseitig aus, aber wenn das nicht möglich ist…
Nehmen wir an, Sie haben eine Navigation wie diese
<nav>
<ul>
<li><a href="/">Home</a></li>
<li><a href="/about/">About</a></li>
<li><a href="/clients/">Clients</a></li>
<li><a href="/contact/">Contact Us</a></li>
</ul>
</nav>
Und Sie befinden sich unter der URL
http://ihre-seite.de/about/team/
Und Sie möchten, dass der Link "About" eine Klasse "active" erhält, um visuell anzuzeigen, dass es sich um die aktive Navigation handelt.
$(function() {
$('nav a[href^="/' + location.pathname.split("/")[1] + '"]').addClass('active');
});
Im Wesentlichen werden dadurch Links in der Navigation abgeglichen, deren href-Attribut mit "/about" beginnt (oder was auch immer das sekundäre Verzeichnis ist).
Ich habe damit zu kämpfen, etwas Ähnliches für eine HTML-Website mit Vorlagen (serverseitige CSS-Aktualisierung nicht verfügbar) zum Laufen zu bringen. Die Struktur des Menüs ist etwas komplexer als in Ihrem Beispiel. Würde Ihr CSS-Trick für diese Struktur funktionieren? Wenn ja, bitte erleuchten Sie mich, denn ich stecke fest.
Pure JavaScript
cool!!!
Eine andere Möglichkeit
Dies ist die korrekte, alternative Version basierend auf der inneren Text-URL
`
function setNavigation() {
let current_location = location.pathname.split(‘/’)[1]
if (current_location == ”) {
current_location = ‘home’
}
}
setNavigation()
`
Danke für alles
Danke Chris! Einfach, klar und schick. High five!
Danke! Habe schon länger nach so etwas gesucht :)
Funktioniert einwandfrei, mit einer Ausnahme. Auf der Startseite wird die Klasse zu allen Links hinzugefügt. Sie beginnen alle mit /. Jede Hilfe wäre willkommen.
Einfache Lösung: Verwenden Sie das Skript nicht auf der Startseitendatei. Idiot. :)
Versuchen Sie, hrefˆ= durch href$= zu ersetzen
ˆ= Wert beginnt mit
$= Wert endet mit
Das habe ich getan, um die "Home"-Seite oder "Index" zu berücksichtigen.
if (location.pathname !== '/') {
$("a[href*='" + location.pathname + "']").addClass("current");
} else {
var home = document.getElementById("home").getElementsByTagName('a')[0];
home.className = 'current';
}
Hoffe, das hilft.
Ich habe kein "/" in meiner Navigation, also fügte der Code "active" zu allen meinen Links auf der Startseite hinzu. In meinem Fall habe ich Folgendes getan, damit mein "/" Pfad den Code nicht ausführt
In der Tat. Außerdem sind Seiten, die zum Beispiel /about und /aboutsome genannt werden, beide 'active', wenn man auf 'about' klickt. Gibt es dafür eine Lösung, wie eine Art exakte Übereinstimmung?
Hallo,
Ich konnte den obigen Selektor nicht zum Laufen bringen, habe aber stattdessen diese (PHP-spezifische Lösung) verwendet, um die aktuelle URL abzugleichen.
Ich hoffe, das hilft jemandem (noch nicht gründlich getestet, könnte also Einschränkungen/unerwartete Ergebnisse haben).
$(‘nav a[href=””]’).addClass(‘active’);
Mein Kommentar oben hat PHP gestrippt, daher werde ich ihn anpassen, und Sie müssen beim Verwenden gesunden Menschenverstand walten lassen.
$('nav a[href="<?php echo "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; ? >"]').addClass('active');Hallo,
Ich bin hier neu, können Sie bitte ein funktionierendes Beispiel zur Verfügung stellen?
Danke.
Hallo Leute – weiß jemand, wie das mit der absoluten URL (ganze URL) möglich ist?
Ich bin sicher, dass dies eine einfache Sache ist, aber ich weiß nicht wirklich, wo ich mit dem Code anfangen soll...
Vielen Dank,
Luke
Chris, können Sie eine kleine Demo dafür bereitstellen?
Ja, das ist nützlich…..
Zwei schnelle Fragen
Wenn meine URL dynamisch ist, wie soll ich den Ankerteil des JavaScript anpassen?
Gibt es eine reine CSS-Methode für den oben gezeigten aktiven Zustand? Ich frage nur so. Ich würde den Hover-Effekt für Nicht-JS-Betrachter verwenden, falls jemand das wissen möchte.
Meine Situation ist ähnlich, aber anders. Ich muss ein bestimmtes Nav-Element mit der aktiven Klasse ansprechen, wenn ein Nicht-Kind-Dokument aktiv ist. Irgendwelche Ideen, wie man das macht?
Ich habe einen etwas anderen Ansatz implementiert. Ich versuche, die beste Übereinstimmung für die URL und den aktuellen Standort zu finden. Ich habe ein jQuery-Plugin dafür erstellt: https://github.com/Vitaa/ActiveNavigation
funktioniert einwandfrei. Vielen Dank!
Hallo!
Ich habe eine Routine gefunden, um die aktive (aktuelle) Klasse auf meinem gemeinsam genutzten Menü zu setzen, aber ich muss sie so modifizieren, dass sie nur auf den übergeordneten Link gesetzt wird und nicht auf den "nächsten" Link. Sie funktioniert gut bei Menüpunkten ohne Untermenüs, aber wenn ein Untermenüpunkt angeklickt wird, gibt es nach dem Seitenaufruf keine Anzeige im Hauptmenü. (Der Code, den ich ändern muss, ist unten aufgeführt)
Können Sie zeigen, wie man das in PHP macht?
TKX
Vita
Kurzes Update, ich weiß nicht, ob es schon gesagt wurde, aber wenn Sie dies verwenden möchten und auch einen Home-Link als "/" beibehalten möchten
Machen Sie einfach etwas, um Ihre Home-li oder ein Tag zu unterscheiden, wie im else.
Vielen Dank für das Teilen! Hat mir sehr geholfen ;)
Großer Respekt! Hat mir sehr geholfen!
Ich habe diese Lösung mit reinem JS und habe ein Problem. Der Hash (#) in der URL ändert sich langsamer als die aktiven Klassen. Also klicke ich auf den ersten Link und nichts passiert, dann klicke ich auf den zweiten und der erste bekommt die aktive Klasse.
Hallo,
Ich habe eine umgekehrte Situation.
Was, wenn ich nicht möchte, dass das übergeordnete Menü hervorgehoben wird, wenn sein Kind (Untermenüpunkt) aktiv ist?
Z.B.
Über uns – Keine Farbe
– Link 1
– Link 2 (Aktuell aktiv): soll farbig sein
Irgendwelche Ideen?
Vielen Dank
Hey, probier mal diesen hier.
Hey, ich habe dieses Stück Code ausprobiert und es funktioniert großartig für mich…
Danke Aryan. Dein Code funktioniert sehr gut für mich.
Es hat funktioniert!! Danke für deinen Beitrag.
Toller Beitrag und Tipp. Ich hinterlasse hier meinen Beitrag. Für diejenigen, die Probleme mit der Übereinstimmung von URLs mit Parametern haben, hier ist die Lösung (der Code fügt die KLASSE zum übergeordneten LI-Tag hinzu und nicht zum A-Tag wie im ursprünglichen Beitrag)
$(function() {
var url = window.location.href; url = url.replace(/^.*\/\/[^\/]+/, ”);
$(‘nav a[href$=”‘ + url + ‘”]’).closest(‘li’).addClass(‘active’);
});
eine kürzere Syntax (in diesem Fall wende ich die aktive Klasse auf li an, nicht auf a)
let loc = location.pathname.split(“/”)[1];
document.querySelector(‘nav a[href^=”/’ + loc + ‘”]’).closest(‘li’).classList.add(‘active’);
Oder man könnte etwas Ähnliches tun
Hallo Chris,
Ich habe ein Menü, bei dem alle Links eindeutige Domainnamen sind. Ich verwende eine ähnliche Methode wie Ihre, die großartig funktioniert
Aber mein Problem ist, dass dies funktioniert, wenn die Adressleiste = http://www.mysite.com ist, aber nicht funktioniert, wenn die Adressleiste = mysite.com/cat/ ist, zum Beispiel.
Ich möchte, dass meine Methode nur den Domainnamen liest und alles danach ignoriert.
Irgendwelche Ideen?
jQuery(document).ready(function($){
// Aktuellen Pfad abrufen und Ziel-Link finden
var path = window.location.pathname.split(“/”).pop();
// Startseite mit leerem Pfad berücksichtigen
if ( path == ” ) {
path = ‘index.php’;
}
var target = $(‘nav a[href=”‘+path+'”]’);
// Aktive Klasse zum Ziel-Link hinzufügen
target.addClass(‘active’);
});