graphique D3 réactif

J'ai ce tableau D3-à peu près hors de la boîte. Existe-t-il un moyen de le rendre réactif et d'utiliser des pourcentages pour les variables de largeur et de hauteur, innerRadius et ouerradius? Je travaille sur un site réactif et j'en ai besoin pour changer en fonction de la taille de l'écran/de la taille du navigateur.

Jsfiddle ici: http://jsfiddle.net/BTfmH/1/

Code:

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<style type="text/css">
html,
body {
  margin:0;
  padding:0;
  width:100%;
  height:100%;
}

.chart-container {
/*  width:50%;
  height:50%;*/
}
</style>
<body>
<script src="http://d3js.org/d3.v3.min.js"></script>
<script>
  var width = 350,
      height = 350,
      τ = 2 * Math.PI;

  var arc = d3.svg.arc()
      .innerRadius(100)
      .outerRadius(135)
      .startAngle(0);

var svg = d3.select("body").append("svg")
      .attr("width", width)
      .attr("height", height)
    .append("g")
      .attr("transform", "translate(" + width / 2 + "," + height / 2 + ")")

  var background = svg.append("path")
      .datum({endAngle: τ})
      .style("fill", "green")
      .attr("d", arc);

  var foreground = svg.append("path")
    .datum({endAngle: .127 * τ})
      .style("fill", "grey")
      .attr("d", arc);

setInterval(function() {
  foreground.transition()
      .duration(750)
      .call(arcTween, Math.random() * τ);
}, 1500);

  function arcTween(transition, newAngle) {

    transition.attrTween("d", function(d) {

      var interpolate = d3.interpolate(d.endAngle, newAngle);

      return function(t) {

        d.endAngle = interpolate(t);

        return arc(d);
      };
    });
}
</script>
48
demandé sur TechyDude 2013-07-13 07:01:10

2 réponses

Vous pouvez redimensionner le graphique en utilisant une combinaison d'attributs viewBox et preserveAspectRatio sur L'élément SVG.

Voir ce jsfiddle pour l'exemple complet: http://jsfiddle.net/BTfmH/12/

var svg = d3.select('.chart-container').append("svg")
    .attr("width", '100%')
    .attr("height", '100%')
    .attr('viewBox','0 0 '+Math.min(width,height)+' '+Math.min(width,height))
    .attr('preserveAspectRatio','xMinYMin')
    .append("g")
    .attr("transform", "translate(" + Math.min(width,height) / 2 + "," + Math.min(width,height) / 2 + ")");

Vous n'aurez même pas besoin d'un gestionnaire resize avec cette méthode.

115
répondu Sam Sehnert 2013-10-17 11:39:13

Vous pouvez utiliser window.innerWidth et window.innerHeight pour obtenir les dimensions de l'écran et configurer votre graphique en conséquence, par exemple

var width = window.innerWidth,
    height = window.innerHeight,
    innerRadius = Math.min(width,height)/3,
    outerRadius = innerRadius + 30;
6
répondu Lars Kotthoff 2013-07-13 14:26:35