2013-05-02 12 views
24

Ist es möglich, ein select Element basierend darauf, was option ist nur mit CSS ausgewählt? Ich kenne bestehende JavaScript solutions.Stil <select> Element basierend auf ausgewählten <option>

Ich habe versucht, das Optionselement selbst zu stylen, aber dies wird nur dem Optionselement in der Optionsliste den Stil geben, nicht dem ausgewählten Element.

select[name="qa_contact"] option[value="3"] { 
    background: orange; 
} 

http://jsfiddle.net/Aprillion/xSbhQ/

nicht möglich, wenn mit CSS 3 wird CSS 4 subject selector Hilfe in der Zukunft - oder wird dies eine verbotene Frucht zu CSS bleiben?

+0

Ich kann Ihren ausgewählten awnser bestreiten, bleiben Sie dran. Es ist sehr "hacky" – Justin

+0

@Justin - ich werde die akzeptierte Antwort ändern, wenn es eine bessere gibt. aber es ist im Moment gut genug für mich. – Aprillion

+0

Überprüfen Sie meine Anwsser und lassen Sie mich wissen, ob es tatsächlich Ihre Frage bewahrheitet lol. – Justin

Antwort

22

Leider, ja - das ist momentan mit CSS nicht möglich. Wie in den Antworten und Kommentaren zu this question erwähnt, gibt es derzeit keine Möglichkeit, das übergeordnete Element Element erhalten Styling basierend auf seiner Kinder.

Um das zu tun, was Sie wollen, würden Sie im Wesentlichen, welche der Kinder zu erkennen, haben (<option>) ausgewählt wird, und dann entsprechend den übergeordneten Stil.

Sie könnten jedoch erreichen dies mit einem sehr einfachen jQuery Aufruf wie folgt:

HTML

<select> 
    <option value="foo">Foo!</option> 
    <option value="bar">Bar!</option> 
</select> 

jQuery

var $select = $('select'); 
$select.each(function() { 
    $(this).addClass($(this).children(':selected').val()); 
}).on('change', function(ev) { 
    $(this).attr('class', '').addClass($(this).children(':selected').val()); 
}); 

CSS

select, option { background: #fff; } 
select.foo, option[value="foo"] { background: red; } 
select.bar, option[value="bar"] { background: green; } 

Hier ist ein working jsFiddle.

Zurück zur Frage nach der Zukunft der Selektoren. Ja - die "Betreff" -Selektoren sollen genau das tun, was Sie erwähnen. Wenn/wenn sie jemals tatsächlich lebt in modernen Browser gehen, können Sie den obigen Code anpassen können:

select { background: #fff; } 
!select > option[value="foo"]:checked { background: red; } 
!select > option[value="bar"]:checked { background: green; } 

Als Randnotiz wird noch darüber diskutiert, ob die ! vor oder nach dem Thema gehen sollte. Dies basiert auf dem Programmierstandard !something, der "nicht etwas" bedeutet. Als Ergebnis könnte das Subjekt-basierten CSS aufzuwickeln tatsächlich wie diese statt suchen:

select { background: #fff; } 
select! > option[value="foo"]:checked { background: red; } 
select! > option[value="bar"]:checked { background: green; } 
+0

for der jQuery Teil - er sollte die vorgewählte Option sowie onchange Ereignis überprüfen – Aprillion

+0

Ja, true - ich ging voran und aktualisierte es, um das hinzuzufügen. –

+0

Ich habe dieses 'select.foo, Option [Wert =" foo "] geändert {background: red;} 'in jsBitte die Hintergrundfarbe ändern, wenn value =" "mit dieser' select.foo, Option [value = ""] {background: red;} 'aber es funktioniert nicht. Wie kann ich ändern? Hintergrundfarbe, wenn der Wert leer ist – VansFannel

2

So, hier ist das, was ich darauf wobei gefunden. Das größte Problem ist, dass sich die Hintergrundfarbe nach der Auswahl eines Elements nicht ändert, da das select-Element nicht wirklich neu gezeichnet wird (scheint in IE mehr verfügbar zu sein - gehen Sie auf Abbildung). Auch wenn Sie eine andere Option auswählen, wird diese Option in der Liste nicht hervorgehoben, wenn Sie erneut auf das Auswahlelement klicken.

Um die Neuzeichnungsprobleme in IE zu beheben, musste die font-size um einen minimalen Betrag, + - 1, geändert werden.Die andere Sache, die nicht gut dokumentiert zu sein scheint, ist, dass die Pseudoklasse :checkedfunktioniert auch auf ausgewählte Steuerelemente.

Die fiddler, um das hinzugefügte css zu zeigen, das es möglich macht.

Ich habe nur kurz mit ihm auf Chrome und IE9, fyi gespielt.

BEARBEITEN: Offensichtlich müssen Sie den [Wert = "x"] auf den gewünschten Wert für die spezielle Option markieren.

+0

das ist nützlich - für IE und Chrome. Funktioniert weder in Firefox noch in Opera. – Aprillion

+1

@deathApril Ich habe nicht auf Opera geschaut, aber es funktioniert nicht in Firefox ist eigentlich ein Fehler in [Firefox] (https://bugzilla.mozilla.org/show_bug.cgi?id=79107). Wenn man sich das angewandte CSS ansieht, ist es tatsächlich da lol. In diesem Fall wäre Javascript erforderlich. – Justin

+0

danke für den Bug Link, wenn es seit 2001 nicht behoben wurde, glaube ich nicht daran, wird in Firefox in nächster Zeit funktionieren :( – Aprillion