【问题标题】:D3 Adding hyperlinks to objects?D3 向对象添加超链接?
【发布时间】:2021-07-10 05:53:53
【问题描述】:

我正在尝试处理 D3 图表,它将代表我网站的菜单,我尝试在此处按照其他指南添加超链接,但没有一个有效,每个对象都有不同的 URL 指向:主页、关于、联系方式等。 如果我添加超链接,我可以拖动对象吗?这意味着如果我按住单击它会被拖动如果我单击它打开 URL 的对象

var   w = 1000,
      h =  800,
      circleWidth = 5;


var palette = {
      "lightgray": "#05386B",
      "gray": "#FFFFFF",
      "mediumgray": "#FFFFFF",
      "blue": "#FFFFFF"
  }

var colors = d3.scale.ordinal() // D3 Version 4
.range(["#05386B", "#379683" , "#5CDB95"]);

var nodes = [
      { name: "Skills"},
      { name: "HTML5", target: [0], value: 58 },
      { name: "JavaScript", target: [0, 1], value: 65 },
      { name: "Scss", target: [0, 1, 2], value: 52 },
      { name: "JAVA", target: [0, 3], value: 48 },
      { name: "IOT", target: [0,3,4], value: 40 },
      { name: "", target: [0,3,4,5], value: 36 },
      { name: "jQuery", target: [0, 1, 2], value: 52 },
      { name: "RaspberryPi", target: [0, 1, 2, 8], value: 37 },
      { name: "", target: [0,1,2], value: 20 },
      { name: "Wordpress", target: [0,1,2,3,9], value: 67 },
      { name: "Git", target: [0,1,2,3,4,5,6,7,8,10], value: 68 },
      { name: "", target: [0,1,2,7,8 ], value: 16 },
      { name: "", target: [0,1,2,7,8], value: 25 },
      { name: "Linux", target: [0,1,2,3,4,5,6,7,8,9,10,11,12], value: 45 },
      { name: "", target: [0,1,2,7,8], value: 25 },
      { name: "Adobe Suite", target: [0,1,2,12], value: 57 },
      { name: "", target: [0,9,10], value: 20 },
      { name: "", target: [0,9,10], value: 37 },
];

var links = [];

for (var i = 0; i < nodes.length; i++){
      if (nodes[i].target !== undefined) {
            for ( var x = 0; x < nodes[i].target.length; x++ )
              links.push({
                  source: nodes[i],
                  target: nodes[nodes[i].target[x]]
              });
      };
};


var myChart = d3.select('body')
      .append("div")
        .classed("svg-container", true)

      .append('svg')
        .attr("preserveAspectRatio", "xMinYMin meet")
        .attr("viewBox", "0 0 1000 800")
        .classed("svg-content-responsive", true)


var force = d3.layout.force()
      .nodes(nodes)
      .links([])
      .gravity(0.1)
      .charge(-1000)
      .size([w,h]);

      var link = myChart.selectAll('line')
            .data(links).enter().append('line')
            .attr('stroke', palette.lightgray)
            .attr('strokewidth', '1');

      var node =  myChart.selectAll('circle')
            .data(nodes).enter()
            .append('g')
            .call(force.drag);


     node.append('circle')
            .attr('cx', function(d){return d.x; })
            .attr('cy', function(d){return d.y; })
            .attr('r', function(d,i){
                  console.log(d.value);
                  if ( i > 0 ) {
                        return circleWidth + d.value;
                  } else {
                        return circleWidth + 35;
                  }
            })
            .attr('fill', function(d,i){
                  if ( i > 0 ) {
                        return colors(i);
                  } else {
                        return '#fff';
                  }
            })
            .attr('strokewidth', function(d,i){
                  if ( i > 0 ) {
                        return '0';
                  } else {
                        return '2';
                  }
            })
            .attr('stroke', function(d,i){
                  if ( i > 0 ) {
                        return '';
                  } else {
                        return 'black';
                  }
            });


      force.on('tick', function(e){
            node.attr('transform', function(d, i){
              return 'translate(' + d.x + ','+ d.y + ')'
            })

          link
              .attr('x1', function(d){ return d.source.x; })
              .attr('y1', function(d){ return d.source.y; })
              .attr('x2', function(d){ return d.target.x; })
              .attr('y2', function(d){ return d.target.y; })
      });


      node.append('text')
            .text(function(d){ return d.name; })
            .attr('font-family', 'Raleway', 'Helvetica Neue, Helvetica')
            .attr('fill', function(d, i){
              console.log(d.value);
                  if ( i > 0 && d.value < 10 ) {
                        return palette.mediumgray;
                  } else if ( i > 0 && d.value >10 ) {
                        return palette.mediumgray;
                  } else {
                        return palette.blue;
                  }
            })
            .attr('text-anchor', function(d, i) {
                  return 'middle';
            })
            .attr('font-size', function(d, i){
                  if (i > 0) {
                        return '.8em';
                  } else {
                        return '.9em';
                  }
            })

force.start();
&lt;script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js"&gt;&lt;/script&gt;

【问题讨论】:

    标签: javascript d3.js


    【解决方案1】:

    您可以将a 元素添加到代表每个节点的g

    var node =  myChart.selectAll('circle')
        .data(nodes).enter()
        .append('g')
        .call(force.drag)
        .append("a")
        .attr("href",function(d) {
             // eg:
             return "myURL/"+d.name
        });
    

    然后继续将文本和圆圈附加到 node,它现在是 a 的父元素,在这种情况下,它的功能与 g 类似(您可以对其应用转换,所以您不需要需要修改tick函数):

    var   w = 1000,
          h =  800,
          circleWidth = 5;
    
    
    var palette = {
          "lightgray": "#05386B",
          "gray": "#FFFFFF",
          "mediumgray": "#FFFFFF",
          "blue": "#FFFFFF"
      }
    
    var colors = d3.scale.ordinal() // D3 Version 4
    .range(["#05386B", "#379683" , "#5CDB95"]);
    
    var nodes = [
          { name: "Skills"},
          { name: "HTML5", target: [0], value: 58 },
          { name: "JavaScript", target: [0, 1], value: 65 },
          { name: "Scss", target: [0, 1, 2], value: 52 },
          { name: "JAVA", target: [0, 3], value: 48 },
          { name: "IOT", target: [0,3,4], value: 40 },
          { name: "", target: [0,3,4,5], value: 36 },
          { name: "jQuery", target: [0, 1, 2], value: 52 },
          { name: "RaspberryPi", target: [0, 1, 2, 8], value: 37 },
          { name: "", target: [0,1,2], value: 20 },
          { name: "Wordpress", target: [0,1,2,3,9], value: 67 },
          { name: "Git", target: [0,1,2,3,4,5,6,7,8,10], value: 68 },
          { name: "", target: [0,1,2,7,8 ], value: 16 },
          { name: "", target: [0,1,2,7,8], value: 25 },
          { name: "Linux", target: [0,1,2,3,4,5,6,7,8,9,10,11,12], value: 45 },
          { name: "", target: [0,1,2,7,8], value: 25 },
          { name: "Adobe Suite", target: [0,1,2,12], value: 57 },
          { name: "", target: [0,9,10], value: 20 },
          { name: "", target: [0,9,10], value: 37 },
    ];
    
    var links = [];
    
    for (var i = 0; i < nodes.length; i++){
          if (nodes[i].target !== undefined) {
                for ( var x = 0; x < nodes[i].target.length; x++ )
                  links.push({
                      source: nodes[i],
                      target: nodes[nodes[i].target[x]]
                  });
          };
    };
    
    
    var myChart = d3.select('body')
          .append("div")
            .classed("svg-container", true)
    
          .append('svg')
            .attr("preserveAspectRatio", "xMinYMin meet")
            .attr("viewBox", "0 0 1000 800")
            .classed("svg-content-responsive", true)
    
    
    var force = d3.layout.force()
          .nodes(nodes)
          .links([])
          .gravity(0.1)
          .charge(-1000)
          .size([w,h]);
    
          var link = myChart.selectAll('line')
                .data(links).enter().append('line')
                .attr('stroke', palette.lightgray)
                .attr('strokewidth', '1');
    
          var node =  myChart.selectAll('circle')
                .data(nodes).enter()
                .append('g')
                .call(force.drag)
                .append("a")
                .attr("href","https://google.com");
    
    
         node.append('circle')
                .attr('cx', function(d){return d.x; })
                .attr('cy', function(d){return d.y; })
                .attr('r', function(d,i){
                   
                      if ( i > 0 ) {
                            return circleWidth + d.value;
                      } else {
                            return circleWidth + 35;
                      }
                })
                .attr('fill', function(d,i){
                      if ( i > 0 ) {
                            return colors(i);
                      } else {
                            return '#fff';
                      }
                })
                .attr('strokewidth', function(d,i){
                      if ( i > 0 ) {
                            return '0';
                      } else {
                            return '2';
                      }
                })
                .attr('stroke', function(d,i){
                      if ( i > 0 ) {
                            return '';
                      } else {
                            return 'black';
                      }
                })
    
    
          force.on('tick', function(e){
                node.attr('transform', function(d, i){
                  return 'translate(' + d.x + ','+ d.y + ')'
                })
    
              link
                  .attr('x1', function(d){ return d.source.x; })
                  .attr('y1', function(d){ return d.source.y; })
                  .attr('x2', function(d){ return d.target.x; })
                  .attr('y2', function(d){ return d.target.y; })
          });
    
    
          node.append('text')
                .text(function(d){ return d.name; })
                .attr('font-family', 'Raleway', 'Helvetica Neue, Helvetica')
                .attr('fill', function(d, i){
           
                      if ( i > 0 && d.value < 10 ) {
                            return palette.mediumgray;
                      } else if ( i > 0 && d.value >10 ) {
                            return palette.mediumgray;
                      } else {
                            return palette.blue;
                      }
                })
                .attr('text-anchor', function(d, i) {
                      return 'middle';
                })
                .attr('font-size', function(d, i){
                      if (i > 0) {
                            return '.8em';
                      } else {
                            return '.9em';
                      }
                })
    
    force.start();
    &lt;script src="https://cdnjs.cloudflare.com/ajax/libs/d3/3.5.17/d3.min.js"&gt;&lt;/script&gt;

    足够短的拖动可能会触发单击并打开链接 - 在 d3v4+ 中,我相信您可以更好地控制该分界线,尽管我不记得 d3v3 是如何处理这个的(毕竟我们现在已经达到 v7) .

    您甚至可以完全取消 g 并输入 a 元素 - 但我将干预保持在最低限度

    【讨论】:

      猜你喜欢
      • 2012-10-17
      • 2011-01-28
      • 1970-01-01
      • 2020-05-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-08
      • 1970-01-01
      相关资源
      最近更新 更多