Setting rounded corners for svg:image

前端 未结 3 809
广开言路
广开言路 2020-11-30 11:28

I was trying to make rounded corners for s svg:image (image embedded in SVG) with d3.js. I can\'t find out how to properly style the image, because according to W3C spec I s

相关标签:
3条回答
  • 2020-11-30 12:11

    Another, easy alternative:

    Wrap an html <img> tag in a <foreignObject> tag. This allows you to use normal html styling:

    <foreignObject x='0' y='0' width='100px' height='100px'>
      <img
        width='100px'
        height='100px'
        src={'path/to/image.png'}
        style={{ borderRadius: '50%' }}
      />
    </foreignObject>
    
    0 讨论(0)
  • 2020-11-30 12:22

    For those just interested in making rounded avatars, here goes an example using d3 v4. Notice that you need to apply the clipping while the image is at (0,0), so you need to translate() the image to where you want it.

    import { select } from 'd3-selection';
    
    const AVATAR_WIDTH = 80;
    const avatarRadius = AVATAR_WIDTH / 2;
    const svg = select('.my-container');
    const defs = this.svg.append("defs");
    defs.append("clipPath")
      .attr("id", "avatar-clip")
      .append("circle")
      .attr("cx", avatarRadius)
      .attr("cy", avatarRadius)
      .attr("r", avatarRadius)
    svg.append("image")
      .attr("x", 0)
      .attr("y", 0)
      .attr("width", AVATAR_WIDTH)
      .attr("height", AVATAR_WIDTH)
      .attr("xlink:href", myAvatarUrl)
      .attr("clip-path", "url(#avatar-clip)")
      .attr("transform", "translate(posx, posy)")
      .append('My username')
    
    0 讨论(0)
  • 2020-11-30 12:24

    'border-radius' doesn't apply to svg:image elements (yet anyway). A workaround would be to create a rect with rounded corners, and use a clip-path.

    An example.

    The relevant part of the source:

    <defs>
        <rect id="rect" x="25%" y="25%" width="50%" height="50%" rx="15"/>
        <clipPath id="clip">
          <use xlink:href="#rect"/>
        </clipPath>
      </defs>
    
      <use xlink:href="#rect" stroke-width="2" stroke="black"/>
      <image xlink:href="boston.jpg" width="100%" height="100%" clip-path="url(#clip)"/>
    

    It's also possible to create several rect elements instead of using <use>.

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