Twitter Facebook RSS Feed

lunes, 23 de septiembre de 2019 a las 11:24hs por Valentina Echezuria

La propiedad clip-path en css nos permite establecer un área específica de un elemento a mostrar, en vez de mostrar todo el elemento en su totalidad, es decir, un área que corta el elemento.
Esto puede lograrse utilizando distintos valores de corte dependiendo del resultado deseado:

Valores de imagen:
clip-path: url(recursos.svg)

Valores geométricos:
clip-path: polygon ();
clip-path: circle ();
clip-path: inset (); /*Corta el área interna del la figura*/

Utilizando los valores geométricos:
clip-path: circle

.circle{
    clip-path: circle(50%);
    width: 300px;
    height: 300px;
    background: linear-gradient(#58C2ED, #1B85DC);
}
<div class="circle"></div>

Resultado:

clip-path: polygon

.polygon{
    clip-path: polygon(0 0, 23% 0, 60% 48%, 24% 100%, 0 100%, 38% 48%);
    width: 300px;
    height: 300px;
    background: linear-gradient(#58C2ED, #1B85DC);
}
<div class="polygon"></div>

Resultado:

Forma exterior

También podemos cortar el área externa de nuestra figura utilizando la propiedad shape-outside, lo que traería como resultado que el área circundante a nuestra figura funcione como molde al contenido exterior.

.half-circle{
    float: left;
    shape-outside: circle(50% at 0 50%);
    clip-path: circle(50% at 0 50%);
    width: 300px;
    height: 300px;
    background: linear-gradient(#58C2ED, #1B85DC);
    margin-right: 40px;
}
<div class="half-circle"></div>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>
<p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper suscipit lobortis nisl ut aliquip ex ea commodo consequat.</p>

Resultado:

Animar formas

Se pueden realizar animaciones cambiando la forma de la figura haciendo una transición sobre el elemento utilizando solo css.

.animated-shape {
   background-color: #fc4444;
   color: white;
   width: 300px;
   height: 300px;
   margin: 30px auto;
   text-align: justify;
   shape-inside: polygon(20% 0%, 0% 20%, 30% 50%, 0% 80%, 20% 100%, 50% 70%, 80% 100%, 100% 80%, 70% 50%, 100% 20%, 80% 0%, 50% 30%);
   shape-padding: 20px;
   transition: all 0.5s ease;
   -webkit-clip-path: polygon(20% 0%, 0% 20%, 30% 50%, 0% 80%, 20% 100%, 50% 70%, 80% 100%, 100% 80%, 70% 50%, 100% 20%, 80% 0%, 50% 30%);
}

.animated-shape:hover{
    background-color: #97e146;
    shape-inside: polygon(43% 46%, 21% 66%, 0 46%, 0% 80%, 20% 100%, 36% 84%, 52% 70%, 66% 55%, 82% 38%, 100% 20%, 84% 4%, 64% 25%);
    -webkit-clip-path: polygon(43% 46%, 21% 66%, 0 46%, 0% 80%, 20% 100%, 36% 84%, 52% 70%, 66% 55%, 82% 38%, 100% 20%, 84% 4%, 64% 25%);
}
<div class="animated-shape"></div>

Resultado:

Animar botones

.btn{
   clip-path: polygon(100% 0, 100% 50%, 100% 100%, 0% 100%, 0 49%, 0% 0%);
   background-color: #16a085;
   border: none;
   padding: 1rem;
   min-width: 8rem;
   color: #ffffff;
   text-transform: uppercase;
   font-weight: 600;
   transition: all 0.5s ease;
}

.btn:hover{
  clip-path:  polygon(88% 0, 100% 50%, 87% 100%, 0% 100%, 11% 50%, 0% 0%);
}
<button type="button" class="btn" name="button">button</button>

Resultado:

Interceptar textos y polígonos

Es posible utilizar múltiples figuras para encapsular textos en las formas que queramos. Teniendo como resultado que el texto se muestre siguiendo los patrones de las formas que lo rodean.

.left {
   float: left;
   shape-outside: polygon(0 0, 0 300px, 200px 300px);
   clip-path: polygon(0 0, 0 300px, 200px 300px);
   background: linear-gradient(to top right, #67D7F5, #868af7);
   height: 300px;
   width: 300px;
}

.right {
   float: right;
   shape-outside: polygon(200px 300px, 300px 300px, 300px 0, 0 0);
   clip-path: polygon(200px 300px, 300px 300px, 300px 0, 0 0);
   background: linear-gradient(to bottom left, #68d4f6, #73b8f6);
   height: 300px;
   width: 300px;
}

p{
   text-alig:justify
}
  <div class="left"></div>
  <div class="right"></div>
  <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. Ut wisi enim ad minim veniam, quis nostrud exerci tation ullamcorper.</p>
  <p>Lorem ipsum dolor sit amet, consectetuer adipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat. </p>        

Resultado

Utilizar clip-path con svg

Se puede utilizar alguna figura en formato svg para hacer el corte de área. Es necesario que el código del svg este dentro del tag (clipPath) para restringir el área en el que se visualizara el svg o imagen dentro del mismo.

<div class="svg-shape"><div>
  <svg height="0" width="0">
        <defs>
            <clipPath id="svgPath">
                <path fill="#FFFFFF" stroke="#000000" stroke-miterlimit="10" d="M11.6,49.9c-1.3,1.9-1.9,4-1.9,6.5s1.3,5,3.8,7.7l6.3,6.5c6.7,6.9,13.5,13.6,20.3,20.2l10.2,9.7l10.2-9.7
                	c6.8-6.5,13.6-13.2,20.3-20.2l6.7-7c2.3-2.3,3.4-4.6,3.4-6.8V56c0-1.7-0.2-3-0.6-4.1s-1-2.1-1.9-3.1c-0.9-1.1-1.9-2.1-3-3
                	c-1-0.8-2.1-1.5-3.1-1.9s-2.3-0.6-3.9-0.6c-1.6,0-2.9,0.2-3.9,0.6c-1.1,0.5-2.2,1.2-3.4,2.2c-1.3,1-2.7,2.3-4.3,4.1l-4,4.1V12.8
                	c0-2.6-0.4-4.6-1.3-6c-0.9-1.5-1.7-2.6-2.5-3.4c-0.8-0.8-2-1.6-3.4-2.5c-1.5-0.8-3.2-1.2-5.3-1.2c-2.1,0-3.9,0.4-5.3,1.3
                	c-1.5,0.9-2.6,1.7-3.4,2.5c-0.8,0.8-1.6,2-2.5,3.4c-0.8,1.5-1.3,3.5-1.3,6v40.9L30.5,47c-2.7-2.4-5.3-3.7-7.7-3.7
                	c-2.4,0-4.5,0.6-6.4,1.9C14.5,46.5,12.9,48.1,11.6,49.9"/>
            </clipPath>
        </defs>
    </svg>
.svg-shape {
    clip-path: url(#svgPath);
    height: 120px;
    width: 100px;
    background: linear-gradient(#58C2ED, #1B85DC);
}

Resultado

Utilizar animaciones sobre el svg

Podemos realizar animaciones dentro del área de corte mediante las animaciones dentro del mismo svg.

<div class="svg-shape-animated"><div>
  <svg height="50" width="50">
        <defs>
            <clipPath id="svgPath2">
                <circle stroke="#000000" stroke-miterlimit="10" cx="50" cy="50" r="40">
                   <animate
                       attributeName="r"
                       attributeType="XML"
                       from="0" to="250"
                       begin="0s" dur="3s"
                       fill="freeze"
                       repeatCount="indefinite"/>
                </circle>
                <circle stroke="#000000" stroke-miterlimit="10" cx="193.949" cy="235" r="74.576">
                    <animate
                        attributeName="r"
                        attributeType="XML"
                        from="0" to="250"
                        begin="0s" dur="3s"
                        fill="freeze"
                        repeatCount="indefinite"/>
                </circle>
            </clipPath>
        </defs>
    </svg>
.svg-shape {
    clip-path: url(#svgPath2);
    height: 120px;
    width: 100px;
    background: linear-gradient(#58C2ED, #1B85DC);
}

Resultado

Soporte en navegadores

La mayor limitación del uso de clip-path, es que la mayoría de las formas para utilizar no tienen soporte en internet explorer ni en edge, por lo que hay que tenerlo en consideración al pensar en el Cross Browsing de nuestro sitio. Podrán comparar el soporte de esta propiedad en los distintos navegadores aquí.

3 comentarios »

  1. Excelente contenido, gracias por compartir!

  2. Como debo poner los codigos en el editor? copio y pego tus ejemplos pero no se ve nada, debo ponerlo antes o despues del css?

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.