亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

d3 中的 Transition.each 不插入屬性

d3 中的 Transition.each 不插入屬性

慕婉清6462132 2023-03-03 15:56:07
我在這里的理解中遺漏了一些東西,而不是我認為的錯誤......在 d3 中,我試圖在轉換中更新多個屬性值。使用多個transition.attr聲明效果很好。但我想.each在現實世界中使用我有一個很大的計算我不想做兩次或更多......我試過使用transition.each但屬性值不插值。是d3.select在里面嗎each?我試過了d3.active,但那沒有做任何事情。(提供了一個https://github.com/d3/d3-selection-multi庫,它.attrs在 v5 之前運行良好,但不適用于新的 v6 ...)請參閱https://jsfiddle.net/f679a4yj/3/ - 我可以做些什么來獲得動畫但是通過.each,我沒有得到什么?
查看完整描述

1 回答

?
catspeake

TA貢獻1111條經驗 獲得超0個贊

這里的問題是關于transition.each: 你不能用它來包裝幾個transition.attr或transition.style方法的誤解。事實上,它僅用于對該轉換中的每個元素調用任意代碼,就像selection.each.


因此,當你做...


.each (function (d, i) {

    // complicated stuff with d I don't want to do twice

    d3.select(this)

       .attr("x", ((zz+i)%4) *20)

       .attr("y", ((zz+i)%4) *40)

})

...您只需更改 DOM 元素中的屬性,該元素將立即跳轉到新的x位置y,如預期的那樣。換句話說,d3.select(this).attr(...您的代碼中的那個是一個selection.attr,而不是一個transition.attr.


您有多種選擇(用于避免冗余的復雜計算)。如果你想堅持使用transition.each,你可以用它來創建一個新的局部變量,或者一個新的屬性。為此,我們需要將對象作為數組中的數據元素,然后我們照常使用transition.attr:


.each(function(d, i) {

  d.complexValue = ((zz + i) % 4) * 20;

})

.attr("x", function(d) {

  return d.complexValue;

})

//etc...

這是一個演示:

const sel = d3.select("svg")

  .selectAll(null)

  .data([{

    color: "red"

  }, {

    color: "blue"

  }, {

    color: "green"

  }, {

    color: "yellow"

  }])

  .enter()

  .append("rect")

  .attr("width", 30)

  .attr("height", 30)

  .attr("x", function(d, i) {

    return i * 20;

  })

  .attr("y", function(d, i) {

    return i * 40;

  })

  .style("fill", function(d) {

    return d.color;

  });


let zz = 0;


function each() {

  zz++;

  d3.selectAll("rect")

    .transition()

    .duration(1000)

    .each(function(d, i) {

      d.complexValue = ((zz + i) % 4) * 20;

    })

    .attr("x", function(d) {

      return d.complexValue;

    })

    .attr("y", function(d) {

      return d.complexValue;

    })

};

<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>

<div id="demo"><svg width="360px"></svg></div>

<button onclick="each()">In an Each</button>


查看完整回答
反對 回復 2023-03-03
  • 1 回答
  • 0 關注
  • 93 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號