css - atributos - Estilo<select> elemento basado en<option> seleccionado
select html (2)
¿Es posible aplicar un estilo a un elemento de select
función de qué option
se selecciona solo con CSS? Soy consciente de las soluciones existentes de JavaScript .
Intenté aplicar estilo al elemento de opción en sí, pero esto le dará estilo solo al elemento de opción en la lista de opciones, no al elemento seleccionado.
select[name="qa_contact"] option[value="3"] {
background: orange;
}
http://jsfiddle.net/Aprillion/xSbhQ/
Si no es posible con CSS 3, ¿ el selector de temas de CSS 4 ayudará en el futuro o seguirá siendo una fruta prohibida para CSS?
Así que aquí es lo que encontré en que es posible . El mayor problema es que después de haber seleccionado un elemento, el color de fondo no cambia porque el elemento seleccionado no está realmente redibujado (parece más predecible en IE: imagínate). Por lo tanto, aunque seleccione una opción diferente, esa opción no se resaltará en la lista cuando vuelva a hacer clic en el elemento seleccionado.
Para corregir los problemas de redibujado en IE, era necesario cambiar el font-size
en una cantidad mínima, + -. 1. La otra cosa, que no parece estar bien documentada, es que la pseudo clase :checked
también funciona en los controles de selección.
El fiddler para mostrar el css agregado que lo hace posible.
Solo jugué brevemente con él en Chrome e IE9, fyi.
EDITAR: Obviamente, deberá establecer [valor = "x"] en el valor deseado para el resaltado de una opción específica.
Desafortunadamente, sí, esto es algo que actualmente no es posible solo con CSS. Como se mencionó en las respuestas y comentarios a esta pregunta , actualmente no hay manera de hacer que el elemento padre reciba un estilo basado en sus hijos .
Para hacer lo que estás buscando, básicamente deberías detectar cuál de los hijos ( <option>
) está seleccionado, y luego diseñar al padre como corresponde.
Sin embargo, podría lograr esto con una llamada jQuery muy simple, de la siguiente manera:
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; }
Aquí hay un jsFiddle que funciona .
Volver a la pregunta sobre el futuro de los selectores. Sí, los selectores de "Asunto" están destinados a hacer exactamente lo que usted menciona. Si / cuando alguna vez realmente se activan en los navegadores modernos, podría adaptar el código anterior a:
select { background: #fff; }
!select > option[value="foo"]:checked { background: red; }
!select > option[value="bar"]:checked { background: green; }
Como nota al margen, todavía hay debate sobre si el !
Debería ir antes o después del tema. Esto se basa en el estándar de programación de !something
significa "no algo". Como resultado, el CSS basado en el sujeto podría terminar pareciéndose a esto:
select { background: #fff; }
select! > option[value="foo"]:checked { background: red; }
select! > option[value="bar"]:checked { background: green; }