Cambiar estilo a los select

por

Hoy os traigo una forma de customizar vuestros selects de una manera rápida y sencilla. Una de las grandes deficiencias de HTML 4 es la imposibilidad de customizar los selects y su flecha, por tanto os traigo una forma sencilla de poder hacerlo.

La idea es simular el funcionamiento de un select, que realice las mismas funciones que el select original. Pero, como hacemos para que al enviar el formulario también se envíe los datos de ese select. Pues la solucion es muy sencilla, mantenemos el select orignal oculto y a la vez que cambiamos el valor del select customizado cambiamos el valor del select oculto. La idea es simple y su implementación igual de sencilla.

Para realizar todo esto utilizaremos un código HTML muy sencillo:

<html>

<head>
				
<link rel="stylesheet" type="text/css" href="moviles.css"
media="all" />
<script src="jquery.js" type="text/javascript"></script>
<script src="misfunciones.js" type="text/javascript" charset="utf-8"></script>	

</head>

<body>	

<form>
<select id="Inicio_idProvincia">
<option value="1">Aviles</option>
<option value="2">Oviedo</option>
<option value="3">Gijón</option>
</select>
</form>
							
</body>
</html>

Ahora añadimos el código javascript para sustituir el select original por el customizado y que al ir variando los valores del customizado se cambien automáticamente en el original para que luego se envíen a través del <form>.

jQuery(document).ready(
	
function() {

var ulprovincias="";

$("#Inicio_idProvincia option").each(function(){
	  		  	  
ulprovincias +="<li value="+$(this).attr('value')+">"+ $(this).text() + "</li>";
		 
});

$('#Inicio_idProvincia').css('display','none');

$('#Inicio_idProvincia').parent().prepend("<ul 
class='custom-options-provincias'>" + ulprovincias + "</ul>");

$('#Inicio_idProvincia').parent().prepend("<div 
class='custom-select-provincias'></div>");

$('.custom-select-provincias').click(function(){
$('.custom-options-recursos').slideUp('fast');

if ($('.custom-options-provincias').css('display')=='none'){
$('.custom-options-provincias').slideDown('fast');}
else{
$('.custom-options-provincias').slideUp('fast');
}
});
		
$('.custom-options-provincias li').click(function(){
$('.custom-select-provincias').html($(this).text());
$('#Inicio_idProvincia').attr('value',$(this).attr('value'));
$('.custom-options-provincias').slideUp('fast');
});		
});

Por último le damos los estilos con css, y añadimos la imagen del select customizado:

.custom-select-provincias{
background:url("./images/select.png") no-repeat scroll left top transparent;
border:0 none;
height:2.7em;
margin-left:0.5em;
padding-left:0.7em;
padding-top:0.6em;
width:14em;
cursor:pointer;
}

.custom-options-provincias{
background:none repeat scroll 0 0 #FFFFFF;
border-bottom:3px solid #DCDADA;
border-left:3px solid #DCDADA;
border-right:3px solid #DCDADA;
display:none;
margin-left:0.7em;
margin-top:-0.9em;
min-width:12.6em;
padding-left:0.5em;
padding-top:0.3em;
position:absolute;
}

.custom-options-provincias li{
margin-left:-0.5em;
padding-left:0.5em;
list-style:none;
}

.custom-options-provincias li:hover{
cursor:pointer;
background:#DCDADA;
width:100%;
color:#ffffff;
}

Para adaptarlo a vuestras necesidades es tan simple como cambiar los ids o class que necesiteis, y sustituir la imagen original de mi select custom porque la que vosotros querais.

Podeis descargaros el código desde aquí.

Espero que esto os haya solucionado una de los grandes problemas que se encuentran los desarrolladores web a la hora de enfrentarse al cambio de estilos de los selects.

Para cualquier duda o consulta podeis enviarme un mail.

COMENTARIOS

16-09-2013 18:45:26
Hola @yojito, para que coja de primeras el selected inicial debes modificar las primeras líneas del código con lo siguiente:
		var selected="";

      $("#Inicio_idProvincia option").each(function(){
	  		  	  
        ulprovincias +="<li value="+$(this).attr('value')+">"+ $(this).text() + "</li>";
		 if($(this).attr('selected')){
			selected=$(this).text();
		 }
      });
	  
	  	$('#Inicio_idProvincia').css('display','none');
				
		$('#Inicio_idProvincia').parent().prepend("<ul class='custom-options-provincias'>" + ulprovincias + "</ul>");
		$('#Inicio_idProvincia').parent().prepend("<div class='custom-select-provincias'>"+selected+"</div>");

Como ves es añadir unas pocas líneas adicionales cuando se contruye el UL. Espero que te sirva.
15-09-2013 23:35:03
Hola amigo el ejemplo esta bueno. Ahora me haria falta q saliera uno por defecto por ejemplo Aviles, y si le pongo a la option selected no me funciona. Le agradeceria si me pudiera ayudar en eso. Mi correo es yojito@uci.cu
12-08-2013 01:11:55
Sencillo y util, pero se ve mal en ie8
23-07-2013 23:09:04
@Juan Garcia este código está preparado paraun único select. Si queires que te funcione para más deberías de replicar el código JS y cambiar las clases css para que funcione bien.
23-07-2013 04:03:50
Y si fueran muchos select en una misma pagina? por que carajos no funciona
12-07-2013 00:20:24
Hola Edna, lo primero gracias por tu comentario :). Acabo de revisar el código y lo he probado en un IE 9 y lo veo correctamente. No se que te puede estar pasando. Quizas estés utilizando el navegador en una vista de compatibilidad que utilice el motor de otro. ¿Me puedes decir qué es lo que no te funciona exactamente?
11-07-2013 22:38:52
Hola está chevere tu ejemplo, pero con internet explorer 9 no funciona.
10-02-2013 13:38:16
A ti Julius por tu comentario :)
07-02-2013 19:42:11
Muchas Gracias por el aporte y por el tiempo en postearlo, saludos. :)
19-09-2012 17:21:54
explorer 9 no funciona el estilo
05-09-2012 13:56:40
¡Muchísimas gracias por tu aporte! Fácil, y sencillo =) No sabes cuántas horas había trabajado en vano para conseguir esto.
01-09-2012 02:51:08
He estado buscando una solucion para esto, encontraba plugin en jquery pero no me gustaba por que la personalizacion no es propio además el codigo se ensucia, voy a probar esto, esta genial...a ver como me va! Vengo de tres de intentarlo!
30-07-2012 18:52:21
Esta genial esta idea! Voy a probarlo... Gracias! ;)
19-11-2011 01:47:34
Tienes toda la razón. Había un fallo en el ejemplo, más concretamente al incluir la librería jquery en el index.html . No se había cerrado correctamente el tag. He actualizado el recurso para que podais bajaroslo sin problema. Cualquier problema o duda más me comentais.
18-11-2011 14:37:10
No funciona

DEJA TU COMENTARIO