Semicírculo transparente cortado de un div

Resuelto user852974 asked hace 12 años • 8 respuestas

Me gustaría hacer una forma de semicírculo recortada transparente usando solo CSS3. El único requisito es que todos los elementos que forman la forma deben ser negros o transparentes .

No puedo usar un rectángulo negro con un círculo blanco encima porque el semicírculo tiene que ser transparente y dejar que se vea el fondo.

Forma deseada:

rectángulo con medio círculo recortado

user852974 avatar Dec 14 '11 18:12 user852974
Aceptado

Es posible hacerlo con ::afteruna pseudopropiedad CSS como esta:

body {
  background: green;
}

.rect {
  height: 100px;
  width: 100px;
  background: rgba(0, 0, 0, 0.5);
  position: relative;
  margin-top: 100px;
  margin-left: 100px;
}

.circle {
  display: block;
  width: 100px;
  height: 50px;
  top: -50px;
  left: 0;
  overflow: hidden;
  position: absolute;
}

.circle::after {
  content: '';
  width: 100px;
  height: 100px;
  -moz-border-radius: 100px;
  -webkit-border-radius: 100px;
  border-radius: 100px;
  background: rgba(0, 0, 0, 0);
  position: absolute;
  top: -100px;
  left: -40px;
  border: 40px solid rgba(0, 0, 0, 0.5);
}
<div class="rect">&nbsp;<span class="circle"></span></div>
Expandir fragmento

Ver en JSFiddle

sandeep avatar Dec 14 '2011 11:12 sandeep

Puedes usar sombras de cuadro para hacer el círculo recortado transparente :

body {
  background: url(http://i.imgur.com/qi5FGET.jpg) no-repeat;
  background-size: cover;
}
div {
  display: inline-block;
  width: 300px; height: 300px;
  position: relative;
  overflow: hidden;
}
div:before {
  content: '';
  position: absolute;
  bottom: 50%;
  width: 100%; height: 100%;
  border-radius: 100%;
  box-shadow: 0px 300px 0px 300px #000;
}
.transparent {
  opacity: 0.5;
}
<div></div>
<div class="transparent"></div>
Expandir fragmento

Semicírculo recortado transparente

Esto puede responder con longitudes porcentuales:

Mostrar fragmento de código

web-tiki avatar Jul 16 '2014 16:07 web-tiki

Usando SVG:

Aquí hay una solución alternativa que usa SVG (aunque no la haya etiquetado). Las ventajas de usar SVG son:

  • Tiene una mejor compatibilidad con el navegador en comparación con los gradientes radiales.
  • SVG puede admitir imágenes dentro de la forma, a diferencia del enfoque de cuadro de sombra.

Si bien SVG no es compatible con <= IE8, mientras que box-shadow sí lo es, se pueden proporcionar alternativas.

Mostrar fragmento de código


Usando CSS:

CSS también tiene clip-pathespecificaciones y podemos probar algo como el siguiente fragmento.

Mostrar fragmento de código

Pero a diferencia de la ruta de clip SVG, la versión CSS pura (es decir, sin utilizar un SVG en línea o externo) no parece ser capaz de admitir un archivo path. Solo admite formas y, por lo tanto, en este caso, si usa clip-pathdirectamente en el padre, solo producirá una elipse (como se muestra en el fragmento). Para superar esto, tendríamos que colocar la ruta del clip en un elemento secundario (o en un pseudoelemento) y esto significaría que el área recortada no sería transparente .


Usando lienzo:

Lo mismo se puede hacer también usando Canvas. Los comandos de Canvas son bastante similares a SVG y sus ventajas también son bastante similares. Sin embargo, Canvas se basa en ráster y, por lo tanto, no se escala tan bien como SVG.

Mostrar fragmento de código


Usando máscaras :

Esta forma también se puede crear usando máscaras CSS (o) SVG. Las máscaras CSS tienen muy poco soporte y actualmente solo funcionan en navegadores con Webkit, pero las máscaras SVG tienen un soporte mucho mejor y deberían funcionar en IE9+.

Mostrar fragmento de código

Harry avatar Jun 09 '2015 08:06 Harry

Puedes hacerlo muy fácilmente con un degradado radial.

MANIFESTACIÓN

Resultado :

forma

HTML :

<div class='shape'></div>

CSS relevante :

.shape {
  margin: 0 auto;
  width: 10em; height: 16em;
  /* WebKit browsers, old syntax */
  background: -webkit-radial-gradient(50% 0, circle, transparent 30%, black 30%);
  
  /* IE10, current versions of Firefox and Opera */
  background: radial-gradient(circle at 50% 0, transparent 30%, black 30%);
}

Consulte http://caniuse.com/#feat=css-gradients para obtener información detallada sobre la compatibilidad.

Ana avatar Feb 15 '2013 05:02 Ana