Elementos <select> con estilo

facebook-svg gplus-svg twitter-svg

Para cambiar el aspecto de los elementos <select> tenemos que eliminar primero los estilos que vienen predefinidos "de fabrica".

select {
     background: transparent;
     border: none;
     font-size: 14px;
     height: 30px;
     padding: 5px;
     width: 250px;
  }

En Google Chrome, los <select> enfocados ( on focus ) tienen una "sombra" azulada. Para eliminarla utilizamos esta regla:

select:focus{ outline: none;}
/* elimina la "sombra" azulada que aparece en Google Chrome */

El botón  que controla la aparición y la desaparición de los <option> es imposible de cambiar. De hecho este botón tiene solo una función estética, ya que podemos desplegar las opciones haciendo clic en cualquier punto del <select>.  Así que podemos taparlo y construir otro en su lugar.

Para taparlo ponemos el <select> dentro de una .caja cuya anchura width es más pequeña que la anchura del <select>.

.caja {
     margin:20px auto;        
     border:1px solid #d9d9d9;
     height:30px;
     width: 230px;
     overflow: hidden;
     position:relative;
  }

Y después construimos el nuevo "botón" utilizando el pseudo-elemento ::after. En este ejemplo utilizamos content:"\025be"; que es este símbolo: ▾, pero podemos utilizar cualquier otro símbolo, o incluso imágenes: content: url(flecha.gif);.

Más símbolos ASCII y Unicode para utilizar en el HTML, javaScript y CSS

.caja::after{
     content:"\025be";
     display:table-cell;
     text-align:center;
     padding-top:7px;
     width:30px;
     height:30px;
     background-color:#d9d9d9;
     position:absolute;
     top:0;
     right:0px;
     pointer-events: none;
  }

La propiedad pointer-events – nueva en CSS3 – permite controlar como se comportan los elementos html respecto a los eventos del ratón.
En nuestro caso, el pseudo-elemento ::after, que está encima del <select>, interfiere en la funcionalidad de este y no nos deja desplegar las opciones. Para que esto no pase utilizamos pointer-events: none, para inhabilitar los eventos del ratón encima del pseudo-elemento.


.caja {
   margin:20px auto 40px auto;	
   border:1px solid #d9d9d9;
   height:30px;
   overflow: hidden;
   width: 230px;
   position:relative;
}
select {
   background: transparent;
   border: none;
   font-size: 14px;
   height: 30px;
   padding: 5px;
   width: 250px;
}
select:focus{ outline: none;}

.caja::after{
	content:"\025be";
	display:table-cell;
	padding-top:7px;
	text-align:center;
	width:30px;
	height:30px;
	background-color:#d9d9d9;
	position:absolute;
	top:0;
	right:0px;	
	pointer-events: none;
}