Wie kann ein bestimmter Klassenname in der CSS-Auswahl ausgeschlossen werden?

137

Ich versuche, Hintergrundfarbe anzuwenden, wenn eine Benutzermaus mit der Maus über das Element fährt, dessen Klassenname lautet "reMode_hover".

Aber ich möchte die Farbe nicht ändern, wenn das Element auch hat"reMode_selected"

Hinweis: Ich kann nur CSS und kein Javascript verwenden, da ich in einer begrenzten Umgebung arbeite.

Zur Verdeutlichung ist es mein Ziel, das erste Element beim Schweben zu färben, aber nicht das zweite Element.

HTML

<a href="" title="Design" class="reMode_design  reMode_hover">
    <span>Design</span>
</a>

<a href="" title="Design" 
 class="reMode_design  reMode_hover reMode_selected">
    <span>Design</span>
</a>

Ich habe unten versucht, in der Hoffnung, dass die erste Definition funktionieren würde, aber das ist nicht der Fall. Was mache ich falsch?

CSS

/* do not apply background-color so leave this empty */
.reMode_selected .reMode_hover:hover 
{
}

.reMode_hover:hover 
{
   background-color: #f0ac00;
}
Miau
quelle

Antworten:

235

Eine Möglichkeit besteht darin, den Selektor für mehrere Klassen zu verwenden (kein Leerzeichen, da dies der Nachkommen-Selektor ist):

.reMode_hover:not(.reMode_selected):hover 
{
   background-color: #f0ac00;
}
<a href="" title="Design" class="reMode_design  reMode_hover">
    <span>Design</span>
</a>

<a href="" title="Design" 
 class="reMode_design  reMode_hover reMode_selected">
    <span>Design</span>
</a>

Explosionspillen
quelle
3
sollte es nicht sein: .reMode_hover: not ('. reMode_selected'): hover Nach meiner Erfahrung sind diese Anführungszeichen notwendig.
Makan Tayebi
1
@MakanTayebi Sie sprechen einen hervorragenden Punkt in Bezug auf Anführungszeichen um den Selektor an. TL; DR: Es ist in der Tat am besten, sie zu verwenden. Ausführliche Erklärung unter stackoverflow.com/a/5578880/1772379 .
Ben Johnson
Ist das noch so? Haben Sie versucht diese nicht in anderen Browsern, aber in der aktuellen Version von Firefox , dass ich arbeite in der :notAuswahl , sodass nur funktioniert , wenn ich entfernt die Anführungszeichen.
Alex Rummel
30

In modernen Browsern können Sie Folgendes tun:

.reMode_hover:not(.reMode_selected):hover{}

Consult http://caniuse.com/css-sel3 für Kompatibilitätsinformationen.

imsky
quelle
12

Methode 1

Das Problem mit dem Code ist , dass Sie das sind die Auswahl , .remode_hoverdie eine ist Nachkomme von .remode_selected. Der erste Teil, damit Ihr Code richtig funktioniert, besteht darin, diesen Speicherplatz zu entfernen

.reMode_selected.reMode_hover:hover

Damit der Stil nicht funktioniert, müssen Sie den von der :hover. Mit anderen Worten, Sie müssen der background-colorEigenschaft entgegenwirken. Der endgültige Code wird also sein

.reMode_selected.reMode_hover:hover {
  background-color:inherit;
}
.reMode_hover:hover {
  background-color: #f0ac00;
}

Geige

Methode 2

Eine alternative Methode wäre die Verwendung :not(), wie von anderen angegeben. Dies gibt jedes Element zurück, dessen Klasse oder Eigenschaft nicht in Klammern angegeben ist. In diesem Fall würden Sie dort eingeben .remode_selected. Dies zielt auf alle Elemente ab, die keine Klasse von haben.remode_selected

Geige

Ich würde diese Methode jedoch nicht empfehlen, da sie in CSS3 eingeführt wurde, sodass die Browserunterstützung nicht ideal ist.

Methode 3

Eine dritte Methode wäre die Verwendung von jQuery. Sie können auf den .not()Selektor abzielen , der der Verwendung :not()in CSS ähnelt , jedoch eine viel bessere Browserunterstützung bietet

Geige

Cody Guldner
quelle
4
Sie sollten Ihre "Methode 3" entfernen, in der jQuery erwähnt wird, da das OP für eine Lösung ausdrücklich "kein Javascript" sagte.
ScottS