我正在try 创建一个动画,其中网格元素以从左到右、从上到下的顺序出现.所以顺序是:A_(1,1)A_(1,2),...A_(1,d)...A_(n,d) .

我当前的代码显示网格中一列中的所有元素,后面是延迟,然后是第二列中的所有元素,延迟,依此类推.我确信这是因为第56行中的索引元素控制每个元素的时间延迟,每行都会重置.我想知道是否有办法解决这个问题,比如用一个变量来跟踪d的列数.

var data = [[0,1],[2,3]];

function myMatrix2(data) {

    var margin = {top: 50, right: 100, bottom: 50, left: 100},
        width = 250,
        height = 250;

    const svg = d3
        .select('.grid2')
        .append('svg')
        .attr("width", width + margin.left + margin.right)
        .attr("height", height + margin.top + margin.bottom)
        .append("g")
        .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

    numrows = data.length;
    numcols = data[0].length;

    rw=width/numrows;
    hw=height/numcols;

    var x = d3.scaleOrdinal()
        .domain(d3.range(numcols))
        .range(d3.range(0,width,width/numcols));

    var y = d3.scaleOrdinal()
        .domain(d3.range(numrows))
        .range(d3.range(0,height,height/numrows));

    var row = svg.selectAll(".row")
        .data(data)
        .enter().append("g")
        .attr("class", "row")
        .attr("transform", function(d, i) {return "translate(0," + y(i) + ")"; });

    var cell = row.selectAll(".cell")
        .data(function(d) { return d; })
        .enter().append("g")
        .attr("class", "cell")
        .attr("transform", function(d, i) { return "translate(" + x(i) + ", 0)"; });

    cell.append('rect')
        .attr("width", rw)
        .attr("height", hw)
        .style("stroke", "black")
        .style("stroke-width", "2px")
        .style("fill", 'white')

    cell.append("text") //Add matrix elements
        .attr("dy", ".32em")
        .attr("x", rw/2 )
        .attr("y", hw/2 )
        .attr("text-anchor", "middle")
        .style("font-size","14px")
        .transition() //Delay starts here
        .delay(function(d,i) {console.log("D: "+d + " I: "+i); return i*3000;})
        .text(function(d) { return d; })
    return;
};

推荐答案

有几种方法可以做到这一点.我最喜欢的惯用D3方法之一是使用局部变量设置父行的索引...

local.set(this, i);

...然后检索本地设置延迟:

.delay(function(d, i) {
    const p = local.get(this);
    return i * 1000 + p * (1000 / numrows);
})

以下是您的3x3矩阵代码:

var data = [
  [0, 1, 4],
  [2, 3, 6],
  [7, 8, 9]
];
const local = d3.local();

myMatrix2(data);

function myMatrix2(data) {

  var margin = {
      top: 4,
      right: 10,
      bottom: 4,
      left: 10
    },
    width = 150,
    height = 150;

  const svg = d3
    .select('body')
    .append('svg')
    .attr("width", width + margin.left + margin.right)
    .attr("height", height + margin.top + margin.bottom)
    .append("g")
    .attr("transform", "translate(" + margin.left + "," + margin.top + ")");

  numrows = data.length;
  numcols = data[0].length;

  rw = width / numrows;
  hw = height / numcols;

  var x = d3.scaleOrdinal()
    .domain(d3.range(numcols))
    .range(d3.range(0, width, width / numcols));

  var y = d3.scaleOrdinal()
    .domain(d3.range(numrows))
    .range(d3.range(0, height, height / numrows));

  var row = svg.selectAll(".row")
    .data(data)
    .enter().append("g")
    .attr("class", "row")
    .attr("transform", function(d, i) {
      local.set(this, i);
      return "translate(0," + y(i) + ")";
    });

  var cell = row.selectAll(".cell")
    .data(function(d) {
      return d;
    })
    .enter().append("g")
    .attr("class", "cell")
    .attr("transform", function(d, i) {
      return "translate(" + x(i) + ", 0)";
    });

  cell.append('rect')
    .attr("width", rw)
    .attr("height", hw)
    .style("stroke", "black")
    .style("stroke-width", "2px")
    .style("fill", 'white')

  cell.append("text") //Add matrix elements
    .attr("dy", ".32em")
    .attr("x", rw / 2)
    .attr("y", hw / 2)
    .attr("text-anchor", "middle")
    .style("font-size", "14px")
    .transition() //Delay starts here
    .delay(function(d, i) {
      const p = local.get(this);
      return i * 1000 + p * (1000 / numrows);
    })
    .text(function(d) {
      return d;
    })
  return;
};
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

Javascript相关问答推荐

如何使用React渲染器放置根dis?

如何使用JavaScript用等效的功能性HTML替换标记URL格式?

TypScript界面中的Infer React子props

Bootstrap动态选项卡在切换选项卡后保持活动状态,导致元素堆叠

如何解决CORS政策的问题

如何粗体匹配的字母时输入搜索框使用javascript?

当运行d3示例代码时,没有显示任何内容

我的服务工作器没有连接到我的Chrome扩展中的内容脚本.我该怎么解决这个问题?

VUE 3捕获错误并呈现另一个组件

环境值在.js文件/Next.js中不起作用

NG/Express API路由处理程序停止工作

在css中放置所需 colored颜色 以填充图像的透明区域

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

按什么顺序接收`storage`事件?

使用Document.Evaluate() Select 一个包含撇号的HTML元素

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

有没有一种直接的方法可以深度嵌套在一个JavaScript对象中?

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

在Java脚本中构建接口的对象

JavaScript:多个图像错误处理程序