¿Hay una forma solo de CSS para diseñar un <select>
menú desplegable?
Necesito diseñar un <select>
formulario tanto como sea humanamente posible, sin ningún tipo de JavaScript. ¿Cuáles son las propiedades que puedo usar para hacerlo en CSS?
Este código debe ser compatible con todos los principales navegadores:
- Internet Explorer 6, 7 y 8
- Firefox
- Safari
Sé que puedo hacerlo con JavaScript: Ejemplo .
Y no estoy hablando de un estilo simple. Quiero saber qué es lo mejor que podemos hacer solo con CSS.
Encontré preguntas similares en Stack Overflow.
Y este en Doctype.com.
Respuestas:
Aquí hay tres soluciones:
Solución # 1 - apariencia: ninguna - con Internet Explorer 10 - 11 solución alternativa ( Demo )
-
Para ocultar la flecha predeterminada establecida
appearance: none
en el elemento de selección, luego agregue su propia flecha personalizada conbackground-image
Soporte de navegador:
appearance: none
tiene muy buena compatibilidad con el navegador ( caniuse ), excepto Internet Explorer 11 (y posterior) y Firefox 34 (y posterior).Podemos mejorar esta técnica y agregar soporte para Internet Explorer 10 e Internet Explorer 11 agregando
Si Internet Explorer 9 es una preocupación, no tenemos forma de eliminar la flecha predeterminada (lo que significaría que ahora tendríamos dos flechas), pero podríamos usar un selector de Internet Explorer 9 original.
Al menos para deshacer nuestra flecha personalizada, dejando intacta la flecha de selección predeterminada.
Todos juntos:
Mostrar fragmento de código
Esta solución es fácil y tiene un buen soporte para el navegador, generalmente debería ser suficiente.
Si es necesario el soporte del navegador para Internet Explorer 9 (y posterior) y Firefox 34 (y posterior), siga leyendo ...
Solución # 2 Truncar el elemento de selección para ocultar la flecha predeterminada ( demo )
-
(Leer más aquí)
Envuelva el
select
elemento en un div con un ancho fijo yoverflow:hidden
.Luego dele al
select
elemento un ancho de aproximadamente 20 píxeles mayor que el div .El resultado es que la flecha desplegable predeterminada del
select
elemento estará oculta (debido a que estáoverflow:hidden
en el contenedor), y puede colocar cualquier imagen de fondo que desee en el lado derecho del div.La ventaja de este enfoque es que es un navegador cruzado (Internet Explorer 8 y posterior, WebKit y Gecko ). Sin embargo, la desventaja de este enfoque es que el menú desplegable de opciones sobresale en el lado derecho (por los 20 píxeles que ocultamos ... porque los elementos de opción toman el ancho del elemento seleccionado).
[Sin embargo, debe tenerse en cuenta que si el elemento de selección personalizado es necesario solo para dispositivos móviles, entonces el problema anterior no se aplica, debido a la forma en que cada teléfono abre de forma nativa el elemento de selección. Entonces, para dispositivos móviles, esta puede ser la mejor solución.]
Mostrar fragmento de código
Si la flecha personalizada es necesaria en Firefox, antes de la Versión 35 , pero no necesita admitir versiones antiguas de Internet Explorer, siga leyendo ...
Solución # 3 - Use la
pointer-events
propiedad ( demo )-
(Leer más aquí)
La idea aquí es superponer un elemento sobre la flecha desplegable nativa (para crear uno personalizado) y luego no permitir eventos de puntero en él.
Ventaja: Funciona bien en WebKit y Gecko. También se ve bien (sin
option
elementos sobresalientes ).Desventaja: Internet Explorer (Internet Explorer 10 y versiones anteriores) no es compatible
pointer-events
, lo que significa que no puede hacer clic en la flecha personalizada. Además, otra desventaja (obvia) con este método es que no puede orientar su nueva imagen de flecha con un efecto de desplazamiento o cursor de mano, ¡porque acabamos de deshabilitar los eventos de puntero en ellos!Sin embargo, con este método puede usar Modernizer o comentarios condicionales para hacer que Internet Explorer vuelva al estándar integrado en la flecha.
NB: Siendo que Internet Explorer 10 ya no es compatible
conditional comments
: si desea utilizar este enfoque, probablemente debería utilizar Modernizr . Sin embargo, aún es posible excluir el CSS de puntero-eventos de Internet Explorer 10 con un hack CSS descrito aquí .Mostrar fragmento de código
fuente
Es posible, pero desafortunadamente principalmente en navegadores basados en WebKit en la medida en que nosotros, como desarrolladores, lo requerimos. Este es el ejemplo del estilo CSS recopilado del panel de opciones de Chrome a través del inspector de herramientas de desarrollador incorporado, mejorado para que coincida con las propiedades CSS actualmente compatibles en la mayoría de los navegadores modernos:
Cuando ejecuta este código en cualquier página dentro de un navegador basado en WebKit, debe cambiar la apariencia del cuadro de selección, eliminar la flecha estándar del sistema operativo y agregar una flecha PNG, poner algo de espacio antes y después de la etiqueta, casi todo lo que desee.
La parte más importante es la
appearance
propiedad, que cambia el comportamiento del elemento.Funciona perfectamente en casi todos los navegadores basados en WebKit, incluidos los móviles, aunque parece que Gecko no es
appearance
tan compatible como WebKit.fuente
text-indent: 0.01px; text-overflow: "";
, funcionará aún mejorEl elemento de selección y su función desplegable son difíciles de diseñar.
Los atributos de estilo para el elemento seleccionado de Chris Heilmann confirman lo que Ryan Dohery dijo en un comentario a la primera respuesta:
fuente
Tuve este problema exacto, excepto que no podía usar imágenes y no estaba limitado por el soporte del navegador. Esto debería ser "según las especificaciones" y con suerte comenzará a funcionar en todas partes eventualmente .
Utiliza capas de fondo rotadas en capas para «cortar» una flecha desplegable, ya que los pseudoelementos no funcionarían para el elemento seleccionado.
Editar: en esta versión actualizada estoy usando variables CSS y un pequeño sistema de temas.
fuente
-moz-appearance: none;
La mayor inconsistencia que he notado al diseñar los menús desplegables seleccionados es Safari y Google Chrome (Firefox es totalmente personalizable a través de CSS). Después de buscar a través de oscuras profundidades de Internet, me encontré con lo siguiente, que resuelve casi por completo mis dudas con WebKit:
Safari y solución de Google Chrome :
Sin embargo, esto elimina la flecha desplegable. Puede agregar una flecha desplegable usando una cercana
div
con un fondo, margen negativo o absolutamente posicionada sobre el menú desplegable de selección.* Más información y otras variables están disponibles en la propiedad CSS: -webkit-apariencia .
fuente
<select>
Las etiquetas se pueden diseñar a través de CSS como cualquier otro elemento HTML en una página HTML representada en un navegador. A continuación se muestra un ejemplo (demasiado simple) que posicionará un elemento seleccionado en la página y mostrará el texto de las opciones en azul.Archivo HTML de ejemplo (selectExample.html):
Ejemplo de archivo CSS (selectExample.css):
fuente
La publicación del blog Cómo usar el estilo desplegable del formulario CSS no JavaScript funciona para mí, pero falla en Opera :
fuente
Aquí hay una versión que funciona en todos los navegadores modernos. Se usa la clave
appearance:none
que elimina el formato predeterminado. Como todo el formato ha desaparecido, debe volver a agregar en la flecha que diferencia visualmente la selección de la entrada.Ejemplo de trabajo: https://jsfiddle.net/gs2q1c7p/
fuente
Llegué a tu caso usando Bootstrap . Esta es la solución más simple que funciona:
Nota: el material base64 está
fa-chevron-down
en SVG.fuente
En los navegadores modernos es relativamente sencillo diseñar el estilo
<select>
en CSS. Conappearance: none
la única parte difícil está reemplazando la flecha (si eso es lo que quiere). Aquí hay una solución que usa undata:
URI en línea con SVG de texto plano:El resto del estilo (bordes, relleno, colores, etc.) es bastante sencillo.
Esto funciona en todos los navegadores que acabo de probar (Firefox 50, Chrome 55, Edge 38 y Safari 10). Una nota sobre Firefox es que si desea utilizar el
#
carácter en el URI de datos (pfill: #000
. Ej. ) Debe escapar de él (fill: %23000
).fuente
height
y / owidth
en la<svg>
etiqueta, en lugar de la propiedad CSSbackground-size
.fuente
Seleccionar estilos CSS personalizados
Probado en Internet Explorer (10 y 11), Edge, Firefox y Chrome
fuente
background-position: right 15px center, right 10px center;
Use la
clip
propiedad para recortar los bordes y la flecha delselect
elemento, luego agregue sus propios estilos de reemplazo al contenedor:Use una segunda selección con opacidad cero para hacer clic en el botón:
Las coordenadas difieren entre Webkit y otros navegadores, pero una consulta @media puede cubrir eso.
Referencias
fuente
Un ejemplo muy bueno que usa
:after
y:before
para hacer el truco es en Styling Select Box con CSS3 | CSSDeckfuente
No se recomienda editar este elemento, pero si quieres probarlo es como cualquier otro elemento HTML.
Editar ejemplo:
fuente
Esto usa un color de fondo para los elementos seleccionados y eliminé la imagen.
fuente
Si. Puede diseñar cualquier elemento HTML con su nombre de etiqueta, como este:
Por supuesto, también puede usar una clase CSS para darle estilo, como cualquier otro elemento:
fuente
Aquí hay una solución basada en mis ideas favoritas de esta discusión. Esto permite diseñar un elemento <select> directamente sin ningún marcado adicional.
Funciona Internet Explorer 10 (y posterior) con un respaldo seguro para Internet Explorer 8/9. Una advertencia para estos navegadores es que la imagen de fondo debe estar posicionada y ser lo suficientemente pequeña como para esconderse detrás del control de expansión nativo.
HTML
SCSS
CodePen
http://codepen.io/ralgh/pen/gpgbGx
fuente
A partir de Internet Explorer 10, puede usar el
::-ms-expand
selector de pseudoelementos para diseñar y ocultar el elemento de flecha desplegable.El estilo restante debe ser similar a otros navegadores.
Aquí hay una bifurcación básica de jsfiddle de Danield que aplica soporte para IE10
fuente
Hay una manera fácil
Comprueba este violín y perdóname el exceso de estilo: https://jsfiddle.net/dkellner/7ac9us70/
El truco detrás: tan pronto como la etiqueta <select> obtenga una propiedad llamada "tamaño", se comportará como una lista de altura fija y, de repente, por alguna razón, le permite darle un estilo increíble. Ahora, estrictamente hablando, la lista fija es un efecto secundario, pero solo nos ayuda más porque la usamos para el "aspecto desplegable".
Un ejemplo mínimo:
(para simplificar, lo hice con jQuery, pero puedes hacer lo mismo sin él)
Notas al margen
Esta solución le ofrece más que solo una selección: el valor también se puede editar manualmente. Utilice la propiedad de solo lectura si prefiere la forma predeterminada de selección restringida.
Para maximizar las posibilidades de estilo, las etiquetas <optgroup> no están alrededor de sus hijos, se mueven antes que ellos. Es intencional, es visualmente más claro y están felices de trabajar así, no se preocupe.
Javascripts: sí, sé que el OP dijo "no Javascript" pero lo entendí como por favor no se moleste con los complementos , lo cual está bien. No necesitas ninguna biblioteca para esta. Ni siquiera jQuery, como dije, es solo por la claridad del ejemplo.
fuente
Definitivamente deberías hacerlo como en Styling select, optgroup y options with CSS . En muchos sentidos, el color de fondo y el color son exactamente lo que normalmente necesitaría para diseñar las opciones, no la selección completa.
fuente
También puede agregar un estilo de desplazamiento al menú desplegable.
fuente
El tercer método en la respuesta de Danield se puede mejorar para trabajar con efectos de desplazamiento y otros eventos del mouse. Solo asegúrese de que el elemento "botón" viene justo después del elemento de selección en el marcado. Luego apunte con el selector + CSS:
HTML:
CSS:
Sin embargo, esto mostrará el efecto de desplazamiento al pasar el cursor sobre cualquier lugar sobre el elemento de selección, no solo sobre el "botón".
Estoy usando este método en combinación con Angular (dado que mi proyecto es una aplicación Angular de todos modos), para cubrir todo el elemento de selección y dejar que Angular muestre el texto de la opción seleccionada en el elemento "botón". En este caso, tiene mucho sentido que el efecto de desplazamiento se aplique al pasar el cursor sobre cualquier lugar de la selección.
Sin embargo, no funciona sin JavaScript, por lo que si desea hacer esto, y su sitio tiene que funcionar sin JavaScript, debe asegurarse de que su script agregue los elementos y clases necesarios para la mejora. De esa manera, un navegador sin JavaScript simplemente obtendrá una selección normal, sin estilo, en lugar de una insignia con estilo que no se actualiza correctamente.
fuente
Una solución única para CSS y HTML
Parece compatible con Chrome, Firefox e Internet Explorer 11. Pero deje sus comentarios con respecto a otros navegadores web.
Como sugiere la respuesta de Danield, envuelvo mi selección en un div (incluso dos divs para compatibilidad con x-browser) para obtener el comportamiento esperado.
Ver http://jsfiddle.net/bjap2/
HTML:
Observe los dos envoltorios div.
También observe el div extra agregado para colocar el botón de flecha hacia abajo donde desee (posicionado absolutamente), aquí lo colocamos a la izquierda.
CSS
fuente