Semicírculo transparente cortado de un div
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:
Es posible hacerlo con ::after
una 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"> <span class="circle"></span></div>
Ver en JSFiddle
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>
Esto puede responder con longitudes porcentuales:
Mostrar fragmento de código
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-path
especificaciones 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-path
directamente 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
Puedes hacerlo muy fácilmente con un degradado radial.
MANIFESTACIÓN
Resultado :
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.