SVG rounded corner

前端 未结 12 2019
谎友^
谎友^ 2020-11-28 22:21

I have the following SVG:



        
相关标签:
12条回答
  • 2020-11-28 23:01

    Just to simplify implementing answer of @hmak.me, here's a commented piece of React code to generate rounded rectangles.

    const Rect = ({width, height, round, strokeWidth}) => {
        // overhang over given width and height that we get due to stroke width
        const s = strokeWidth / 2;
    
        // how many pixels do we need to cut from vertical and horizontal parts
        // due to rounded corners and stroke width
        const over = 2 * round + strokeWidth;
    
        // lengths of straight lines
        const w = width - over;
        const h = height - over;
    
        // beware that extra spaces will not be minified
        // they are added for clarity
        const d = `
            M${round + s},${s}
            h${w}
            a${round},${round} 0 0 1 ${round},${round}
            v${h}
            a${round},${round} 0 0 1 -${round},${round}
            h-${w}
            a${round},${round} 0 0 1 -${round},-${round}
            v-${h}
            a${round},${round} 0 0 1 ${round},-${round}
            z
        `;
        return (
            <svg width={width} height={height}>
                <path d={d} fill="none" stroke="black" strokeWidth={strokeWidth} />
            </svg>
        );
    };
    
    ReactDOM.render(
        <Rect width={64} height={32} strokeWidth={2} round={4} />,
        document.querySelector('#app'),
    );
    

    Jsfiddle link.

    0 讨论(0)
  • 2020-11-28 23:02

    Not sure why nobody posted an actual SVG answer. Here is an SVG rectangle with rounded corners (radius 3) on the top:

    <svg:path d="M0,0 L0,27 A3,3 0 0,0 3,30 L7,30 A3,3 0 0,0 10,27 L10,0 Z" />
    

    This is a Move To (M), Line To (L), Arc To (A), Line To (L), Arc To (A), Line To (L), Close Path (Z).

    The comma-delimited numbers are absolute coordinates. The arcs are defined with additional parameters specifying the radius and type of arc. This could also be accomplished with relative coordinates (use lower-case letters for L and A).

    The complete reference for those commands is on the W3C SVG Paths page, and additional reference material on SVG paths can be found in this article.

    0 讨论(0)
  • 2020-11-28 23:03

    Here is how you can create a rounded rectangle with SVG Path:

    <path d="M100,100 h200 a20,20 0 0 1 20,20 v200 a20,20 0 0 1 -20,20 h-200 a20,20 0 0 1 -20,-20 v-200 a20,20 0 0 1 20,-20 z" />
    

    Explanation

    m100,100: move to point(100,100)

    h200: draw a 200px horizontal line from where we are

    a20,20 0 0 1 20,20: draw an arc with 20px X radius, 20px Y radius, clockwise, to a point with 20px difference in X and Y axis

    v200: draw a 200px vertical line from where we are

    a20,20 0 0 1 -20,20: draw an arc with 20px X and Y radius, clockwise, to a point with -20px difference in X and 20px difference in Y axis

    h-200: draw a -200px horizontal line from where we are

    a20,20 0 0 1 -20,-20: draw an arc with 20px X and Y radius, clockwise, to a point with -20px difference in X and -20px difference in Y axis

    v-200: draw a -200px vertical line from where we are

    a20,20 0 0 1 20,-20: draw an arc with 20px X and Y radius, clockwise, to a point with 20px difference in X and -20px difference in Y axis

    z: close the path

    <svg width="440" height="440">
      <path d="M100,100 h200 a20,20 0 0 1 20,20 v200 a20,20 0 0 1 -20,20 h-200 a20,20 0 0 1 -20,-20 v-200 a20,20 0 0 1 20,-20 z" fill="none" stroke="black" stroke-width="3" />
    </svg>

    0 讨论(0)
  • 2020-11-28 23:03

    Here are some paths for tabs:

    https://codepen.io/mochime/pen/VxxzMW

    <!-- left tab -->
    <div>
      <svg width="60" height="60">
        <path d="M10,10 
                 a10 10 0 0 1 10 -10
                 h 50   
                 v 47
                 h -50
                 a10 10 0 0 1 -10 -10
                 z"
          fill="#ff3600"></path>
      </svg>
    </div>
    
    <!-- right tab -->
    <div>
      <svg width="60" height="60">
        <path d="M10 0   
                 h 40
                 a10 10 0 0 1 10 10
                 v 27
                 a10 10 0 0 1 -10 10
                 h -40
                 z"
          fill="#ff3600"></path>
      </svg>
    </div>
    
    <!-- tab tab :) -->
    <div>
      <svg width="60" height="60">
        <path d="M10,40 
                 v -30
                 a10 10 0 0 1 10 -10
                 h 30
                 a10 10 0 0 1 10 10
                 v 30
                 z"
          fill="#ff3600"></path>
      </svg>
    </div>

    The other answers explained the mechanics. I especially liked hossein-maktoobian's answer.

    The paths in the pen do the brunt of the work, the values can be modified to suite whatever desired dimensions.

    0 讨论(0)
  • 2020-11-28 23:04

    I'd also consider using a plain old <rect> which provides the rx and ry attributes

    MDN SVG docs <- note the second drawn rect element

    0 讨论(0)
  • 2020-11-28 23:05

    As referenced in my answer to Applying rounded corners to paths/polygons, I have written a routine in javascript for generically rounding corners of SVG paths, with examples, here: http://plnkr.co/edit/kGnGGyoOCKil02k04snu.

    It will work independently from any stroke effects you may have. To use, include the rounding.js file from the Plnkr and call the function like so:

    roundPathCorners(pathString, radius, useFractionalRadius)
    

    The result will be the rounded path.

    The results look like this:

    SVG Path Rounding Examples

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