Установка процента анимации при переходе элемента (вперед, назад) с помощью ползунка

#javascript #d3.js

#javascript #d3.js

Вопрос:

У меня есть ползунок, который имеет возможные значения между 0 to 1 с шагом 0.1

Например, если я переместу ползунок в начальную точку, анимация начнется с ( 0% ) , если я переместу значение slider на 0.5 ( 50% ), это означает, что оно начнется с 50% анимации до конца. Моя проблема в том, что если, например, я выбираю ползунок 50% , анимация начинается с 50% , но если я хочу вернуть его к другому проценту анимации, анимация не будет возвращена к выбранному проценту.

Как я могу это решить?

Это мой код:

 d3.select("#visualization").append('svg');
var vis = d3.select("svg").attr("width", 800).attr("height", 150).style("border", "1px solid red");

var rectangle = vis.append("rect").attr("width", 100).attr("height", 70).attr("x", 0).attr("y", 50);

var duration=5000;
  
function setPercentValue(percentage) {
   //rectangle.interrupt();

  rectangle.transition()
  .duration(duration * (1 - percentage))
  .ease(t => d3.easeCubic(percentage   t * (1 - percentage)))
  .attr("x", 250)
  .attr("width", 100)
  .attr("height", 100)
  .style("opacity", 0.5)
  .attr("fill", "red");

}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<div id="visualization"></div>
<input type="range" min="0" max="1" step="0.1" oninput="setPercentValue( event.target.value)">  

Ответ №1:

Анимация все еще работает, это не проблема. Проблема в том, что после завершения первой анимации вы анимируете элемент от его конечных значений до тех же конечных значений, и ничего не произойдет.

Самое простое решение — просто снова установить начальные позиции / размеры внутри setPercentValue функции:

 d3.select("#visualization").append('svg');
var vis = d3.select("svg").attr("width", 800).attr("height", 150).style("border", "1px solid red");

var rectangle = vis.append("rect").attr("width", 100).attr("height", 70).attr("x", 0).attr("y", 50);

var duration = 5000;

function setPercentValue(percentage) {
  rectangle.interrupt();

  rectangle.attr("width", 100)
    .attr("height", 70)
    .attr("x", 0)
    .attr("y", 50)
    .transition()
    .duration(duration * (1 - percentage))
    .ease(t => d3.easeCubic(percentage   t * (1 - percentage)))
    .attr("x", 250)
    .attr("width", 100)
    .attr("height", 100)
    .style("opacity", 0.5)
    .attr("fill", "red");
}  
 <script src="https://cdnjs.cloudflare.com/ajax/libs/d3/5.7.0/d3.min.js"></script>
<div id="visualization"></div>
<input type="range" min="0" max="1" step="0.1" oninput="setPercentValue( event.target.value)">  

Конечно, можно сказать, является ли это решение адекватным, только зная, какова ваша цель здесь, но это не совсем ясно.