【问题标题】:d3 on click on circle pause and resume transition of marker along lined3点击圆圈暂停并恢复标记沿线的过渡
【发布时间】:2018-05-01 05:31:37
【问题描述】:

我希望帮助我更正我的代码以单击标记圆圈元素以暂停或恢复该元素沿线的过渡。我的代码沿一条线移动标记,我可以使用单击按钮元素暂停和恢复此转换,但我希望能够单击标记圈本身,而不是按钮。我使用了各种参考资料,包括: http://www.nytimes.com/interactive/2013/09/25/sports/americas-cup-course.html http://jsfiddle.net/meetamit/UJuWX/3/ http://jsfiddle.net/Y62Hq/2/ D3 tween - pause and resume controls

我最终希望能够为地理路径上的标记设置动画,在路径上的点处暂停和恢复,然后点击这些点。

这是我目前的代码:

<!DOCTYPE html>
<html lang="en">
    <head>
<meta charset="utf-8">
<title>Need help</title>

<script src="https://d3js.org/d3.v4.min.js"></script>
<script src="https://d3js.org/d3-array.v1.min.js"></script>
<script src="https://d3js.org/d3-geo.v1.min.js"></script>
<script src="https://d3js.org/d3-queue.v3.min.js"></script>

<style type="text/css">

body{
    font-family:"Helvetica Neue", Helvetica, sans-serif;
    color: red;
}
button {
  position: absolute;
  top: 15px;
  left: 10px;
  background: #004276;
  padding-right: 26px;
  border-radius: 2px;
  cursor: pointer;
}
circle {
  fill: steelblue;
  stroke: pink;
  stroke-width: 3px;
}
.point{
    fill:green;

}
.line{
  fill: none;
  stroke: red;
  stroke-width: 4;
  stroke-dasharray: 4px,8px;
}
</style>
</head>
<body>

<button>Start</button>

<script>

    var w = 960,
        h = 500;

    var duration = 10000;

    var svg = d3.select("body").append("svg")
        .attr("width", w)
        .attr("height", h);

    var line = d3.line()
    .x(function(d){return (d)[0];})
    .y(function(d){return (d)[1];});

var data =
 [
  [480, 200],
  [580, 400],
  [680, 100],
  [780, 300],
  [180, 300],
  [280, 100],
  [380, 400]
];

//path to animate
var linepath = svg.append("path")
  .data([data])
  .attr("d", line)
    .attr('class', 'line')
    .attr("d", function(d){
        console.log(this);
        return line(d)
    });

var points = svg.selectAll("circle")
      .data(data)
        .enter()
        .append("circle")
      .attr("r", 7)
        .attr("transform", function(d) { return "translate(" + (d) + ")"; })
        .attr("class", "point");

var pauseValues = {
        lastTime: 0,
        currentTime: 0
        };
        var marker = svg.append("circle")
          .attr("r", 19)
          .attr("transform", "translate(" + (data[0]) + ")")
            .on('click', function(d,i){
                d3.select(this)
                .style("fill", "orange")
                .transition()
            });

function transition() {
  marker.transition()
        .duration(duration - (duration * pauseValues.lastTime))
        .attrTween("transform", translateAlong(linepath.node()))
        .on("end", function(){
        pauseValues = {
          lastT: 0,
          currentT: 0
        };
        transition()
      });
}

function translateAlong(path) {
  var l = path.getTotalLength();
  return function(d, i, a) {
    return function(t) {
      t += pauseValues.lastTime;
      var p = path.getPointAtLength(t * l);
      pauseValues.currentTime = t;
      return "translate(" + p.x + "," + p.y + ")";
    };
  };
}

d3.select('button').on('click',function(d,i){
  var self = d3.select(this);
  if (self.text() == "Pause"){
        self.text('Start');
        marker.transition()
      .duration(0);
        setTimeout(function(){
            pauseValues.lastTime = pauseValues.currentTime;
        }, 100);
  }else{
    self.text('Pause');
    transition();
  }
});

</script>
</body>
</html>

【问题讨论】:

    标签: d3.js svg


    【解决方案1】:

    要检查圆圈是否在click 函数中移动,请使用d3.active(),它...

    ...如果指定节点上没有这样的活动转换,则返回 null。

    像这样:

    .on('click', function(d, i) {
        if (d3.active(this)) {
            marker.transition();
            setTimeout(function() {
                pauseValues.lastTime = pauseValues.currentTime;
            }, 100);
        } else {
            transition();
        }
    });
    

    这是您的更改代码:

    <script src="https://d3js.org/d3.v4.min.js"></script>
    <script src="https://d3js.org/d3-array.v1.min.js"></script>
    <script src="https://d3js.org/d3-geo.v1.min.js"></script>
    <script src="https://d3js.org/d3-queue.v3.min.js"></script>
    
    <style type="text/css">
      body {
        font-family: "Helvetica Neue", Helvetica, sans-serif;
        color: red;
      }
      
      button {
        position: absolute;
        top: 15px;
        left: 10px;
        background: #004276;
        padding-right: 26px;
        border-radius: 2px;
        cursor: pointer;
      }
      
      circle {
        fill: steelblue;
        stroke: pink;
        stroke-width: 3px;
      }
      
      .point {
        fill: green;
      }
      
      .line {
        fill: none;
        stroke: red;
        stroke-width: 4;
        stroke-dasharray: 4px, 8px;
      }
    
    </style>
    
    <body>
    
      <button>Start</button>
    
      <script>
        var w = 960,
          h = 500;
    
        var duration = 10000;
    
        var svg = d3.select("body").append("svg")
          .attr("width", w)
          .attr("height", h);
    
        var line = d3.line()
          .x(function(d) {
            return (d)[0];
          })
          .y(function(d) {
            return (d)[1];
          });
    
        var data = [
          [480, 200],
          [580, 400],
          [680, 100],
          [780, 300],
          [180, 300],
          [280, 100],
          [380, 400]
        ];
    
        //path to animate
        var linepath = svg.append("path")
          .data([data])
          .attr("d", line)
          .attr('class', 'line')
          .attr("d", function(d) {
            return line(d)
          });
    
        var points = svg.selectAll("circle")
          .data(data)
          .enter()
          .append("circle")
          .attr("r", 7)
          .attr("transform", function(d) {
            return "translate(" + (d) + ")";
          })
          .attr("class", "point");
    
        var pauseValues = {
          lastTime: 0,
          currentTime: 0
        };
        var marker = svg.append("circle")
          .attr("r", 19)
          .attr("transform", "translate(" + (data[0]) + ")")
          .on('click', function(d, i) {
            if (d3.active(this)) {
              marker.transition();
              setTimeout(function() {
                pauseValues.lastTime = pauseValues.currentTime;
              }, 100);
            } else {
              transition();
            }
          });
    
        function transition() {
          marker.transition()
            .duration(duration - (duration * pauseValues.lastTime))
            .attrTween("transform", translateAlong(linepath.node()))
            .on("end", function() {
              pauseValues = {
                lastT: 0,
                currentT: 0
              };
              transition()
            });
        }
    
        function translateAlong(path) {
          var l = path.getTotalLength();
          return function(d, i, a) {
            return function(t) {
              t += pauseValues.lastTime;
              var p = path.getPointAtLength(t * l);
              pauseValues.currentTime = t;
              return "translate(" + p.x + "," + p.y + ")";
            };
          };
        }
    
        d3.select('button').on('click', function(d, i) {
          var self = d3.select(this);
          if (self.text() == "Pause") {
            self.text('Start');
            marker.transition()
              .duration(0);
            setTimeout(function() {
              pauseValues.lastTime = pauseValues.currentTime;
            }, 100);
          } else {
            self.text('Pause');
            transition();
          }
        });
    
      </script>
    </body>

    【讨论】:

      猜你喜欢
      • 2013-03-28
      • 1970-01-01
      • 2014-05-27
      • 1970-01-01
      • 1970-01-01
      • 2018-05-15
      • 2019-06-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多