Skip to content

Instantly share code, notes, and snippets.

Last active July 22, 2018 01:18
What would you like to do?
Transform Transitions
license: gpl-3.0

D3 2.5.0 supports matrix decomposition for animating 2D transforms. Any SVG transform attribute is decomposed into a canonical representation of translate, rotate, scale and skew. This allows two arbitrary transforms of different types to be transitioned smoothly—say from a simple translate to a scale plus rotate. These features are supported automatically by your browser for CSS3 transitions, but now you can have them in JavaScript for SVG, too!

<!DOCTYPE html>
<meta charset="utf-8">
<title>Transform Transitions</title>
body {
margin: 0;
rect {
stroke: #fff;
stroke-width: .1px;
<script src="//"></script>
var w = 960,
h = 500,
z = 20,
x = w / z,
y = h / z;
var svg ="body").append("svg")
.attr("width", w)
.attr("height", h);
.data(d3.range(x * y))
.attr("transform", translate)
.attr("width", z)
.attr("height", z)
.style("fill", function(d) { return d3.hsl(d % x / x * 360, 1, Math.floor(d / x) / y); })
.on("mouseover", mouseover);
function translate(d) {
return "translate(" + (d % x) * z + "," + Math.floor(d / x) * z + ")";
function mouseover(d) {
.style("pointer-events", "none")
.attr("transform", "translate(480,480)scale(23)rotate(180)")
.attr("transform", "translate(240,240)scale(0)")
.style("fill-opacity", 0)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment