我的应用程序中有d3 v5代码,可使用数字转换div的高度。从今天的v5.8版本开始,这不再起作用:
d3.select("div").transition().style("height", 100)
如果我将其更改为...
d3.select("div").transition().style("height", "100px")
它再次工作。转换前的原始值是... style(“ height”,0),它以html内联样式的高度显示为“ 0px”。
今天的版本中发生了这种变化吗?是否打算进行此更改?在d3中使用像这样的数字是否被认为是不好的做法?谢谢。
编辑
我在下面添加了一个示例。 div1的高度不会过渡,因为它使用的是数字而不是带有px单位的字符串。
d3.select("#div1").transition().style("height", 100)
d3.select("#div2").transition().style("height", "100px")
<div id="div1" style="background-color:purple;height=10px;width=100px"></div>
<div id="div2" style="background-color:red;height=10px;width=100px"></div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.8.0/d3.min.js"></script>
EDIT2:我在下面的v5.7中添加了一个正在运行的示例,您可以在其中看到两个转换都有效。我已经简化了我的原始示例。我必须在此示例中添加css以复制我在实际应用程序中看到的内容
。现在看来,它与inline-flex风格有关,我不确定为什么。
d3.select("#div1").transition().style("height", 100)
d3.select("#div2").transition().style("height", "100px")
#parent-div {
width:100px;
display:inline-flex;
}
.sub-div {
width: 100%;
}
<div id="parent-div" style="position:absolute;top:10px;width:100px">
<div id="div1" class="sub-div" style="background-color:purple;height=0px"></div>
<div id="div2" class="sub-div" style="background-color:red;height=10px"> </div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
最佳答案
是的,新的D3 v5.8确实具有新的插值器。如果您查看今天(撰写本文时,2019年1月29日)发布的D3 v5.8的releases notes,
在某些非字符串情况下,修复了transition.style和transition.attr中的插值。
在这里,可以使用v5.8轻松地说明该问题,我们尝试在其中尝试将"20px"
插入到100
(即,字符串到数字):
const svg = d3.select("svg");
const rect = svg.append("rect")
.attr("width", "20px")
.attr("height", "20px")
rect.transition()
.duration(10)
.attr("width", 100)
.on("end", function() {
console.log(rect.attr("width"))
})
<script src="https://d3js.org/d3.v5.min.js"></script>
<svg></svg>
如您所见,您将得到一个
NaN
!注意,它不会在v5.7中发生:
const svg = d3.select("svg");
const rect = svg.append("rect")
.attr("width", "20px")
.attr("height", "20px")
rect.transition()
.duration(10)
.attr("width", 100)
.on("end", function() {
console.log(rect.attr("width"))
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<svg></svg>
无论如何,回答您的问题:
在d3中使用像这样的数字是否被认为是不好的做法?
是的,它是(我不得不承认我有时这样做),但这与D3不相关:如果您将
"20px"
(字符串)作为初始状态,则应该将"100px"
(字符串)作为最终状态。 ,而不是100
(一个数字)。这使插值更清晰,更不易出错。但是,这不是您的情况:您的数字处于初始状态和最终状态。在您的情况下,即使您使用数字(例如
0
)作为初始状态,getter也会以字符串形式获取"0px"
。最后,值得一提的是,您的特定示例在v5.7和v5.8上均不起作用,因此我建议您在问题中使用v5.7发布一个非常简单的工作示例。编辑
根据要求,您使用工作示例编辑了问题,对此表示感谢。
关于您的示例#1,它也不能与D3 v5.7一起使用,这就是我的观点(“您的特定示例在v5.7和v5.8上均不起作用”)。看看,没有紫色的div(两个高度均以
0px
开头):d3.select("#div1").transition().style("height", 100)
d3.select("#div2").transition().style("height", "100px")
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<div id="div1" style="background-color:purple;height:0px;width:100px"></div>
<div id="div2" style="background-color:red;height:0px;width:100px"></div>
我说过它也不能在D3 v5.7上使用,因为给我的印象是,在编写
style("height", 0)
之后,您以前已经使用D3设置了样式。但是,在第一个示例中,我们发现了一个问题:您以内联样式使用了
=
而不是:
(这似乎可以解释奇怪的行为,请继续阅读)。关于第二个示例,即使对D3 v5.7使用了正确的内联样式语法,也无法正常工作:
d3.select("#div1").transition().style("height", 100)
d3.select("#div2").transition().style("height", "100px")
#parent-div {
width:100px;
display:inline-flex;
}
.sub-div {
width: 100%;
}
<div id="parent-div" style="position:absolute;top:10px;width:100px">
<div id="div1" class="sub-div" style="background-color:purple;height:0px"></div>
<div id="div2" class="sub-div" style="background-color:red;height:10px"></div>
</div>
<script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
因此,这里发生的是
inline-flex
与不幸的内联样式的错误组合(即,未正确将高度设置为0px),这使紫色div扩展为父级。我们可以在下面的演示中看到这一点,在这里我仅转换了红色div:d3.select("#div2").transition().style("height", "100px")
#parent-div {
width:100px;
display:inline-flex;
}
.sub-div {
width: 100%;
}
<div id="parent-div" style="position:absolute;top:10px;width:100px">
<div id="div1" class="sub-div" style="background-color:purple;height=0px"></div>
<div id="div2" class="sub-div" style="background-color:red;height=10px"> </div>
</div>
<script src="https://d3js.org/d3.v5.min.js"></script>
关于javascript - 使用数字时,d3 v5.8是否释放样式中断?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54412479/