There are 2 circles. They constantly fly up and down. A line must pass through them. It is necessary that the line is constantly redrawn depending on the distance of these circles. Those. with every move. Using snap svg *
var paperHeader = Snap(".circle_anim"); var lineHeader = paperHeader.path("").attr({ fill: "transparent", stroke: "#9b9b9c", strokeWidth: 2 }); function flyCircle(name_circle) { var element = Snap("#" + name_circle); var Bbox = element.getBBox(); var coord_y = Bbox.cy; var states = [{ cy: coord_y }, { cy: 500 }, { cy: 320 }]; (function animateCircle(el, i) { el.animate(states[i], 2000, function() { animateCircle(el, ++i in states ? i : 0); }); })(element, 0); } function drawLineHeader(circle) { var stringPath = lineHeader.attr("d"); var element = Snap("#" + circle); var Bbox = element.getBBox(); paperHeader.append(element); var coord_y = Bbox.cy; var coord_x = Bbox.cx; if (stringPath) lineHeader.attr({ d: stringPath + "L " + coord_x + "," + coord_y }); else lineHeader.attr({ d: "M " + coord_x + "," + coord_y }); } for (var count = 1; count < 8; count++) { var s_temp = "Hcircle" + count; drawLineHeader(s_temp); flyCircle(s_temp); } .circle_anim { display: block; position: absolute; width: 100%; height: 100%; z-index: 1; } <svg class="circle_anim"> <circle id="Hcircle1" fill="#9B9B9C" cx="0" cy="60%" r="9" /> <circle id="Hcircle2" fill="#9B9B9C" cx="6%" cy="99%" r="9" /> <circle id="Hcircle3" fill="#9B9B9C" cx="23%" cy="78%" r="9" /> <circle id="Hcircle4" fill="#9B9B9C" cx="40%" cy="82%" r="9" /> <circle id="Hcircle5" fill="#9B9B9C" cx="65%" cy="91%" r="9" /> <circle id="Hcircle6" fill="#9B9B9C" cx="80%" cy="99%" r="9" /> <circle id="Hcircle7" fill="#9B9B9C" cx="100%" cy="55%" r="9" /> </svg> <script src="//cdn.jsdelivr.net/snap.svg/0.2.0/snap.svg-min.js"></script>