diff --git a/src/transition/index.js b/src/transition/index.js
index 355be71..81e7747 100644
--- a/src/transition/index.js
+++ b/src/transition/index.js
@@ -43,6 +43,8 @@ Transition.prototype = transition.prototype = {
constructor: Transition,
select: transition_select,
selectAll: transition_selectAll,
+ selectChild: selection_prototype.selectChild,
+ selectChildren: selection_prototype.selectChildren,
filter: transition_filter,
merge: transition_merge,
selection: transition_selection,
diff --git a/test/transition/selectChild-test.js b/test/transition/selectChild-test.js
new file mode 100644
index 0000000..ed197b6
--- /dev/null
+++ b/test/transition/selectChild-test.js
@@ -0,0 +1,20 @@
+import assert from "assert";
+import {selectAll} from "d3-selection";
+import {transition} from "../../src/index.js";
+import it from "../jsdom.js";
+
+it("transition.selectChild(selector) selects the child matching the specified selector, then derives a transition", "
", () => {
+ const one = document.querySelector("#one");
+ const two = document.querySelector("#two");
+ const t1 = selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; });
+ const t2 = t1.selectChild("child");
+ assert.strictEqual(t2 instanceof transition, true);
+ assert.deepStrictEqual(t2._groups, [[one.firstChild, two.firstChild]]);
+ assert.strictEqual(t2._parents, t1._parents);
+ assert.strictEqual(t2._name, t1._name);
+ assert.strictEqual(t2._id, t1._id);
+ assert.strictEqual(one.firstChild.__data__, 1);
+ assert.strictEqual(two.firstChild.__data__, 2);
+ assert.strictEqual(one.firstChild.__transition[t1._id].delay, 10);
+ assert.strictEqual(two.firstChild.__transition[t1._id].delay, 20);
+});
diff --git a/test/transition/selectChildren-test.js b/test/transition/selectChildren-test.js
new file mode 100644
index 0000000..4ade610
--- /dev/null
+++ b/test/transition/selectChildren-test.js
@@ -0,0 +1,20 @@
+import assert from "assert";
+import {selectAll} from "d3-selection";
+import {transition} from "../../src/index.js";
+import it from "../jsdom.js";
+
+it("transition.selectChildren(selector) selects the children matching the specified selector, then derives a transition", "
", () => {
+ const one = document.querySelector("#one");
+ const two = document.querySelector("#two");
+ const t1 = selectAll([one, two]).data([1, 2]).transition().delay(function(d) { return d * 10; });
+ const t2 = t1.selectChildren("child");
+ assert.strictEqual(t2 instanceof transition, true);
+ assert.deepStrictEqual(t2._groups.map(group => Array.from(group)), [[one.firstChild], [two.firstChild]]);
+ assert.deepStrictEqual(t2._parents, [one, two]);
+ assert.strictEqual(t2._name, t1._name);
+ assert.strictEqual(t2._id, t1._id);
+ assert.strictEqual("__data__" in one.firstChild, false);
+ assert.strictEqual("__data__" in two.firstChild, false);
+ assert.strictEqual(one.firstChild.__transition[t1._id].delay, 10);
+ assert.strictEqual(two.firstChild.__transition[t1._id].delay, 20);
+});