Трансформации и переходы

Последнее обновление: 1.11.2015

Трансформации

Трансформации являются одним из ключевых аспектов работы с D3.js. Выделяются три типа трансформаций:

  • Масштабирование

  • Перемещение

  • Вращение

Все трансформации задаются для элемента с помощью атрибута transform. Для перемещения этот атрибут принимает значение translate(x, y):

var width = 400,
    height = 400;
			
var svg = d3.select("body").append("svg");

svg.attr("height", height)
    .attr("width", width);   
// оригинальный круг	
svg.append("circle")
	.style("fill", "none")
	.style("stroke", "steelblue")
	.style("stroke-width", "2")
    .attr("cx", 100)
    .attr("cy", 100)
    .attr("r", 50);
// круг с перемещением
svg.append("circle")
	.style("fill", "none")
	.style("stroke", "red")
	.style("stroke-width", "2")
	.attr("transform", "translate(50, 40)")
    .attr("cx", 100)
    .attr("cy", 100)
    .attr("r", 50);
Перемещение в D3.js

Для масштабирования используется значение scale(s) (увеличение в s раз) или scale(sx, sy) (увеличение по горизонтали в sx раз и по вертикали в sy раз):

  
// оригинальный прямоугольник	
svg.append("rect")
	.style("fill", "none")
	.style("stroke", "steelblue")
	.style("stroke-width", "2")
    .attr("x", 80)
    .attr("y", 50)
	.attr('width', 50)
	.attr('height', 50);
// прямоугольник с увеличением в два раза
svg.append("rect")
	.style("fill", "none")
	.style("stroke", "red")
	.style("stroke-width", "2")
	.attr("transform", "scale(2)")
    .attr("x", 80)
    .attr("y", 50)
	.attr('width', 50)
	.attr('height', 50);
Масштабирование в D3.js

Для вращения фигур применяется значение rotate(degree,x,y), где первый параметр - угол в градусах поворота по часовой стрелке, а x и y - координаты центра точки поворота:

  
// оригинальный прямоугольник	
svg.append("rect")
	.style("fill", "none")
	.style("stroke", "steelblue")
	.style("stroke-width", "2")
    .attr("x", 80)
    .attr("y", 50)
	.attr('width', 50)
	.attr('height', 50);
// прямоугольник с поворотом на 45 градусов с центром (75, 75)
svg.append("rect")
	.style("fill", "none")
	.style("stroke", "red")
	.style("stroke-width", "2")
	.attr("transform", "rotate(45, 75, 75)")
    .attr("x", 80)
    .attr("y", 50)
	.attr('width', 50)
	.attr('height', 50);
Вращение в D3.js

При необходимости мы можем применять все или несколько трансформаций сразу:

  
svg.append("rect")
	.style("fill", "none")
	.style("stroke", "red")
	.style("stroke-width", "2")
	.attr("transform", "translate(0, -30),scale(1, 2),rotate(45, 105, 75)")
    .attr("x", 80)
    .attr("y", 50)
	.attr('width', 50)
	.attr('height', 50);
Трансформации в D3.js

Переходы

Переходы (transitions) в D3.js подразумевают динамическое изменение свойств объекта в течение некоторого промежутка времени, то есть его анимацию. Для создания перехода используют тройку методов transition(), duration(duration) (устанавливает время перехода) и delay(duration) (устанавливает период задержки перед выполнением перехода). Параметр duration в последних двух методах задает время в миллисекундах:

var svg = d3.select("body").append("svg")
					.attr("height", 400)
					.attr("width", 400);    
svg.append("rect")
	.style("fill", "black")
	.style("stroke", "red")
	.style("stroke-width", "2")
    .attr("x", 80)
    .attr("y", 50)
	.attr('width', 50)
	.attr('height', 50)
	.transition()
	.duration(5000)
	.delay(200)
	.style("fill", "#ffffff")
	.style("stroke", "steelblue")
	.attr('width', 200)
	.attr('height', 180);

В данном случае устанавливается время анимации в 5000 миллисекунд и задержка в 200 миллисекунд. Если необходимость в функции delay() отсутствует, то мы ее можем опустить.

Далее определяется ряд стилей и атрибутов и их конченые значения. То есть в данном случае D3 будет осуществлять переход от цвета "black" к цвету "#ffffff". Библиотека автоматически рассчитает промежуточные показатели, которые будет принимать стилевое свойство fill между значениями "black" и "#ffffff".

То же самое относится к свойству "stroke" и атрибутам ширины и высоты.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850