- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
出于某种原因,D3 没有在退出时转换 div 的宽度平滑。
在下面的 GIF 中,我在 2 个数据集之间切换,从 [20, 40]
到 [20]
预期的行为是蓝色 div 应该平滑收缩,但它卡住了。
我应该怎么做?
实例: http://jsbin.com/vikodufugo/1/edit?js,output
const render = (data) => {
const colors = ['red', 'blue', 'green', 'gold'];
const width = (data) => (d) => (d / d3.max(data)) * 100 + '%';
const selection = d3
.select('.chart')
.selectAll('div')
.data(data);
selection
.transition()
.duration(750)
.style('width', width(data))
selection
.enter()
.append('div')
.style('width', '0px')
.style('height', '100px')
.style('background-color', (d, i) => colors[i % colors.length])
.transition()
.duration(750)
.style('width', width(data))
selection
.exit()
.transition()
.duration(750)
// shouldn't it transition smoothly?
.style('width', '0px')
.remove()
}
...
onClick('#button-1', () => render([20, 40]))
onClick('#button-2', () => render([20]))
最佳答案
这里的问题只是过渡使用的插值。
D3 可以毫无问题地插入两个字符串,例如 300px
到 20px
。但是,在您的情况下,起始字符串具有 "%"
,而最终字符串具有 "px"
。 D3 无法对此进行插值,这是情有可原的:从 "%"
到 "px"
的转换是什么?
让我们在下面的片段中展示它。在这里,我使用 d3.interpolateString(a,b) ,其中:
Returns an interpolator between the two strings a and b. The string interpolator finds numbers embedded in a and b, where each number is of the form understood by JavaScript.
在第一个demo中,两个字符串都有"px"
:
var interpolator = d3.interpolateString("300px", "0px");
d3.range(0,1.1,.1).forEach(function(d){
console.log(interpolator(d))
});
<script src="https://d3js.org/d3.v4.min.js"></script>
如您所见,结果不错。
现在看看如果第一个字符串有 "%"
而第二个字符串有 "px"
会发生什么:
var interpolator = d3.interpolateString("100%", "0px");
d3.range(0,1.1,.1).forEach(function(d){
console.log(interpolator(d))
});
<script src="https://d3js.org/d3.v4.min.js"></script>
如您所见,在第一次插值时,"%"
被转换为 "px"
。这解释了您所看到的行为:div 突然从 "100%"
变为 "100px"
,然后从那里变为 "0px"
在过渡期间。
解决方案:
更改您的字符串以在退出选择中使用 %
:
selection
.exit()
.transition()
.duration(750)
.style('width', '0%')
//use % here -----^
.remove()
这里是你的代码有那个变化:
const render = (data) => {
const colors = ['red', 'blue', 'green', 'gold'];
const width = (data) => (d) => (d / d3.max(data)) * 100 + '%';
const selection = d3
.select('.chart')
.selectAll('div')
.data(data);
selection
.transition()
.duration(750)
.style('width', width(data))
selection
.enter()
.append('div')
.style('width', '0px')
.style('height', '100px')
.style('background-color', (d, i) => colors[i % colors.length])
.transition()
.duration(750)
.style('width', width(data))
selection
.exit()
.transition()
.duration(750)
// shouldn't it transition smoothly?
.style('width', '0%')
.remove()
}
const onClick = (selector, callback) => (
document.querySelector(selector).addEventListener('click', callback)
);
onClick('#button-1', () => render([20, 40]))
onClick('#button-2', () => render([20]))
render([20, 40]);
<script src="https://d3js.org/d3.v4.js"></script>
<div class="buttons">
<button id="button-1" value="0">Option 1</button>
<button id="button-2" value="1">Option 2</button>
</div>
<div class="chart"></div>
关于javascript - D3 过渡工作意外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47004437/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许在 Stack Overflow 上提出有关通用计算硬件和软件的问题。您可以编辑问题,使其成为
当我尝试在 db2 中创建表时,它抛出以下错误 $ db2 CREATE TABLE employee(emp_id INT NOT NULL, emp_name VARCHAR(100)) sh:
我有: while (i < l) { if (one === two) { continue; } i++; } 但是 JSLint 说: Problem at line 1 chara
所以我有这个代码: char inputs[10] = ""; int numInputs = 0; while (numInputs < 10){ char c; printf("E
var ninja = { name: 'Ninja', say: function () { return 'I am a ' + this.name; }
我收到一个我不明白的错误,请注意,我是编码新手,所以这可能是一个简单的错误。 #include using namespace std; int main() { //Initialise Fahr
我正在使用 javascript 和 react,由于某种原因,我收到了一个奇怪的 token 错误。 这是发生错误的代码: renderNavBar() { if (!this.us
Closed. This question is off-topic。它当前不接受答案。
由于某种我无法解释的原因,编译器正在输出一个错误,指出它发现了一个意外的#else 标记。 这发生在文件的开头: #if defined( _USING_MFC ) #include "stda
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
这个问题在这里已经有了答案: Difference between sh and Bash (11 个答案) 关闭 2 年前。 我正在编写一个简单的 bash 脚本,我在 XX `(' unexpe
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 此问题是由拼写错误或无法再重现的问题引起的。虽然类似的问题可能是 on-topic
我在 Windows 7 上编写了一个脚本,它不断给我一个错误“(此时出乎意料。”对于以下代码 if %vardns%=="NODNS" ( netsh interface ipv4 set ad
我正在尝试使用xmlstarlet(使用xpath)解析XML文件,但是出现语法错误,并且我不知道如何更正我的代码。 这是我的脚本: #!/bin/bash if [ $1=="author" ];
以下脚本旨在在目录中的所有文件上运行程序“senna”,并将每个文件的输出(保留输入文件名)写入另一个目录 for file in ./Data/in/*; do ./senna -iobta
我从 challengers.coffee 运行此代码,并收到错误 ActionView::Template::Error (SyntaxError: [stdin]:3:31:unexpected
我在 config.db.database; 行中有语法错误(意外的标记“.”)。这是我在文件中的代码 const config = require('../config/config') const
这一定很明显,但是我无法使它正常工作。我正在尝试传输应该用于构建$ classKey的对象,这反过来又导致删除所需的软件(amd64或i386)。好吧,这里的代码: $name = @("softwa
我正在使用 1.3.7 版学习 Grails,但我一直无缘无故地遇到以下语法错误: unexpected token: mapping @ line x, column y. 有一次,我通过运行“gr
我正在尝试找出这段Pascal代码的问题 function Factorial(n: integer): integer; begin if n = 0 then Result := 1
我是一名优秀的程序员,十分优秀!