CSS Cut out circle from a rectangular shape

前端 未结 3 1311
眼角桃花
眼角桃花 2020-11-27 21:15

I managed to achieve this effect: http://jsfiddle.net/6z3msdwf/1/ but I am not really happy with the markup. Also, there is an weird bug in IE 10/11 where a 1px gap is shown

相关标签:
3条回答
  • 2020-11-27 21:43

    You can do this using a single element (plus a pseudo element) using radial-gradient background for the parent element while the pseudo-element creates the circle.

    div:before {  /* creates the red circle */
      position: absolute;
      content: '';
      width: 90px;
      height: 90px;
      top: -75px;  /* top = -75px, radius = 45px, so circle's center point is at -30px */
      left: calc(50% - 45px);
      background-color: red;
      border-radius: 50%;
    }
    div {
      position: relative;
      margin: 100px auto 0 auto;
      width: 90%;
      height: 150px;
      border-radius: 6px;  
      
      /* only the below creates the transparent gap and the fill */
      background: radial-gradient(50px 50px at 50% -30px, rgba(0, 0, 0, 0) 49.5px, rgba(0, 0, 0, .8) 50.5px);  /* use same center point as with concentric circles but larger radius */
    }
    
    /* just for demo */
    
    body,
    html {
      font-size: 18px;
    }
    body {
      background-image: radial-gradient(circle, #3F9CBA 0%, #153346 100%);
    }
    <div></div>

    0 讨论(0)
  • 2020-11-27 21:52

    You could use a circular gradient

    div {
      height: 150px;
      margin: 5em 2em;
      background: radial-gradient(circle at top center, transparent, transparent 70px, black 70px, black);
      border-radius: 8px;
      position: relative;
    }
    .circle {
      width: 120px;
      height: 120px;
      background: red;
      border-radius: 50%;
      position: absolute;
      top: 0;
      left: 50%;
      transform: translate(-50%, -50%);
    }
    body {
      background-image: url(http://www.fillmurray.com/1000/1000);
      background-size: cover;
    }
    <div>
      <span class="circle"></span>
    </div>

    0 讨论(0)
  • 2020-11-27 21:52

    With an inline svg it is very simple :

    • a circle element
    • a path element with an arc comand for the indented circle

    body{background:url('http://i.imgur.com/5NK0H1e.jpg');background-size:cover;
    svg{display:block;}
    <svg viewbox="0 0 10 3.5">
      <path d="M4.2 1 A0.85 0.85 0 0 0 5.8 1 H10 V3.5 H0 V1z" fill="#333" />
      <circle cx="5" cy="0.7" r="0.7" fill="red" /> 
    </svg>

    Or if you really want to use CSS, you can achieve the shape with the approach described in: Transparent half circle cut out of a div.
    Note that the code is much longer than the svg approach:

    .container{
      position:relative;
      height:250px;
      text-align:center;
    }
    .circle{
      position:relative;
      display:inline-block;
      width:100px; height:100px;
      background:red;
      border-radius:50%;
      z-index:2;
    }
    .rect{
      position:absolute;
      top:50px; left:0;
      width:100%; height:200px;
      border-radius:10px;
      overflow:hidden;
      z-index:1;
    }
    .rect:before{
      content:'';
      position:absolute;
      top:-60px; left:50%;
      margin-left:-60px;
      width:120px; height:120px;
      border-radius:50%;
      box-shadow:0 0 0 99999px #333;  
    }
    
    body{background:url('http://i.imgur.com/5NK0H1e.jpg');background-size:cover;
    <div class="container">
      <div class="circle"></div>
      <div class="rect"></div>
    </div>

    0 讨论(0)
提交回复
热议问题