Problemas comunes de CSS para proyectos front-end

Publicado: 2022-03-10
Resumen rápido ↬ La representación y la interacción se han vuelto mucho más consistentes en todos los navegadores en los últimos años. Sin embargo, todavía no es perfectamente uniforme, y muchos pequeños problemas pueden hacerte tropezar. Agregue a estos problemas las variables de diferentes tamaños de pantalla, preferencias de idioma y simple error humano, y encontramos muchas cosas pequeñas que hacen tropezar a un desarrollador.

Al implementar una interfaz de usuario en un navegador, es bueno minimizar esas diferencias y problemas siempre que pueda, para que la interfaz de usuario sea predecible. Hacer un seguimiento de todas esas diferencias es difícil, por lo que he elaborado una lista de problemas comunes, con sus soluciones, como una guía de referencia útil para cuando esté trabajando en un nuevo proyecto.

Vamos a empezar.

1. Restablecer los fondos de button y elementos de input

Al agregar un botón, restablezca su fondo o, de lo contrario, se verá diferente en todos los navegadores. En el siguiente ejemplo, se muestra el mismo botón en Chrome y en Safari. Este último agrega un fondo gris predeterminado.

(Vista previa grande)

Restablecer el fondo resolverá este problema:

 button { appearance: none; background: transparent; /* Other styles */ } 

Vea el botón del lápiz y las entradas de Ahmad Shadeed (@shadeed) en CodePen.

Vea el botón del lápiz y las entradas de Ahmad Shadeed (@shadeed) en CodePen.
¡Más después del salto! Continúe leyendo a continuación ↓

2. Desbordamiento: scroll frente a auto

Para limitar la altura de un elemento y permitir que el usuario se desplace dentro de él, agregue overflow: scroll-y . Esto se verá bien en Chrome en macOS. Sin embargo, en Chrome Windows, la barra de desplazamiento siempre está ahí (incluso si el contenido es breve). Esto se debe a que scroll-y mostrará una barra de desplazamiento independientemente del contenido, mientras que overflow: auto mostrará una barra de desplazamiento solo cuando sea necesario.

Izquierda: Chrome en macOS. Derecha: Chrome en Windows. (Vista previa grande)
 .element { height: 300px; overflow-y: auto; } 

Vea Pen overflow-y de Ahmad Shadeed (@shadeed) en CodePen.

Vea Pen overflow-y de Ahmad Shadeed (@shadeed) en CodePen.

3. Agregue flex-wrap

Haz que un elemento se comporte como un contenedor flexible simplemente agregando display: flex . Sin embargo, cuando el tamaño de la pantalla se reduce, el navegador mostrará una barra de desplazamiento horizontal en caso de que no se agregue flex-wrap .

 <div class="wrapper"> <div class="item"></div> <div class="item"></div> <div class="item"></div> <div class="item"></div> <div class="item"></div> <div class="item"></div> </div>
 .wrapper { display: flex; } .item { flex: 0 0 120px; height: 100px; }

El ejemplo anterior funcionará muy bien en pantallas grandes. En el móvil, el navegador mostrará una barra de desplazamiento horizontal.

Izquierda: se muestra una barra de desplazamiento horizontal y los elementos no están ajustados. Derecha: Los artículos se envuelven en dos filas. (Vista previa grande)

La solución es bastante fácil. El envoltorio debe saber que cuando no hay espacio disponible, debe envolver los artículos.

 .wrapper { display: flex; flex-wrap: wrap; } 

Vea la envoltura flexible Pen de Ahmad Shadeed (@shadeed) en CodePen.

Vea la envoltura flexible Pen de Ahmad Shadeed (@shadeed) en CodePen.

4. No use justify-content: space-between cuando el número de elementos flexibles es dinámico

Cuando justify-content: space-between se aplica a un contenedor flexible, distribuirá los elementos y dejará la misma cantidad de espacio entre ellos. Nuestro ejemplo tiene ocho elementos de tarjeta y se ven bien. ¿Qué pasaría si, por alguna razón, el número de artículos fuera siete? La segunda fila de elementos se vería diferente a la primera.

El envoltorio con ocho artículos. (Vista previa grande)
El envoltorio con siete artículos. (Vista previa grande)

Vea el contenido justificado de Pen por Ahmad Shadeed (@shadeed) en CodePen.

Vea el contenido justificado de Pen por Ahmad Shadeed (@shadeed) en CodePen.

En este caso, usar CSS grid sería más adecuado.

5. Palabras largas y enlaces

Cuando se visualiza un artículo en la pantalla de un dispositivo móvil, una palabra larga o un enlace en línea puede hacer que aparezca una barra de desplazamiento horizontal. El uso word-break CSS evitará que eso suceda.

Vista previa grande
 .article-content p { word-break: break-all; } 
(Vista previa grande)

Echa un vistazo a CSS-Tricks para conocer los detalles.

6. Gradientes transparentes

Al agregar un degradado con un punto inicial y final transparente, se verá negruzco en Safari. Eso es porque Safari no reconoce la palabra clave transparent . Sustituyéndolo por rgba(0, 0, 0, 0) , funcionará como se esperaba. Tenga en cuenta la siguiente captura de pantalla:

Arriba: Chrome 70. Abajo: Safari 12. (Vista previa grande)
 .section-hero { background: linear-gradient(transparent, #d7e0ef), #527ee0; /*Other styles*/ }

En cambio, esto debería ser:

 .section-hero { background: linear-gradient(rgba(0, 0, 0,0), #d7e0ef), #527ee0; /*Other styles*/ }

7. El concepto erróneo sobre la diferencia entre auto-fit y auto-fill en CSS Grid

En la cuadrícula CSS, la función de repeat puede crear un diseño de columna receptivo sin requerir el uso de consultas de medios. Para lograrlo, use auto-fill o auto-fit .

 .wrapper { grid-template-columns: repeat(auto-fill, minmax(100px, 1fr)); } 
(Vista previa grande)

En resumen, auto-fill organizará las columnas sin expandir su ancho, mientras que auto-fit contraerá a un ancho cero, pero solo si tiene columnas vacías. Sara Soueidan ha escrito un excelente artículo sobre el tema.

8. Fijación de elementos en la parte superior de la pantalla cuando la ventana gráfica no es lo suficientemente alta

Si fija un elemento en la parte superior de la pantalla, ¿qué sucede si la ventana gráfica no es lo suficientemente alta? Simple: Ocupará espacio en pantalla, por lo que el área vertical disponible para que el usuario navegue por el sitio web será pequeña e incómoda, lo que restará valor a la experiencia.

 @media (min-height: 500px) { .site-header { position: sticky; top: 0; /*other styles*/ } }

En el fragmento anterior, le indicamos al navegador que fije el encabezado en la parte superior solo si la altura de la ventana gráfica es igual o superior a 500 píxeles.

También importante: cuando usa position: sticky , no funcionará a menos que especifique la propiedad top .

Vista previa grande

Consulte las consultas de medios de Pen Vertical: encabezado fijo por Ahmad Shadeed (@shadeed) en CodePen.

Consulte las consultas de medios de Pen Vertical: encabezado fijo por Ahmad Shadeed (@shadeed) en CodePen.

9. Configuración max-width para imágenes

Al agregar una imagen, defina max-width: 100% , para que la imagen cambie de tamaño cuando la pantalla sea pequeña. De lo contrario, el navegador mostrará una barra de desplazamiento horizontal.

 img { max-width: 100%; }

10. Uso de CSS Grid para aside elementos main y secundarios

La cuadrícula CSS se puede usar para definir las secciones main y aside de un diseño, que es un uso perfecto para la cuadrícula. Como resultado, la aside de la sección lateral será igual a la del elemento main , incluso si está vacío.

Para solucionar esto, aside el elemento lateral con el inicio de su padre, de modo que su altura no se expanda.

 .wrapper { display: grid; grid-template-columns: repeat(12, minmax(0, 1fr)); grid-gap: 20px; } // align-self will tell the aside element to align itself with the start of its parent. aside { grid-column: 1 / 4; grid-row: 1; align-self: start; } main { grid-column: 4 / 13; } 
(Vista previa grande)

Vea la página principal de Pen y aparte por Ahmad Shadeed (@shadeed) en CodePen.

Vea la página principal de Pen y aparte por Ahmad Shadeed (@shadeed) en CodePen.

11. Agregar fill a un SVG

A veces, mientras se trabaja con SVG, el fill no funciona como se esperaba si el atributo de fill se ha agregado en línea en el SVG. Para resolver esto, ya sea para eliminar el atributo de fill del propio SVG o anular el fill: color .

Toma este ejemplo:

 .some-icon { fill: #137cbf; }

Esto no funcionará si el SVG tiene un relleno en línea. Debería ser esto en su lugar:

 .some-icon path { fill: #137cbf; }

12. Trabajar con pseudoelementos

Me encanta usar pseudo-elementos siempre que puedo. Nos brindan una forma de crear elementos falsos, principalmente con fines decorativos, sin agregarlos al HTML.

Al trabajar con ellos, el autor puede olvidarse de hacer uno de los siguientes:

  • agregue el content: "" propiedad,
  • establezca el width y la height sin definir la propiedad de display para ello.

En el siguiente ejemplo, tenemos un título con una insignia como pseudoelemento. Se debe agregar la propiedad content: "" . Además, el elemento debe tener display: inline-block establecido para que el width y el height funcionen como se esperaba.

Vista previa grande

13. El espacio extraño cuando se usa la display: inline-block

Establecer dos o más elementos para display: inline-block o display: inline creará un pequeño espacio entre cada uno. El espacio se agrega porque el navegador interpreta los elementos como palabras, por lo que agrega un espacio de caracteres entre cada uno.

En el siguiente ejemplo, cada elemento tiene un espacio de 8px en el lado derecho, pero el pequeño espacio causado por el uso de display: inline-block lo convierte en 12px , que no es el resultado deseado.

 li:not(:last-child) { margin-right: 8px; } 
(Vista previa grande)

Una solución simple para esto es establecer font-size: 0 en el elemento principal.

 ul { font-size: 0; } li { font-size: 16px; /*The font size should be reassigned here because it will inherit `font-size: 0` from its parent.*/ } 
(Vista previa grande)

Vea el espaciado de bloques en línea de la pluma por Ahmad Shadeed (@shadeed) en CodePen.

Vea el espaciado de bloques en línea de la pluma por Ahmad Shadeed (@shadeed) en CodePen.

14. Agregue for="ID" al asignar un elemento de etiqueta a una entrada

Cuando trabaje con elementos de formulario, asegúrese de que todos los elementos de label tengan un ID asignado. Esto los hará más accesibles y, cuando se haga clic en ellos, se enfocará la entrada asociada.

 <label for="emailAddress">Email address:</label> <input type="email"> 
Vista previa grande

15. Las fuentes no funcionan con elementos HTML interactivos

Al asignar fuentes a todo el documento, no se aplicarán a elementos como input , button , select y textarea . No se heredan de forma predeterminada porque el navegador les aplica la fuente del sistema predeterminada.

Para solucionar esto, asigne la propiedad de fuente manualmente:

 input, button, select, textarea { font-family: your-awesome-font-name; }

16. Barra de desplazamiento horizontal

Algunos elementos harán que aparezca una barra de desplazamiento horizontal, debido al ancho de esos elementos.

La forma más fácil de encontrar la causa de este problema es usar el esquema CSS. Addy Osmani ha compartido un script muy útil que se puede agregar a la consola del navegador para delinear cada elemento de la página.

 [].forEach.call($$("*"), function(a) { a.style.outline = "1px solid #" + (~~(Math.random() * (1 << 24))).toString(16); }); 
(Vista previa grande)

17. Imágenes comprimidas o estiradas

Cuando cambia el tamaño de una imagen en CSS, podría comprimirse o estirarse si la relación de aspecto no es consistente con el ancho y el alto de la imagen.

La solución es simple: use object-fit CSS. Su funcionalidad es similar a la de background-size: cover para imágenes de fondo.

 img { object-fit: cover; } 
(Vista previa grande)

Usar object-fit no será la solución perfecta en todos los casos. Algunas imágenes deben aparecer sin recortar ni cambiar el tamaño, y algunas plataformas obligan al usuario a cargar o recortar una imagen en un tamaño definido. Por ejemplo, Dribbble acepta cargas de miniaturas de 800 por 600 píxeles.

18. Agregue el type correcto para input .

Utilice el type correcto para un campo de input . Esto mejorará la experiencia del usuario en los navegadores móviles y la hará más accesible para los usuarios.

Aquí hay algo de HTML:

 <form action=""> <p> <label for="name">Full name</label> <input type="text" id="name"> </p> <p> <label for="email">Email</label> <input type="email" id="email"> </p> <p> <label for="phone">Phone</label> <input type="tel" id="phone"> </p> </form>

Así es como se verá cada entrada una vez que esté enfocada:

(Vista previa grande)

19. Números de teléfono en diseños RTL

Al agregar un número de teléfono como + 972-123555777 en un diseño de derecha a izquierda, el símbolo más se colocará al final del número. Para solucionarlo, reasigna la dirección del número de teléfono.

 p { direction: ltr; } 
(Vista previa grande)

Conclusión

Todos los problemas mencionados aquí se encuentran entre los más comunes que he enfrentado en mi trabajo de desarrollo front-end. Mi objetivo es mantener una lista para revisar regularmente mientras trabajo en un proyecto web.

¿Tienes un problema al que siempre te enfrentas en CSS? ¡Cuéntanos en los comentarios!