safari fix css

Por qué Safari no aplica tu CSS (y cómo solucionarlo con appearance: none)

Si trabajas en diseño web o desarrollo front-end, probablemente alguna vez te encontraste con este problema:

“En Chrome se ve perfecto, pero en Safari el <select> no toma el estilo.”

Esto sucede porque Safari utiliza controles de formulario nativos del sistema operativo (macOS o iOS). En otras palabras, ignora parte del CSS para mantener la estética de Apple.
Esto afecta especialmente a los campos como:

  • <select>

  • <input type="date">

  • <input type="search">

  • <input type="range">

  • y otros inputs con apariencia especial.


Qué hace la propiedad appearance

La propiedad CSS appearance permite controlar si un elemento usa el estilo del sistema o el del desarrollador.
Cuando Safari encuentra un <select>, lo renderiza con el diseño de macOS o iOS, sin importar tus reglas de border, background o padding.

Para recuperar el control del diseño, solo tenés que indicarle al navegador que no use la apariencia nativa:

-webkit-appearance: none; /* Safari y Chrome */
-moz-appearance: none; /* Firefox */
appearance: none; /* estándar CSS moderno */

Ejemplo práctico

Supongamos que tenés un formulario de contacto con el siguiente CSS:

.cf7-two-columns select {
background: #fff;
border: 1px solid #333;
padding: 15px;
border-radius: 0;
color: #000;
width: 100%;
font-size: 1rem;
}

En Chrome se ve perfecto, pero en Safari el select mantiene su estilo gris y su flecha clásica.
Para que Safari respete tu diseño, simplemente añadí:

.cf7-two-columns select {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
}

Y si querés reemplazar la flecha del select con una personalizada:

.cf7-two-columns select {
background-image: url("data:image/svg+xml;charset=US-ASCII,%3Csvg%20width%3D'10'%20height%3D'6'%20xmlns%3D'http%3A//www.w3.org/2000/svg'%3E%3Cpath%20fill%3D'%23333'%20d%3D'M0%200l5%206%205-6z'/%3E%3C/svg%3E");
background-repeat: no-repeat;
background-position: right 15px center;
background-size: 10px 6px;
}

Consejos extra para compatibilidad total

Para lograr un estilo de formulario coherente en todos los navegadores:

  1. Usá siempre las tres líneas:
    -webkit-appearance, -moz-appearance y appearance.

  2. Agregá un reset CSS global:

    input, select, textarea, button {
    -webkit-appearance: none;
    -moz-appearance: none;
    appearance: none;
    outline: none;
    }
  3. Probá siempre en Safari real o en iPhone/iPad, ya que el motor de renderizado es diferente a Chrome o Edge.

  4. Cuidá la accesibilidad: si eliminás el estilo nativo, asegurate de mantener buena visibilidad del foco (:focus).


Safari puede ser el navegador más exigente para los diseñadores, pero con la propiedad appearance: none podés garantizar que tus formularios se vean igual en todos los dispositivos.
De esta manera, mantenés la coherencia visual de tu marca y ofrecés una mejor experiencia de usuario.

Y esta solución es solo para select o es válido para otras personalizaciones?

 

Excelente pregunta 👌
La propiedad appearance: none no es exclusiva de los <select>, aunque ahí es donde más se nota el problema.
En realidad, sirve para cualquier elemento de formulario o interfaz al que el navegador aplique un estilo nativo (propio del sistema operativo).


💡 En resumen:

appearance: none le dice al navegador:

“No uses tu estilo predefinido, quiero aplicar completamente el mío.”


🧱 Elementos donde es útil (y comúnmente necesario)

1. <select>

  • Safari, iOS y macOS ignoran varios estilos (bordes, fondo, flecha).

  • Con appearance: none podés aplicar tu diseño y usar una flecha SVG o ícono personalizado.

2. <input type="date">

  • Safari y Chrome muestran un selector de calendario nativo.

  • Con appearance: none podés ocultar ese ícono y usar uno propio.

input[type="date"] {
-webkit-appearance: none;
appearance: none;
}

(Luego podrías agregar un ícono con background-image o un pseudo-elemento ::after.)

3. <input type="search">

  • Safari agrega automáticamente una “X” (botón de limpiar) y un icono de lupa.

  • Con -webkit-appearance: none; podés quitarlos.

input[type="search"] {
-webkit-appearance: none;
appearance: none;
}

4. <input type="range"> (sliders)

  • Muy útil si querés personalizar el thumb y el track del slider.

  • Sin esto, Safari y Chrome aplican sus propios estilos redondeados.

5. <button> y <input type="submit">

  • Safari y Firefox aplican un fondo gris azulado con borde 3D.

  • Con appearance: none lo convertís en un botón plano que podés estilizar con tus colores, sombras, y efectos hover.

button, input[type="submit"] {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
background: #000;
color: #fff;
border: none;
padding: 12px 20px;
border-radius: 4px;
}

⚠️ Dónde no conviene usarlo

  • En formularios donde deseás conservar la apariencia nativa (por ejemplo, apps móviles o sitios que imitan el sistema operativo).

  • Si eliminás la apariencia nativa, tenés que recrear los estados de enfoque (:focus) para mantener la accesibilidad.


🧩 Consejo práctico

Podés incluir un reset global para controlar todo desde cero:

input,
select,
textarea,
button {
-webkit-appearance: none;
-moz-appearance: none;
appearance: none;
border-radius: 0;
outline: none;
}

Y después aplicar tus estilos personalizados sin preocuparte por las diferencias entre navegadores.

Juan Carlos Mancha Ramos

Nacido en 1984, es el motor creativo de Disegno Web Bologna.
Diseña, crea y desarrolla sitios web y comercio electrónico de última generación.

Articulos relacionados
AMP en 2025: ¿Sigue siendo relevante para el SEO móvil?
El ecosistema web evoluciona constantemente, y con él, las estrategias para mejorar el...
Accelerated Mobile Pages AMP
Leer más
Leave a Comment

Your email address will not be published. Required fields are marked *

Add Comment *

Name *

Email *

Website

Este sitio está protegido por reCAPTCHA y se aplican la política de privacidad y los términos de servicio de Google.

¿Necesitas ayuda profesional ?