search

Home  >  Q&A  >  body text

The rewritten title is: CSS 3 shapes: "Reverse Circle" or "Cut Circle"

<p>I want to create a shape that I would describe as an "anti-circle": </p> <p>The image is somewhat inaccurate because the black line should continue along the outer border of the div element. </p> <p>This is the demo I currently have: http://jsfiddle.net/n9fTF/</p> <p>Is it possible to use <code>CSS</code> without images? </p>
P粉979586159P粉979586159463 days ago431

reply all(2)I'll reply

  • P粉680087550

    P粉6800875502023-08-25 13:34:04

    I can't really tell from your plot how round you want the points to be, but there is one possibility: http://jsfiddle.net/n9fTF/6/

    If the points need to be more rounded, you will need to place some circles on the ends so that they blend in with the spoon.

    reply
    0
  • P粉391677921

    P粉3916779212023-08-25 12:22:15

    Update: CSS3 Radial Background Gradient Options

    (For those browsers that support it - tested in FF and Chrome - IE10, Safari should also work).

    One of the "problems" with my original answer was those situations without a solid background. This update creates the same effect, allowing a transparent "gap" between the circle and its reverse cutout.

    View example fiddle.

    CSS

    .inversePair {
        border: 1px solid black;
        display: inline-block;    
        position: relative;    
        height: 100px;
        text-align: center;
        line-height: 100px;
        vertical-align: middle;
    }
    
    #a {
        width: 100px;
        border-radius: 50px;
        background: grey;
        z-index: 1;
    }
    
    #b {
        width: 200px;
        /* need to play with margin/padding adjustment
           based on your desired "gap" */
        padding-left: 30px;
        margin-left: -30px;
        /* real borders */
        border-left: none;
        -webkit-border-top-right-radius: 20px;
        -webkit-border-bottom-right-radius: 20px;
        -moz-border-radius-topright: 20px;
        -moz-border-radius-bottomright: 20px;
        border-top-right-radius: 20px;
        border-bottom-right-radius: 20px;
        /* the inverse circle "cut" */
        background-image: -moz-radial-gradient(
            -23px 50%, /* the -23px left position varies by your "gap" */
            circle closest-corner, /* keep radius to half height */
            transparent 0, /* transparent at center */
            transparent 55px, /*transparent at edge of gap */
            black 56px, /* start circle "border" */
            grey 57px /* end circle border and begin color of rest of background */
        );
        background-image: -webkit-radial-gradient(-23px 50%, circle closest-corner, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 0) 55px, black 56px, grey 57px);
        background-image: -ms-radial-gradient(-23px 50%, circle closest-corner, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 0) 55px, black 56px, grey 57px);
        background-image: -o-radial-gradient(-23px 50%, circle closest-corner, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 0) 55px, black 56px, grey 57px);
        background-image: radial-gradient(-23px 50%, circle closest-corner, rgba(0, 0, 0, 0) 0, rgba(0, 0, 0, 0) 55px, black 56px, grey 57px);
    }
    

    Original answer

    It took more effort than I expected to get the z-indexing to work properly ( this seems to ignore negative z-indexing ), however, this provides a nice clean Appearance (tested in IE9, FF, Chrome):

    HTML

    <div id="a" class="inversePair">A</div>
    <div id="b" class="inversePair">B</div>

    CSS

    .inversePair {
        border: 1px solid black;
        background: grey;
        display: inline-block;    
        position: relative;    
        height: 100px;
        text-align: center;
        line-height: 100px;
        vertical-align: middle;
    }
    
    #a {
        width: 100px;
        border-radius: 50px;
    }
    
    #a:before {
        content:' ';
        left: -6px;
        top: -6px;
        position: absolute;
        z-index: -1;
        width: 112px; /* 5px gap */
        height: 112px;
        border-radius: 56px;
        background-color: white;
    } 
    
    #b {
        width: 200px;
        z-index: -2;
        padding-left: 50px;
        margin-left: -55px;
        overflow: hidden;
        -webkit-border-top-right-radius: 20px;
        -webkit-border-bottom-right-radius: 20px;
        -moz-border-radius-topright: 20px;
        -moz-border-radius-bottomright: 20px;
        border-top-right-radius: 20px;
        border-bottom-right-radius: 20px;
    }
    
    #b:before {
        content:' ';
        left: -58px;
        top: -7px;
        position: absolute;
        width: 114px; /* 5px gap, 1px border */
        height: 114px;
        border-radius: 57px;
        background-color: black;
    } 
    

    reply
    0
  • Cancelreply