假设我有一个构建960 500 svg图形的直方图脚本.我该如何使其具有响应性,从而调整图形的宽度和高度是动态的?

<script> 

var n = 10000, // number of trials
    m = 10,    // number of random variables
    data = [];

// Generate an Irwin-Hall distribution.
for (var i = 0; i < n; i++) {
  for (var s = 0, j = 0; j < m; j++) {
    s += Math.random();
  }
  data.push(s);
}

var histogram = d3.layout.histogram()
    (data);

var width = 960,
    height = 500;

var x = d3.scale.ordinal()
    .domain(histogram.map(function(d) { return d.x; }))
    .rangeRoundBands([0, width]);

var y = d3.scale.linear()
    .domain([0, d3.max(histogram.map(function(d) { return d.y; }))])
    .range([0, height]);

var svg = d3.select("body").append("svg")
    .attr("width", width)
    .attr("height", height);

svg.selectAll("rect")
    .data(histogram)
  .enter().append("rect")
    .attr("width", x.rangeBand())
    .attr("x", function(d) { return x(d.x); })
    .attr("y", function(d) { return height - y(d.y); })
    .attr("height", function(d) { return y(d.y); });

svg.append("line")
    .attr("x1", 0)
    .attr("x2", width)
    .attr("y1", height)
    .attr("y2", height);

</script> 

完整示例如下:

推荐答案

还有一种方法不需要重新绘制图形,它涉及修改<svg>元素上的viewBoxpreserveAspectRatio属性:

<svg id="chart" viewBox="0 0 960 500"
  preserveAspectRatio="xMidYMid meet">
</svg>

Update 11/24/15:大多数现代浏览器可以从viewBox中删除infer the aspect ratio个SVG元素,因此您可能不需要保持图表的最新大小.如果需要支持较旧的浏览器,可以在窗口调整大小时调整元素的大小,如下所示:

var aspect = width / height,
    chart = d3.select('#chart');
d3.select(window)
  .on("resize", function() {
    var targetWidth = chart.node().getBoundingClientRect().width;
    chart.attr("width", targetWidth);
    chart.attr("height", targetWidth / aspect);
  });

svg内容将自动zoom .您可以看到这样一个工作示例(经过一些修改)here:只需调整窗口或右下角窗格的大小,就可以看到它的react .

Javascript相关问答推荐

创建私有JS出口

如何通过onClick为一组按钮分配功能;

vscode扩展-webView Panel按钮不起任何作用

togglePopover()不打开但不关闭原生HTML popover'

为什么我的列表直到下一次提交才更新值/onChange

WebGL 2.0无符号整数输入变量

Html文件和客户端存储的相关问题,有没有可能?

在执行异步导入之前判断模块是否已导入()

如何在coCos2d-x中更正此错误

我在Django中的视图中遇到多值键错误

为什么JPG图像不能在VITE中导入以进行react ?

传递方法VS泛型对象VS事件特定对象

第一项杀死下一项,直到数组长度在javascript中等于1

Next.js中的服务器端组件列表筛选

背景动画让网站摇摇欲坠

通过跳过某些元素的对象进行映射

重新呈现-react -筛选数据过多

如何在FiRestore中的事务中使用getCountFromServer

FindByIdAndUpdate在嵌套对象中创建_id

在HTML5画布上下文中使用putImageData时,重载解析失败