d3.js - 响应式 D3 图表

标签 d3.js responsive-design

我有这张 D3 图表 - 几乎是开箱即用的。有没有办法让它响应并使用宽度和高度变量、innerRadius 和outerRadius 的百分比?我正在开发一个响应式网站,需要根据屏幕尺寸/浏览器尺寸进行更改。

jsfiddle在这里:http://jsfiddle.net/BTfmH/1/

代码:

<!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>

最佳答案

您可以使用 SVG 元素上的 viewBoxpreserveAspectRatio 属性的组合来调整图表大小。

请参阅此 jsfiddle 了解完整示例: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 + ")");

使用此方法,您甚至不需要 resize 处理程序。

关于d3.js - 响应式 D3 图表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17626555/

相关文章:

javascript - 我可以使用 d3.scales 均匀分布不同大小的圆吗

html - 流体图像 : How to set width and height?

涵盖大多数移动设备的 CSS 媒体查询

html - 响应式网格,当达到最小宽度时, float 元素在另一个下方移动

css - Bootstrap 的奇怪行为

jquery - 寻找 d3.js 等价于 jQuery 操作符的列表

javascript - 在 D3 图形中为 svg 图像添加边框

javascript - 新 D3 API 中 '.orient()' 的替代项是什么?

javascript - 旋转 D3 SVG 以对齐特定 Angular

jquery - bootstrap visible-*-block 和 jquery toggle() 冲突 - 试图隐藏/显示切换一个 div