рд╡рд╕реНрддреБрдУрдВ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрдирд╡рд╛рд╕ рдореЗрдВ SVG рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

рдпрджрд┐ рдХреИрдирд╡рд╛рд╕ рдореЗрдВ рдПрдХ рд╡рд╕реНрддреБ рдХреЛ (рдФрд░ рди рдХреЗрд╡рд▓) рдХреЛ рдЪреЗрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдЗрд╕реЗ рдХреБрдЫ рд╡рд╛рдВрдЫрд┐рдд рдкрде рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рд╢рд╛рдпрдж рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдХрдИ рдЬрд┐рдиреНрд╣реЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдпрд╛ рдХреНрд░рдорд┐рдХ рд░реВрдк рд╕реЗ рдЪреБрдирд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рддреЛ рдпрд╣ svg рд░рд╛рд╕реНрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдкрде рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд░рд▓ рд▓реЗрдХрд┐рди рд╣рд░рд╛ рд╡рд░реНрдЧ рд╢реБрд░реВ рдХрд░рдХреЗ рдЪрд▓реЛред

рдЫрд╡рд┐


рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдпрд╛ рдПрдХ рд╕реЗ рдЕрдзрд┐рдХ рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде svg рдмрдирд╛ рдпрд╛ рдЙрдзрд╛рд░ рд▓реЗрдВрдЧреЗред

Document.createElementNS рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рддрддреНрд╡ рдмрдирд╛рдПрдВред рдПрдордбреАрдПрди рд╣рдореЗрдВ рдмрддрд╛рддрд╛ рд╣реИ рдХрд┐ рд╕рднреА рдЖрдзреБрдирд┐рдХ рдмреНрд░рд╛рдЙрдЬрд╝рд░реЛрдВ рдореЗрдВ рд╡рд┐рдзрд┐ рдХрд╛ рдореВрд▓ рд╕рдорд░реНрдерди рд╣реИред рдлрд┐рд░ рдмрдирд╛рдП рдЧрдП рддрддреНрд╡ рдореЗрдВ рдкрде рдЬреЛрдбрд╝реЗрдВред

let path = document.createElementNS("http://www.w3.org/2000/svg", "path"); path.setAttribute('d', 'M148.185,118.975c0,0-92.592,39.507-80.247,79.013,s79.012,143.21,129.629,124.691s64.198-113.856,120.988-100.755s118.518,30.384,116.049,109.397s-82.715,118.519-97.53,201.235,s-92.593,139.505,0,159.259'); 

рдпрд╣рд╛рдВ, рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдореЗрдВ, рдХреБрдЫ svg рдлрд╝рд╛рдЗрд▓ рд╕реЗ рдкрд╣рд▓рд╛ рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝рдиреЗ рд╡рд╛рд▓рд╛ рдорд╛рд░реНрдЧ рдкреЗрд╢ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдХреЙрдкреА-рдкреЗрд╕реНрдЯ рд╡рд┐рдзрд┐ред рдмреЗрд╢рдХ, рдпрд╣ рдПрдХрдорд╛рддреНрд░ рдФрд░ рдирд╣реАрдВ рд╣реИ, рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕рдмрд╕реЗ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╕реНрдкрд╖реНрдЯ рд╣реИред

рдЕрдм рд▓реВрдк рдореЗрдВ, рд╣рдо рд╡реЗрдкреЙрдЗрдВрдЯ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА рд╡рд╕реНрддреБ рдХреЛ рд╕реМрдВрдкреЗрдВрдЧреЗред рдЗрд╕рдХреЗ рд▓рд┐рдП рджреЛ SVGGeometryElement рд╡рд┐рдзрд┐рдпрд╛рдВ рдкрд░реНрдпрд╛рдкреНрдд рд╣реИрдВ:

 path.getTotalLength() 

рдХреБрд▓ рдкрде рд▓рдВрдмрд╛рдИ рдХрд╛ рдкрд░рд┐рдХрд▓рд┐рдд рдорд╛рди рджреЗрддрд╛ рд╣реИ рдФрд░

  path.getPointAtLength(index) 

рдпрд╣ рдПрдХ рдлреНрд▓реЛрдЯ рддрд░реНрдХ рд▓реЗрддрд╛ рд╣реИ, рдФрд░ рдПрдХ SVGPoint рдСрдмреНрдЬреЗрдХреНрдЯ рджреЗрддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╣рдорд╛рд░реЗ рд▓рд┐рдП x рдФрд░ y рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╣рд┐рдд рд╣реИрдВред рдпрджрд┐ рддрд░реНрдХ рдорд╛рди рд╢реВрдиреНрдп рд╕реЗ рдХрдо рдпрд╛ рдкрде рд▓рдВрдмрд╛рдИ рд╕реЗ рдЕрдзрд┐рдХ рд╣реИрдВ, рддреЛ рдХреНрд░рдорд╢рдГ рдкрд╣рд▓реЗ рдпрд╛ рдЕрдВрддрд┐рдо рдмрд┐рдВрджреБ, рдкрд░рд┐рдгрд╛рдо рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рдПрдВрдЧреЗред

рдлреНрд░реЗрдо рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╕рдордп, рд╣рдо рдмрд┐рдВрджреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдВрджреЛрд▓рди рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

тЖТ рдХреЛрдбрдкреЗрди рдкрд░ рдкреВрд░реНрдг рдЙрджрд╛рд╣рд░рдг рдХреЛрдб

рд▓реЗрдХрд┐рди, рдЖрдк рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдХрдИ рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рд╡рд╕реНрддреБ рдХреЛ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрдзрд┐рдХ рджрд┐рд▓рдЪрд╕реНрдк рд╡рд┐рдХрд▓реНрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдЫрд╡рд┐


рдлрд┐рд░ рд╕реЗ, рдХрдИ рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ svg рдлрд╝рд╛рдЗрд▓ рд▓реЗрдВред рдЬреЛ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛ рд╡рд╣ рдЗрдирд╕реНрдХреЗрдк рдПрдбрд┐рдЯрд░ рдореЗрдВ рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЕрдм рдЖрдкрдХреЛ рдЗрди рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рдпрд╣ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдкрд╛рд░реНрд╕ рдХрд░рдиреЗ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрднрд╡ рд╣реИ рдпрд╛, рдпрджрд┐ svg рдХреЛ рдПрдХ рдкрд╛рда рдлрд╝рд╛рдЗрд▓ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рдерд╛, рддреЛ рдЕрдЧрд▓реЗ рдлрд╝рдВрдХреНрд╢рди, рдирд┐рдпрдорд┐рдд рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 extractPathsfromSvg: function(svg){ let results = svg.match(/<path\b([\s\S]*?)><\/path>/g); let paths = []; let len = results.length; for(let i = 0; i < len; i++){ let str = results[i]; let data = str.match(/[^\w]d="([\s\S]*?)"/); paths.push(data[1]); } return paths; } 

рд░рд╛рд╕реНрддреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреА рдмрдирд╛рдиреЗ рдХреЗ рдмрд╛рдж, рдпрд╣ рдмрджрд▓реЗ рдореЗрдВ рдЙрдиреНрд╣реЗрдВ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рд░рд╣рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдХрд┐ рд╡рд░реНрдЧ рдХреЗ рдЖрдВрджреЛрд▓рди рдХреЗ рд▓рд┐рдП рдПрдХрдорд╛рддреНрд░ рдорд╛рд░реНрдЧред рджрд┐рд▓рдЪрд╕реНрдк рдкреНрд░рднрд╛рд╡ рдкрдбрд╝ рд░рд╣рд╛ рд╣реИред
рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдкреВрд░рд╛ рдХреЛрдб рджреЗрдЦреЗрдВред

рдкрде рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХреЗ рд╕рд╛рде рдХрд┐рд╕реА рд╡рд╕реНрддреБ рдХреЛ рд▓реЗ рдЬрд╛рдиреЗ рдкрд░ рдЕрдзрд┐рдХ рдирд┐рдпрдВрддреНрд░рдг рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЬреБрдбрд╝рд╡рд╛ рдмрдЪреНрдЪреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдкрд░реАрдХреНрд╖рдг рдорд╛рдорд▓реЛрдВ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдкрд╣рд▓рд╛ рдЧреНрд░реАрдирд╕реНрдХреЙрдХ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд▓рд┐рдпрд╛, рдЬрд┐рд╕рдиреЗ рдореЗрд░реА рдЖрдВрдЦ рдХреЛ рдкрдХрдбрд╝ рд▓рд┐рдпрд╛, рд▓реЗрдХрд┐рди рдпрд╣ рдХрд┐рд╕реА рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП рдирд┐рдХрд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

рдкрд╣рд▓реЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рдЬрдм рд╡рд░реНрдЧ рдПрдХрдорд╛рддреНрд░ рдкрде рдХреЗ рд╕рд╛рде рдЪрд▓рддрд╛ рд╣реИ, рддреЛ рдПрдХ рдордзреНрдпрд╡рд░реНрддреА рдСрдмреНрдЬреЗрдХреНрдЯ рд╣реЗрд▓реНрдкрд░ рдмрдирд╛рдПрдВ, рдФрд░ рдЗрд╕реЗ рдЯреНрд╡реАрди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд╛рд╕ рдХрд░реЗрдВред

 var helper = {progress: 0} helper.update = function(value){ point = path.getPointAtLength(totalLength * helper.progress); x = point.x; y = point.y; ctx.clearRect(0, 0, canvas.width, canvas.height); ctx.drawImage(img, x, y ); } var tw = new TweenLite.to(helper, 5, {progress: 0, }); tw.eventCallback("onUpdate", helper.update); 

рдЖрдк рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреЛрдб рдХреЗ рдкрд╣рд▓реЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдХреЛрдб рдХреЗ рд╕рд╛рде рдЯреНрд╡реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЯрд┐рдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдХрдИ рд░рд╛рд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдкрд░, рд╣рдо рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЖрдЧреЗ рдмрдврд╝рддреЗ рд╣реИрдВред рдкрд╣рд▓реЗ рдХреА рддрд░рд╣, рдкреНрд░рдЧрддрд┐ рд╕рдВрдкрддреНрддрд┐ рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╣рд╛рдпрдХ рд╡рд╕реНрддреБ рдмрдирд╛рдПрдВред рд╣рдо рд╕рднреА рд░рд╛рд╕реНрддреЛрдВ рдХреА рдХреБрд▓ рд▓рдВрдмрд╛рдИ рдХреА рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдЗрд╕реЗ рд╣реИрдВрдбрд▓рд░.рдкреНрд░реЛрдЧреНрд░реЗрд╕ рдЕрд╕рд╛рдЗрди рдХрд░рддреЗ рд╣реИрдВред рдЖрдЗрдП рдПрдХ рдЯреНрд░реИрд╡рд░реНрд╕реЗрдб рд╡реИрд░рд┐рдПрдмрд▓ рдмрдирд╛рдПрдВ рдЬрд┐рд╕рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рдХрд╡рд░ рдХрд┐рдП рдЧрдП рд░рд╛рд╕реНрддреЛрдВ рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рд╡рд░реНрддрдорд╛рди рдкрде рдкрд░ рдПрдХ рдмрд┐рдВрджреБ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣реЗрд▓реНрдкрд░.рдкреНрд░реЛрдЧреНрд░реЗрд╕ рд╕реЗ рдШрдЯрд╛рдПрдВ, рдЬреЛ рдХрд┐ рдЯреНрд╡реАрдиреНрд╕ рдореЗрдВ рдмрджрд▓рддрд╛ рд╣реИ, рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдпрд╛рддреНрд░рд╛ рдХреА рдЧрдИ рдкрде рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╣рдо рд╣рдореЗрд╢рд╛ рдХреА рддрд░рд╣ рдмрд┐рдВрджреБ рдХреЗ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

 var traversed = 0; helper.progress = totalLenghtAllPath; helper.update = function() { var localPoint = helper.progress - traversed; if(localPoint > curPath.getTotalLength()){ traversed += curPath.getTotalLength(); curPath = paths[next()]; if(curPath){ return false; } localPoint = helper.progress - traversed; } /*       */ } var tw = TweenLite.to( helper, 25, {progress: totalLenghtAllPath, ease: Power2.easeOut } ); tw.eventCallback("onUpdate", helper.update); 

рдХреЛрдб рд╕рд░рд▓ рд╣реИ, рдкреВрд░реНрдг рдХреЛрдб рдпрд╣рд╛рдБ рд╣реИ:

Source: https://habr.com/ru/post/hi432114/


All Articles