Tema representativo de entrevista

Entrevista frontend: ¿Cómo usarías CSS shape() para un recorte responsivo?

FrontendDifícil
Equipo editorial de Offer.ccPublicado Actualizado

Pregunta

Una tarjeta de marketing necesita un borde curvo que responda a su contenedor. ¿Cómo la implementarías con CSS shape() manteniendo usables los navegadores no compatibles?

Planteamiento y contexto

Una tarjeta de marketing necesita un borde curvo que responda al ancho de su contenedor. El diseño proporciona una ruta, pero la decoración no debe romper el contenido, el foco del teclado ni el diseño en navegadores más antiguos. Explica cómo usar shape() con clip-path, compáralo con path() y polygon(), y proporciona un plan de mejora progresiva.

Qué evalúa el entrevistador

  • Saber que shape() es una función de forma básica de CSS, no una cadena de ruta SVG.
  • El manejo de unidades, funciones matemáticas de CSS, tamaño del contenedor y diferencias en la compatibilidad de navegadores.
  • Tratar el recorte como una decoración mientras se preserva el contenido semántico, el foco y un fallback legible.

Preguntas para aclarar primero

  1. ¿La forma es puramente decorativa o contiene información, un área de interacción o influye en el orden de lectura?
  2. ¿La matriz de navegadores objetivo permite una funcionalidad de CSS Shapes Level 2 que no esté ampliamente disponible?
  3. Cuando no sea compatible, ¿es aceptable un rectángulo, una aproximación con polygon() o un recurso de imagen?

Una respuesta en 30 segundos

Organizaría el contenido con el modelo de caja normal y añadiría clip-path: shape(...) como una mejora visual. shape() acepta unidades y operaciones matemáticas de CSS, lo que ayuda a la geometría responsiva; path() usa una cadena de ruta SVG, mientras que polygon() es más fácil para implementar un fallback pero solo aproxima las curvas. Condicionaría la mejora mediante @supports o detección de características, mantendría un rectángulo legible y probaría que el recorte no oculte el foco, los objetivos de interacción ni el contenido semántico.

Análisis detallado paso a paso

1. Separar el contenido del recorte

Mantén el encabezado, el texto y el botón en el orden normal del DOM. clip-path modifica la región pintada; no debería ocultar contenido ni alterar el orden de lectura. Coloca los fondos, bordes e ilustraciones en una capa decorativa mientras la capa de contenido permanece desplazable y enfocable.

2. Por qué elegir shape()

shape() utiliza comandos de estilo CSS y puede combinar porcentajes, longitudes y operaciones matemáticas de CSS. En comparación con una cadena path() de SVG, es más fácil de ajustar con las dimensiones del contenedor y los design tokens. En comparación con polygon(), puede expresar curvas y comandos de ruta más avanzados.

3. Escribir una mejora delimitada

css
.card {
  background: var(--surface);
  overflow: clip;
}

@supports (clip-path: shape(from 0 0, line to 100% 0, close)) {
  .card {
    clip-path: shape(
      from 0 0,
      line to 100% 0,
      line to 100% 82%,
      curve to 0 100% with 52% 88%,
      close
    );
  }
}

El comando dentro del bloque de código es ilustrativo; la sintaxis en producción debe verificarse con respecto a los navegadores objetivo y la especificación. La regla base proporciona color, espaciado y texto utilizables, de modo que una mejora fallida no deje una tarjeta vacía.

4. Diseñar capas de fallback

El fallback más seguro es un rectángulo. Donde se admita polygon(), este puede aproximar el borde. Si una curva es esencial, utiliza un recurso de fondo comprimido manteniendo el color CSS y el contraste del texto. No conviertas una ruta compleja no probada en el único diseño.

5. Manejar el tamaño responsivo y el desbordamiento

Expresa los puntos clave con porcentajes y dimensiones del contenedor, luego prueba contenedores muy estrechos y anchos, orientación horizontal y niveles altos de zoom. clip-path puede hacer que la región pintada sea más pequeña, pero no reserva espacio de diseño adicional; el contenido aún necesita padding, altura mínima y una estrategia de desplazamiento.

6. Verificar los límites de accesibilidad

El recorte no altera la semántica del DOM, el orden del lector de pantalla ni el orden del teclado, pero puede cubrir visualmente un anillo de foco, un mensaje de error o un objetivo del puntero. Prueba la navegación por teclado, el zoom, los lectores de pantalla y el alto contraste; coloca los estilos de foco en un contenedor sin recorte cuando sea necesario.

7. Gestionar el movimiento y el costo

Si la forma se anima, asegúrate de que no cause molestias ni oculte contenido y respeta prefers-reduced-motion. Vigila el costo de renderizado en dispositivos de gama baja y listas largas; la decoración estática es preferible a los redibujados complejos continuos.

Respuesta modelo

Permitiría que la tarjeta complete primero el diseño del modelo de caja normal, manteniendo semánticos su encabezado, texto y botón, y luego usaría clip-path únicamente como decoración. shape() se adapta a la geometría responsiva porque acepta unidades y operaciones matemáticas de CSS; path() es más cercano a una cadena SVG, mientras que polygon() es una aproximación conservadora. Condicionaría la mejora con @supports, preservaría un rectángulo o una aproximación probada en caso de fallo, y probaría anchos extremos, zoom, foco del teclado, lectores de pantalla, alto contraste y movimiento reducido. El borde recortado nunca debe ocultar un anillo de foco o un objetivo de clic.

Errores comunes

  • Tratar a shape() como una sintaxis que acepta una cadena SVG path() sin cambios.
  • Escribir únicamente la mejora sin un estilo base rectangular legible.
  • Permitir que el borde recortado cubra un botón, un mensaje de error o un indicador de foco.
  • Usar geometría de píxeles fijos para todos los anchos de contenedor y longitudes de texto.
  • Afirmar un soporte universal sin definir una matriz de compatibilidad ni detección de características.

Preguntas de seguimiento y respuestas

¿Por qué no usar una sola imagen SVG?

Para un recurso de marca fijo, el SVG puede ser más estable. Elige shape() cuando las unidades de CSS, la responsividad del contenedor y los tokens de tema sean prioritarios, y luego evalúa soporte, mantenimiento y rendimiento.

¿Qué pasa si @supports pasa pero la forma es incorrecta?

Trata la detección de características como una validación de sintaxis, no como una prueba de que cada comando de ruta se comporta de manera idéntica. Utiliza capturas de pantalla de navegadores reales y pruebas de interacción para los comandos clave, con una ruta de fallback más simple.

¿El recorte puede afectar el área de interacción?

El recorte visual puede afectar el comportamiento percibido de la interacción, así que verifícalo en los navegadores objetivo. Mantén los controles grandes y visiblemente enfocados, y traslada la capa de interacción a un contenedor no recortado cuando sea necesario.

¿Qué pasa si el texto debe seguir la curva?

clip-path solo recorta una región; no distribuye texto a lo largo de una ruta. Utiliza una técnica de diseño de texto independiente o modifica la estructura del contenido en lugar de tratar el recorte como una API tipográfica.

¿Cómo pruebas el contenido localizado?

Prueba con la traducción más larga, diferentes pesos de fuente, combinaciones con árabe o CJK y el zoom del usuario. La forma es una decoración, por lo que el hecho de que una cadena corta en inglés encaje por casualidad no es prueba suficiente.

¿Cuándo deberías abandonar shape()?

Usa polygon(), un degradado, SVG o un rectángulo cuando el soporte, el costo de animación o la consistencia visual no cumplan con el estándar requerido. Define la condición de parada en lugar de defender una nueva característica a toda costa.

Fuentes públicas

Preguntas relacionadas