How to fill an image inside my svg circles in d3.js

后端 未结 2 1797
忘掉有多难
忘掉有多难 2021-02-10 04:31

This is my piece of code filling circles in my svg.

   var svgContainer = d3.select(\"body\").append(\"svg\")
                                 .attr(\"width\",          


        
2条回答
  •  遇见更好的自我
    2021-02-10 05:27

    Creating pattern from image uses too much of memory and using multiple images will create a serious performance issue. So to avoid that we can use clip-path over image.

    Like this:

    var config = {
      "avatar_size": 100
    }
    
    var body = d3.select("body");
    var svg = body.append("svg")
      .attr("width", 500)
      .attr("height", 500);
    
    var defs = svg.append('svg:defs');
    
    data = [{
      posx: 100,
      posy: 100,
      img: "https://cdn4.iconfinder.com/data/icons/seo-and-data/500/pencil-gear-128.png",
    }, {
      posx: 200,
      posy: 200,
      img: "https://cdn4.iconfinder.com/data/icons/seo-and-data/500/gear-clock-128.png"
    }, {
      posx: 300,
      posy: 300,
      img: "https://cdn4.iconfinder.com/data/icons/seo-and-data/500/magnifier-data-128.png"
    }];
    
    
    svg .append('clipPath')
       .attr('id','clipObj')  
            .append('circle')
             .attr('cx',config.avatar_size/2)
              .attr('cy',config.avatar_size/2)
             .attr('r',config.avatar_size/2);
    
    data.forEach(function(d,i){
      svg.append('image')
         .attr('xlink:href',d.img)
         .attr('width',config.avatar_size)
         .attr('height',config.avatar_size)
     .attr('transform','translate('+parseInt(d.posx+config.avatar_size/2)+','+parseInt(d.posy+config.avatar_size/2)+')')
         .attr('clip-path','url(#clipObj)');
    });
    

    Also we can easily replace the clipping area with new one as we want. Here is the link of Code pen : http://codepen.io/anon/pen/VagxKp?editors=0010

提交回复
热议问题