Anwenden einer anderen CSS-Klasse beim Klicken mit jQuery

Lesezeit: 9 Minuten

Abriels Benutzeravatar
Abriel

Ich richte gerade eine WordPress-Site ein und verwende diese Vorlage von ThemeForest, und hier ist die Live Vorschau woran ich gerade arbeite (was jetzt funktionieren sollte – bitte lassen Sie mich wissen, wenn es nicht funktioniert).

Ich habe das CSS so konfiguriert, dass der linke Rand beim Bewegen die hellgraue Farbe hat. Wenn dann auf den Link geklickt wurde, wäre der linke Rand dann die von mir gewählte blaue Farbe.

Wie unten gezeigt, liegt das Hauptproblem, das ich mit der Navigation habe, im CSS. Auf den Portfolio-Link (Portfolio-Abschnitt im Bild) wird weiterhin die ausgewählte Klasse angewendet, zusammen mit dem internen ungeordneten Listenelement. Ich möchte, dass es wie der Blog-Bereich im Bild aussieht, wo der Blog-Link nicht mehr auf das ausgewählte Klassenelement zutrifft.

Ich habe den Ersteller der Vorlage gefragt, warum dies geschieht; Seine Antwort war, dass unten ein weiterer Link vorhanden sein muss, der das Titelattribut „allportfolio“ enthält, damit es ordnungsgemäß funktioniert. Ich habe versucht, dieses Attribut zum Hauptportfolio-Link hinzuzufügen, habe dann aber die Liste vollständig geschlossen.

Portfolio-Abschnitt – hat zwei Listenelemente mit angewendeter ausgewählter CSS-Klasse und Blog-Abschnitt – nur ein Listenelement mit angewendeter ausgewählter CSS-Klasse

Wenn das Menü erstellt wird, erstellt der Browser die Portfolio-Auswahl auf folgende Weise in HTML:

<ul class="main-menu" id="menu-main-menu">
    <li class="parent selected" id="menu-item-1172">
       <p><a href="http://localhost/portfolio/" style="color: rgb(57, 57, 57);">Portfolio</a></p>
    <div>
       <ul class="sub-menu">
           <li class="menu-item" id="menu-item-1158"><p><a data-filter="website-design" data-category="true" href="#">Website Design</a></p></li>
           <li class="menu-item" id="menu-item-1157"><p><a data-filter="print" data-category="true" href="#">Print</a></p></li>
           <li class="menu-item selected" id="menu-item-1156"><p><a data-filter="motion" data-category="true" href="#">Motion</a></p></li>
           <li class="menu-item" id="menu-item-1155"><p><a data-filter="identity" data-category="true" href="#">Identity</a></p></li>
           <li class="menu-item" id="menu-item-1167"><p><a data-filter="logos" data-category="true" href="#">Logos</a></p></li>
      </ul>
   </div>
   </li>

Ich habe versucht, etwas Ähnliches wie diese Antwort zu geben, aber es hat nicht funktioniert, da es anscheinend nichts im Listenelement enthalten war. Der folgende jQuery-Code unten ist mein Versuch:

/*Portfolio links remove selected CSS setting*/
    $('ul#menu-main-menu ul.submenu li p a').click(
        function(){
            $('ul#menu-main-menu li').removeClass('parent selected');
            $(this).addClass('parent menu-item');
    });

Ich fühle mich festgefahren, weil ich nicht herausfinden kann, wie der HTML-Code wie unten aussehen soll (nehmen Sie die CSS-Klasse „ausgewählt“ heraus und fügen Sie die CSS-Klasse „Menüpunkt“ hinzu):

<ul class="main-menu" id="menu-main-menu">
    <li class="parent menu-item" id="menu-item-1172">
       <p><a href="http://localhost/portfolio/" style="color: rgb(57, 57, 57);">Portfolio</a></p>
    <div>
       <ul class="sub-menu">
           <li class="menu-item" id="menu-item-1158"><p><a data-filter="website-design" data-category="true" href="#">Website Design</a></p></li>
           <li class="menu-item" id="menu-item-1157"><p><a data-filter="print" data-category="true" href="#">Print</a></p></li>
           <li class="menu-item selected" id="menu-item-1156"><p><a data-filter="motion" data-category="true" href="#">Motion</a></p></li>
           <li class="menu-item" id="menu-item-1155"><p><a data-filter="identity" data-category="true" href="#">Identity</a></p></li>
           <li class="menu-item" id="menu-item-1167"><p><a data-filter="logos" data-category="true" href="#">Logos</a></p></li>
      </ul>
   </div>
   </li>

UPDATE: Die @limelights-Antwort schien zu funktionieren, aber ich fand einige jQuery, die die Link-Hover-Effekte auf der Website beeinflussten, und war mir nicht sicher, ob dies der Grund dafür war, dass die Antwort auf den Code in der scripts.js-Datei von nicht funktionierte das WordPress-Template

/* Links roll over effect */
    $('a').each(function(){
        if(!$(this).data('filter') && !$(this).parent().parent().parent().hasClass('pagination'))
            $(this).hoverFadeColor();
    })

Außerdem bin ich dem, was ich erreichen möchte, sehr nahe, indem ich diesen Code verwende, um die internen Links endlich offen zu halten:

/*Portfolio links remove selected CSS setting*/
    $('ul#menu-main-menu li div ul.sub-menu:first li.menu-item p a').click(
        function(){
            $('ul#menu-main-menu > li').removeClass('selected');
            $('ul#menu-main-menu > li').css({'color' : '#222'}).addClass('menu-item');
            $('ul#menu-main-menu li div:first').show();
        });

Aber was es immer noch tut (wie unten zu sehen) ist, dass der Text immer noch wie der ausgewählte Text ausgewählt ist.

Ausgewählter Text wird weiterhin auf den Link zur Hauptmenüliste angewendet, obwohl die Klasse entfernt wurde

Jede Hilfe wird sehr geschätzt!

  • Ich habe die Frage nicht vollständig verstanden, möchten Sie, dass das übergeordnete Element deaktiviert wird, wenn das untergeordnete Element ausgewählt ist?

    – Omi

    6. Dezember 2012 um 16:55 Uhr

  • @OmidAmraei Es tut mir leid, wenn ich mich nicht ganz klar ausgedrückt habe. Ich möchte, dass das übergeordnete Element nicht ausgewählt wird, wenn das untergeordnete Element ausgewählt ist.

    – Abriel

    6. Dezember 2012 um 17:23 Uhr

  • Was ich in der Live-Vorschau sehe, ist genau das, was Sie wollen. Ich glaube, Sie haben die Vorlage mit falschen Codes bearbeitet.

    – Omi

    6. Dezember 2012 um 19:43 Uhr

  • @OmidAmraei Ich verstehe, was du meinst, aber der einzige Unterschied zwischen dem, was ich versuche, und dem, was in der Live-Vorschau gezeigt wird, ist, dass ich das nicht wollte Alle Verknüpfung. Das macht, was ich will, funktioniert, aber ich wollte das nicht Alle Link, um in der Hauptansicht zu erscheinen Portfolio Verknüpfung.

    – Abriel

    6. Dezember 2012 um 20:32 Uhr

  • Hallo Abriel. Ich bin immer noch ein wenig verwirrt von genau Ihrem Problem. Hier ist das beabsichtigte Verhalten, wie ich es sehe … Ich sehe die übergeordnete Show nur mit einem grauen linken Tab, wenn ich mit der Maus über ein Element in seinem Abschnitt fahre. Wollen Sie überhaupt nicht, dass der Elternteil diesen Schwebezustand hat? Nehmen wir zum Beispiel an, ich bin im Portfolio und klicke auf “Website-Design”. Das Problem ist, was, dass der übergeordnete Container immer noch einen Hover-Status anzeigt? Ich sehe kein merkwürdiges Verhalten in der von Ihnen bereitgestellten Vorschau. Wo ist der “Alle”-Link, auf den Sie sich beziehen?

    – Platzregen046

    10. Dezember 2012 um 15:37 Uhr

Benutzeravatar von Downpour046
Platzregen046

Führt dies zu dem erwarteten Verhalten?

  $('a').each(function(e){
        if(!$(this).data('filter') && !$(this).parent().parent().parent().hasClass('pagination'))
        $(this).hoverFadeColor();
        e.preventDefault();
   })

Das Hinzufügen von e.preventDefault() sollte das Problem lösen.

AKTUALISIERT AM 10.12.2012:

Versuchen Sie, Ihre Klickfunktion wie folgt zu aktualisieren:

$('ul#menu-main-menu li div ul.sub-menu:first li.menu-item p a').on("click",function(){
    var linkClicked = $(this);
    $("#menu-main-menu li").each(function(){
        $(this).removeClass("selected").css({'color' : '#888'}).addClass('menu-item');
        $(this).first("div").show();
    });
    linkClicked.css({'color' : '#222'})
});

  • Diese Frage ist für die oben neu überarbeitete Frage nicht mehr relevant. Wenn mir jemand dabei helfen kann, würde ich es sicherlich zu schätzen wissen.

    – Abriel

    5. Dezember 2012 um 19:27 Uhr


  • Sprechen Sie davon, dies zusammen mit der @limelights-Antwort einzufügen?

    – Abriel

    6. Dezember 2012 um 18:45 Uhr

  • Es tut mir leid zu sagen, aber nein, das gibt mir nicht das erwartete Verhalten. 🙁 Mit dem Thema erlaubte es tatsächlich nicht, dass eines der Themen richtig funktionierte (z. B. die Seitenleiste und das Portfolio wurden beim Hover nicht erweitert).

    – Abriel

    6. Dezember 2012 um 18:51 Uhr

  • Siehe aktualisierten CODE, stellen Sie sicher, dass Sie das Ganze kopieren, einschließlich der .on(“click”-Modifikation. (Gesamtes Ereignis)

    – Platzregen046

    10. Dezember 2012 um 15:56 Uhr


  • Das sieht so aus, als ob jemand möchte, dass die Arbeit für ihn erledigt wird, und nicht versucht, anhand der gegebenen Antworten zu lernen.

    – Spvn

    11. Dezember 2012 um 1:42 Uhr

Ich habe kleine Änderungen in Ihrem CSS vorgenommen und einige Jquery-Funktionen wie folgt zu Ihrer HTML-Seite hinzugefügt:

CSS-Änderung:

Suchen Sie in Ihrer custom.css die Zeilennummer 67 und ersetzen Sie die Codierung wie folgt:

/*Turns link background white and removes border on the left at hover*/
.Light #menu ul.main-menu > li:hover > p > a {
   background:#FFF;
   border-left:6px solid #F0F0F0;
}

Diese oben ersetzen in

/*Turns link background white and removes border on the left at hover*/
.Light #menu ul.main-menu > li:hover > p > a {
   background:#FFF;
   /*border-left:6px solid #F0F0F0;*/
}

Hinzufügen der Jquery-Funktion an einigen Stellen Ihrer Design-Header- oder -Footer-Datei wie folgt,

<script type="text/javascript">
$(document).ready(function() {
$("#menu-main-menu li:first").addClass("selected");
$("#menu-main-menu li p a").css("border-left","none");
$("#menu-main-menu li p a").hover(function(){$(this).css("border-left","6px solid #F0F0F0");});
$("#menu-main-menu li").click(function() {
  $(this).addClass("selected");
});
});
</script>

Diese oben genannten Änderungen funktionieren für mich. Um es in Aktion zu sehen: http://jsbin.com/ehagal/1

Ich denke, das kann dir helfen, dein Problem zu lösen.

  • Das hat tatsächlich geholfen, das Problem zu lösen! 🙂 Jetzt finde ich einen Weg, das zu kombinieren, was ich geschrieben habe, und es in den Code einzufügen, den ich oben geschrieben habe.

    – Abriel

    12. Dezember 2012 um 5:33 Uhr


  • Nein danke @JohnPeter 🙂 Das hat enorm geholfen! Um dies nun in der scripts.js-Datei zu implementieren, los geht’s. 🙂

    – Abriel

    12. Dezember 2012 um 6:15 Uhr

Benutzeravatar von Henrik Andersson
Henrik Andersson

Wenn ich Sie richtig verstehe, sollte Ihnen das helfen, wenn Sie in der Lage sind, irgendeine Art von Skript einzufügen. 🙂

$('ul#menu-main-menu li div ul.sub-menu li.menu-item p a').click(function(event){
    $('ul#menu-main-menu > li').removeClass('selected');
    alert($('ul#menu-main-menu > li').attr('class'));
    $('ul#menu-main-menu li').addClass('menu-item');
    alert($('ul#menu-main-menu > li').attr('class'));
    event.preventDefault();
});

Ich hoffe, das ist es, was Sie suchen! 🙂

Sie können es ausprobieren hier auf TINker.io

Ich habe zwei Warnungen eingefügt, damit Sie sehen können, dass die Klasse tatsächlich entfernt und dann eine andere Klasse hinzugefügt wird. Sie müssen natürlich angeben, wie die neue Klasse im CSS aussieht.

  • Vielen Dank für die Lösung. Es scheint zu funktionieren, aber das Problem, das ich weiterhin mit dem Code habe, ist, dass jedes Mal, wenn ich auf das innere Listenelement klicke, es nicht geöffnet bleibt und daher die ausgewählte Klasse vom Hauptlink entfernt wird.

    – Abriel

    6. Dezember 2012 um 3:54 Uhr

  • Rampenlicht, versuchen Sie, e.preventDefault() zu Ihrer Lösung hinzuzufügen. Das könnte der Grund sein, warum er sieht, dass es aktualisiert wird

    – Platzregen046

    6. Dezember 2012 um 15:10 Uhr

  • Fügen Sie $(‘ul#menu-main-menu li div ul.sub-menu li.menu-item p a’) hinzu.click(function(e){ $(‘ul#menu-main-menu > li’). removeClass(‘ausgewählt’); alert($(‘ul#menu-main-menu > li’).attr(‘class’)); $(‘ul#menu-main-menu li’).addClass(‘menu -item’); alert($(‘ul#menu-main-menu > li’).attr(‘class’)); e.preventDefault(); });

    – Platzregen046

    6. Dezember 2012 um 15:14 Uhr


  • Fertig! Danke für die Eingabe! 😀

    – Henrik Andersson

    6. Dezember 2012 um 16:01 Uhr

  • Kein Problem @limelights, aber ich habe den Code ausprobiert, den Sie neu bearbeitet haben, und es scheint, dass er auch nicht funktioniert. 🙁 Es gibt mir immer noch den gleichen Effekt wie der alte Code. Entschuldigung für die Enttäuschung.

    – Abriel

    6. Dezember 2012 um 18:47 Uhr


Das Hinzufügen von jQuery sollte Ihr Problem lösen, wenn Sie eine Kopie dessen haben, was ich in der Live-Vorschau ohne eine nennenswerte Anpassung sehe.

$("#menu-main-menu li").click(function(){ 
    $("#menu-main-menu li").removeClass("selected"); 
});

1403810cookie-checkAnwenden einer anderen CSS-Klasse beim Klicken mit jQuery

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy