Skip to content

Commit 1c88fc2

Browse files
committed
Allow submillisecond transition timing.
Although submillisecond timing probably isn’t important for a single transition, error can accumulate over time with chained transitions, so it’s important to allow submillisecond timing for long-running looped transitions.
1 parent 1816561 commit 1c88fc2

6 files changed

Lines changed: 30 additions & 28 deletions

File tree

d3.js

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7777,16 +7777,16 @@ d3 = function() {
77777777
d3_transitionPrototype.delay = function(value) {
77787778
var id = this.id;
77797779
return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
7780-
node.__transition__[id].delay = value.call(node, node.__data__, i, j) | 0;
7781-
} : (value |= 0, function(node) {
7780+
node.__transition__[id].delay = +value.call(node, node.__data__, i, j);
7781+
} : (value = +value, function(node) {
77827782
node.__transition__[id].delay = value;
77837783
}));
77847784
};
77857785
d3_transitionPrototype.duration = function(value) {
77867786
var id = this.id;
77877787
return d3_selection_each(this, typeof value === "function" ? function(node, i, j) {
7788-
node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j) | 0);
7789-
} : (value = Math.max(1, value | 0), function(node) {
7788+
node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j));
7789+
} : (value = Math.max(1, value), function(node) {
77907790
node.__transition__[id].duration = value;
77917791
}));
77927792
};

d3.min.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/transition/delay.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ import "transition";
44
d3_transitionPrototype.delay = function(value) {
55
var id = this.id;
66
return d3_selection_each(this, typeof value === "function"
7-
? function(node, i, j) { node.__transition__[id].delay = value.call(node, node.__data__, i, j) | 0; }
8-
: (value |= 0, function(node) { node.__transition__[id].delay = value; }));
7+
? function(node, i, j) { node.__transition__[id].delay = +value.call(node, node.__data__, i, j); }
8+
: (value = +value, function(node) { node.__transition__[id].delay = value; }));
99
};

src/transition/duration.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ import "transition";
44
d3_transitionPrototype.duration = function(value) {
55
var id = this.id;
66
return d3_selection_each(this, typeof value === "function"
7-
? function(node, i, j) { node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j) | 0); }
8-
: (value = Math.max(1, value | 0), function(node) { node.__transition__[id].duration = value; }));
7+
? function(node, i, j) { node.__transition__[id].duration = Math.max(1, value.call(node, node.__data__, i, j)); }
8+
: (value = Math.max(1, value), function(node) { node.__transition__[id].duration = value; }));
99
};

test/transition/transition-test-delay.js

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,18 @@ module.exports = {
2525
assert.strictEqual(t[0][0].__transition__[t.id].delay, -250);
2626
assert.strictEqual(t[0][1].__transition__[t.id].delay, -250);
2727
},
28-
"NaN delays are treated as 0ms": function(selection) {
29-
var t = selection.transition().delay(NaN);
30-
assert.strictEqual(t[0][0].__transition__[t.id].delay, 0);
31-
assert.strictEqual(t[0][1].__transition__[t.id].delay, 0);
28+
"delay is coerced to a number": function(selection) {
29+
var t = selection.transition().delay("520");
30+
assert.strictEqual(t[0][0].__transition__[t.id].delay, 520);
31+
assert.strictEqual(t[0][1].__transition__[t.id].delay, 520);
3232
},
33-
"floating-point durations are floored to integers": function(selection) {
33+
"floating-point durations are not floored to integers": function(selection) {
3434
var t = selection.transition().delay(14.6);
35-
assert.strictEqual(t[0][0].__transition__[t.id].delay, 14);
36-
assert.strictEqual(t[0][1].__transition__[t.id].delay, 14);
35+
assert.strictEqual(t[0][0].__transition__[t.id].delay, 14.6);
36+
assert.strictEqual(t[0][1].__transition__[t.id].delay, 14.6);
3737
var t = selection.transition().delay("16.99");
38-
assert.strictEqual(t[0][0].__transition__[t.id].delay, 16);
39-
assert.strictEqual(t[0][1].__transition__[t.id].delay, 16);
38+
assert.strictEqual(t[0][0].__transition__[t.id].delay, 16.99);
39+
assert.strictEqual(t[0][1].__transition__[t.id].delay, 16.99);
4040
},
4141
"can specify delay as a function": function(selection) {
4242
var dd = [], ii = [], tt = [], t = selection.transition().delay(f);

test/transition/transition-test-duration.js

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,8 @@ module.exports = {
2020
assert.strictEqual(t[0][0].__transition__[t.id].duration, 50);
2121
assert.strictEqual(t[0][1].__transition__[t.id].duration, 50);
2222
},
23-
"NaN, zero, or negative durations are treated as 1ms": function(selection) {
24-
var t = selection.transition().duration(NaN);
25-
assert.strictEqual(t[0][0].__transition__[t.id].duration, 1);
26-
assert.strictEqual(t[0][1].__transition__[t.id].duration, 1);
27-
t.duration(0);
23+
"zero or negative durations are treated as 1ms": function(selection) {
24+
var t = selection.transition().duration(0);
2825
assert.strictEqual(t[0][0].__transition__[t.id].duration, 1);
2926
assert.strictEqual(t[0][1].__transition__[t.id].duration, 1);
3027
t.duration(-10);
@@ -34,13 +31,18 @@ module.exports = {
3431
assert.strictEqual(t[0][0].__transition__[t.id].duration, 1);
3532
assert.strictEqual(t[0][1].__transition__[t.id].duration, 1);
3633
},
37-
"floating-point durations are floored to integers": function(selection) {
34+
"duration is coerced to a number": function(selection) {
35+
var t = selection.transition().duration("520");
36+
assert.strictEqual(t[0][0].__transition__[t.id].duration, 520);
37+
assert.strictEqual(t[0][1].__transition__[t.id].duration, 520);
38+
},
39+
"floating-point durations are not floored to integers": function(selection) {
3840
var t = selection.transition().duration(14.6);
39-
assert.strictEqual(t[0][0].__transition__[t.id].duration, 14);
40-
assert.strictEqual(t[0][1].__transition__[t.id].duration, 14);
41+
assert.strictEqual(t[0][0].__transition__[t.id].duration, 14.6);
42+
assert.strictEqual(t[0][1].__transition__[t.id].duration, 14.6);
4143
var t = selection.transition().duration("16.99");
42-
assert.strictEqual(t[0][0].__transition__[t.id].duration, 16);
43-
assert.strictEqual(t[0][1].__transition__[t.id].duration, 16);
44+
assert.strictEqual(t[0][0].__transition__[t.id].duration, 16.99);
45+
assert.strictEqual(t[0][1].__transition__[t.id].duration, 16.99);
4446
},
4547
"can specify duration as a function": function(selection) {
4648
var dd = [], ii = [], tt = [], t = selection.transition().duration(f);

0 commit comments

Comments
 (0)