clip-path y formas CSS: Concepto, sintaxis y ejemplos
Una guía exhaustiva para crear recortes y máscaras avanzadas con clip-path, comparar con alternativas como SVG y aplicar buenas prácticas de rendimiento y accesibilidad.
1. ¿Qué es clip-path?
La propiedad clip-path permite definir una región visible de un elemento, ocultando el resto. Esta región se describe mediante una forma geométrica (círculo, elipse, polígono, etc.) o mediante una ruta SVG.
Al recortar un elemento, el navegador sigue renderizando su contenido, pero sólo la porción dentro del “clip” es visible al usuario, lo que abre posibilidades para:
- Diseños creativos sin imágenes externas.
- Animaciones de forma dinámica.
- Optimización de carga al evitar assets extra.
2. Sintaxis básica
La sintaxis sigue la forma clip-path: función(valores);. Las funciones más comunes son:
circle()ellipse()inset()polygon()path()(ruta SVG)
Ejemplo mínimo:
img {
clip-path: circle(50% at 50% 50%);
}
3. Tipos de formas y sus parámetros
3.1 circle()
Define un círculo mediante radius y opcionalmente el centro (at x y).
.c1 { clip-path: circle(40px); }
.c2 { clip-path: circle(30% at 20% 80%); }
3.2 ellipse()
Similar a circle pero con radios diferentes en X y Y.
.e1 { clip-path: ellipse(60% 30% at 50% 50%); }
3.3 inset()
Crea un rectángulo interior con opcional round para bordes redondeados.
.i1 { clip-path: inset(10% 5% 15% 20% round 10px); }
3.4 polygon()
Define una forma con una lista de puntos (x y) en porcentaje o unidades absolutas.
.p1 { clip-path: polygon(0 0, 100% 0, 100% 70%, 50% 100%, 0 70%); }
3.5 path() (SVG)
Permite usar cualquier ruta SVG d="…". Ideal para formas complejas.
.svg-path { clip-path: path('M10 10 H 90 V 90 H 10 Z'); }
4. Ejemplos reales
4.1 Imagen con forma de hexágono
img {
clip-path: polygon(25% 0, 75% 0, 100% 50%, 75% 100%, 25% 100%, 0 50%);
}
4.2 Texto recortado con circle() animado
@keyframes pulse {
0% { clip-path: circle(30% at 50% 50%); }
50% { clip-path: circle(45% at 50% 50%); }
100% { clip-path: circle(30% at 50% 50%); }
}
.pulse-text { animation: pulse 3s infinite; }
5. Comparativa: clip-path vs mask-image vs SVG
| Característica | clip-path | mask-image | SVG (clipPath / mask) |
|---|---|---|---|
| Tipo de forma | Polígonos, círculos, elipses, insets, rutas SVG | Imágenes raster o gradientes | Formas vectoriales complejas, filtros, animaciones SMIL/ CSS |
| Soporte navegadores | Chrome 94+, Edge 94+, Firefox 54+, Safari 9+ | Chrome 53+, Edge 79+, Firefox 53+, Safari 9+ | |
| Rendimiento | Alta, usa GPU cuando es posible | Puede requerir rasterización extra | Depende de la complejidad del SVG, a veces más costoso |
| Accesibilidad | El contenido sigue presente en el DOM, legible por lectores de pantalla | Igual, pero el alfa del mask puede afectar contraste | Similar, pero elementos clipPath no son interactivos |
6. Compatibilidad y fallback
Para navegadores que no soportan clip-path, se recomienda:
- Utilizar
svgcomo fallback mediante<svg>inline. - Aplicar la propiedad con prefijo
-webkit-para Safari. - Definir una versión sin recorte para garantizar la usabilidad.
.fallback {
/* Safari < 9 */
-webkit-clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
/* Chrome/Edge/Firefox */
clip-path: polygon(0 0, 100% 0, 100% 100%, 0 100%);
}
7. Buenas prácticas de rendimiento
- Usar unidades porcentuales siempre que sea posible para que el recorte se recompute solo al redimensionar.
- Limitar la complejidad de
polygon(): más de 12 vértices puede afectar la GPU. - Prefijado con
will-change: clip-pathcuando la forma cambie con animaciones. - Evitar recortes en elementos con
filterotransformsimultáneos, pues pueden forzar re‑pintado. - Combinar con
object-fitpara imágenes responsivas y evitar distorsión.
.animado {
will-change: clip-path;
animation: rotate 4s linear infinite;
}
@keyframes rotate {
from { clip-path: inset(0% round 0); }
to { clip-path: inset(0% round 50%); }
}
8. Accesibilidad y SEO
El recorte visual no afecta la indexación del contenido, pero hay que:
- Proveer
altdescriptivo en imágenes recortadas. - Evitar recortar texto esencial; el lector de pantalla sigue leyendo todo el contenido.
- Usar contrastes adecuados en áreas recortadas para cumplir WCAG 2.1 AA.
9. Solución de problemas frecuente
| Problema | Causa | Solución |
|---|---|---|
| El recorte no se muestra en Safari | Falta el prefijo -webkit- o la forma no está soportada. |
Añadir -webkit-clip-path y usar formas básicas (circle, ellipse, inset). |
Parpadeo al animar clip-path |
El navegador está repintando en lugar de usar la capa GPU. | Declarar will-change: clip-path; y asegurarse de que la animación sea CSS (no JavaScript). |
| El contenido recortado se corta en dispositivos con zoom | Uso de unidades absolutas (px) en vez de %. | Convertir a porcentajes o usar calc() relativo al contenedor. |
10. Casos de uso avanzados
- Galerías tipo "masonry" con recortes dinámicos: combinar
gridyclip-pathpara piezas de distinto tamaño. - Hover reveal: al pasar el ratón, cambiar la forma del recorte para revelar más información.
- Animaciones de carga (skeleton loaders) usando
polygon()que simulan contornos de texto. - Componentes de UI con bordes irregulares (botones con forma de estrella, tarjetas con esquina recortada).
- Integración con frameworks: en React o Vue usar
style={{ clipPath: 'polygon(...)' }}y combinar constyled‑componentspara temas dinámicos.
Domina clip-path y las formas CSS: Guía completa con ejemplos prácticos