2009-05-11 12 views
7

Ich versuche, einen einfachen Mouseover-Effekt mit einer Kombination aus mouseover, mouseout, addClass und removeClass zu erstellen. Grundsätzlich, wenn der Benutzer über ein Element mausiert, möchte ich eine andere Grenze (1px gestrichelt grau) anwenden. Der Ausgangszustand ist "1px solid white". Ich habe eine Klasse namens "Highlight", die einfach "Grenze: 1px gestrichelt grau" enthält. Ich möchte diese Klasse onmouseover hinzufügen und auf onmouseout entfernen, aber ich kann nicht den gewünschten Effekt erzielen, wenn ich nicht wichtig in der Klasse "highlight" verwende.mouseover() mouseout() jQuery add/removeClass Problem

+0

Könnten Sie etwas Code zeigen? –

+1

BTW, Brian: Da Sie jQuery verwenden, möchten Sie vielleicht die Hover-Ereignis-Helper-Methode auschecken: http://docs.jquery.com/Events/hover – Shog9

Antwort

14

Es klingt, als ob Sie die Javascript-Funktion gut so wie es ist, aber es ist nur ein Problem mit der specificity of your CSS rules, weshalb !important macht es funktioniert.

Sie müssen nur Ihre hervorgehobenen CSS-Regeln spezifischer als die nicht hervorgehobenen Regeln machen.

#someItem ul li { /* Specificity = 102 */ 
    border-color: white; 
} 

.highlight { /* Specificity = 10 -- not specific enough! */ 
    border-color: grey;  
} 

#someItem ul li.highlight { /* Specificity = 112 -- this will work */ 
    border-color: grey;  
} 

Bearbeiten mit weiteren Erklärung:
Lassen Sie uns sagen, dass die relevanten Teile Ihrer HTML wie folgt aussehen:

<div id="someItem"> 
    <ul> 
     <li>Item 1</li> 
     <li>Item 2</li> 
     <li>Item 3</li> 
    </ul> 
</div> 

und Sie haben diese CSS:

#someItem ul li { 
    border: 1px solid white; 
} 
.highlight { 
    border-color: grey; 
} 

Derzeit sind alle Listenelemente in der ul in #someItem div wird einen weißen Rahmen haben, und nichts hat die Klasse highlight, also ist nichts grau.

Durch alles, was bedeutet, dass Sie (in Ihrem Fall ein Hover-Ereignis in jQuery) möchten, können Sie eine Klasse zu einem der Elemente hinzufügen:

$(this).addClass('highlight'); 

Die HTML wird nun wie folgt aussehen:

<div id="someItem"> 
    <ul> 
     <li>Item 1</li> 
     <li class="highlight">Item 2</li> 
     <li>Item 3</li> 
    </ul> 
</div> 

Bis jetzt funktioniert Ihr Javascript und HTML gut, aber Sie sehen keine graue Grenze! Das Problem ist dein CSS. Wenn der Browser versucht zu entscheiden, wie das Element formatiert werden soll, werden alle verschiedenen Selektoren angezeigt, die auf ein Element und die in diesen Selektoren definierten Stile ausgerichtet sind. Wenn es zwei verschiedene Selektoren gibt, die beide den gleichen Stil definieren (in unserem Fall ist die Umrandungsfarbe umstritten), muss sie entscheiden, welcher Stil angewendet werden soll und welcher ignoriert werden soll. Dies geschieht über die so genannte "Spezifität" - also wie spezifisch ein Selektor ist. Wie in der HTML Dog article beschrieben, geschieht dies, indem jedem Teil des Selektors ein Wert zugewiesen wird und derjenige mit der höchsten Punktzahl gewinnt. Die Punkte sind:

  • Elementselektoreinrichtung (zB: "ul", "Li", "Tabelle") = 1 Punkt
  • Klassenselektor (zB: ".highlight", ".active",“. Menü ") = 10 Punkte
  • id-Selektor (zB: "#someItem", "#mainContent") = 100 Punkte

Es gibt einige weitere Regeln, zum Beispiel: das Schlüsselwort !important und auch Inline-Stile, aber das ist meistens irrelevant dafür, äh ... "Lektion". Die einzige andere Sache, die Sie wissen sollten, ist, dass, wenn zwei Selektoren die gleiche Spezifität haben, die in der Datei später definierte Datei gewinnt.

zurück zu Ihrem Problem gehen, da die CSS wir vorher hatten, können wir, warum es immer noch nicht bekam einen grauen Rand sehen:

 
#someItem ul li = id + element + element = 100 + 1 + 1 = 102 points 
.highlight = class = 10 points 

Wie bereits erwähnt, ist die Lösung einen spezifischeren Selektor zu erstellen:

 
#someItem ul li.highlight 
    = id + element + element + class 
    = 100 + 1 + 1 + 10 
    = 112 points 

und Ihre Frage in den Kommentaren zu beantworten, brauchen Sie nicht für diese arbeiten alle Ihre Javascript oder HTML zu ändern.Wenn Sie, dass Wähler brechen, was es sagen will, ist:

Suchen Sie das Element mit der ID „someItem“, im Inneren, die für ein ul-Element suchen, und dann Element eine li, die die Klasse „Highlight“ auf sich hat .

... und jetzt die einfache .addClass() Anruf gegeben, dass Sie früher gemacht, die li erfüllt diese Bedingungen, so sollte die Grenze grau.

+0

@nickf: Ich denke, Sie sind hier auf etwas. Wie kann ich dann die addClass-Methode verwenden? Ich habe meine Spezifität geändert, aber wie kann ich nun die Klasse in jQuery in meinem Kontext referenzieren? –

+0

Ich denke, Ihre jQuery ist in Ordnung, nur mit .addClass ('highlight') und .removeClass ('highlight') sollte alles sein, was Sie tun müssen, wenn Ihr CSS richtig aufgebaut ist. – nickf

+0

Einverstanden. Die spezifischste CSS-Regel hat Vorrang. Wenn Sie die Basis mit "#ItemList ul li" festlegen, setzen Sie den Hover-Stil mit "#ItemList ul li.highlight", um eine höhere Spezifität zu gewährleisten. – Cheekysoft

1

Ich vermute, Sie einen Inline-Stil auf dem Element für die Anfangs-Stil verwenden:

<style type="text/css"> 
    .hover { border: 1px dashed gray; } /* will never apply */ 
</style> 

... 

<!-- this style has priority over class styles! --> 
<div style="border: 1px solid white"> 
... 
</div> 

Dies wird die Stile außer Kraft setzen eine Klasse angewendet mit ... Also statt Inline-Stile zu verwenden, einfach Verwenden Sie eine andere Anfangsklasse, um die ursprünglichen Stile anzuwenden:

+0

Guter Punkt. Um nur für den Fragesteller zu klären, wendet die Methode css() in jquery Inline-Stile an. –

+0

Ich verwende keine Inline-Stile. Der Originalstil wird über ein Stylesheet angewendet, wobei nichts über das Tag oder die Methode css() angewendet wird, aber das Hinzufügen einer anderen Klasse über addClass() wird eine im Originalstil definierte Stilregel NICHT außer Kraft setzen, wenn ich nicht! –

+0

Stellen Sie dann sicher, dass die Regel für den ursprünglichen Stil entweder weniger spezifisch ist oder vor dem Hervorhebungsstil im Stylesheet steht. – Shog9

0

Haben Sie einen reinen CSS-Ansatz in Betracht gezogen?

Zum Beispiel:

someClass { 
    border: 1px solid white; 
} 

someClass:hover { 
    border: 1px dashed gray; 
} 

Die hover Pseudo-Klasse geben Sie das Verhalten, das Sie wollen: wenn der Benutzer über das Element moused ist, wird es den unteren Stil verwenden, sonst wird es den ersten Stil verwenden .

Hinweis: Wenn jemand kommentiert, funktioniert dies nicht für nicht a Elemente in IE. Es funktioniert jedoch für mich in Chrome, Firefox, Safari und Opera.

Es funktioniert auch für jedes Element in IE8 und IE7-Standards-Modus. Ich habe jedoch IE6 nicht mit zu testen.

+0

Das wird in IE6 nicht funktionieren, glaube ich. Nur ein Element kann darin schweben. –

+0

@ Paolo scheint in jedem Browser neben IE für jeden Elementtyp zu funktionieren. –

+0

Das habe ich gesagt ...? D: –

0

Dies ist ein Beispiel für ein Schweben ich verwendet habe:

$(".myclass").hover(jbhovershow,jbhoverhide); 


jbhovershow = function() { 
      $(this).addClass("jimtest"); 
      }; 

jbhoverhide = function() { 
      $(this).removeClass("jimtest"); 
      } 

Sie nicht wirklich etwas das einfach bis in einzelne Funktionen zu brechen.

Ich vermute, dass Ihr Problem möglicherweise mit einem Konflikt in der CSS - versuchen Sie nur Ihre Highlight-Klasse durch hartes Codieren, oder auf einen Klick und sehen, ob es wirklich funktioniert.

Hoffnung, die

Jim

0

CSS hilft:

div.target { 
    border: 1px solid #000000; 
} 

div.target-hover { 
    border-color: #ff0000; 
} 

JS:

$("div.target").hover(
    function() { 
     $(this).addClass("target-hover"); 
    }, 
    function() { 
     $(this).removeClass("target-hover"); 
    } 
); 

ich es auf diese Weise in der Regel tun. (Erlaubt mehr Optionen)

+0

Dies ist genau das, was ich tue außer div.target-Hover habe ich "Grenze: 1px gestrichelt grau". Der Rahmen wird das Original nicht überschreiben, es sei denn, ich füge aus irgendeinem Grund wichtig hinzu! –

+0

das ist seltsam, wie fügst du dem Element die erste Klasse hinzu? –

+0

@Chad Es kommt von einer Regel namens "#ItemList ul li", die ich gestylt habe, um "Grenze: 1px solid weiß" zu haben. Ich habe eine Klasse namens "Highlight", die einfach "Grenze: 1px gestrichelt grau" hat, die ich umschalten möchte. –

6

Ab Jquery 1.3.3 können Sie das etwas einfacher machen. Es wird eine enhanced version of .toggleClass() zur Verfügung stehen, die sehr mächtig sein wird.

Wenn Sie dies nicht dann aus 1.3.3 in eine Funktion benötigen ausbrechen können Sie einfach tun:

$(".myclass").hover(function(){ $(this).toggleClass('highlight'); }); 

Wenn Sie enthalten sind, die zu wichtigen dann Highlight Die Klasse muss möglicherweise spezifischer sein (siehe CSS Specificity).

0

Oder Sie können es nur mit einfacher CSS unter Verwendung:

#namehere { border: 1px solid #fff; } 
#namehere:hover { border: 1px dashed #aaa } 
+1

Ich bin mir nicht sicher, ob dies eine Browser-übergreifende Lösung ist, aber ich habe nie gesagt, dass es so sein muss. –

Verwandte Themen