рд╡рд┐рд╡рд░рдг

рдЖрдк 404 рдкреГрд╖реНрдареЛрдВ рдХреЛ рдХрд┐рддрдиреА рдмрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ? рдЖрдорддреМрд░ рдкрд░, рд╡реЗ рд╕реНрдЯрд╛рдЗрд▓ рдореЗрдВ рдирд╣реАрдВ рд╣реЛрддреЗ рд╣реИрдВ рдФрд░ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░рд╣рддреЗ рд╣реИрдВред рд╣рд╛рд▓ рд╣реА рдореЗрдВ рдореИрдВрдиреЗ test.do.am рдкрд╛рдпрд╛ рд╣реИ рдЬреЛ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЪрд░рд┐рддреНрд░ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рддреНрд░реБрдЯрд┐ рдкреГрд╖реНрда рдХреЛ рдЬреАрд╡рдВрдд рдХрд░рддрд╛ рд╣реИред

рд╢рд╛рдпрдж, рд╡рд╣рд╛рдБ рд╕рд┐рд░реНрдл рдПрдХ рдмрд┐рд▓реНрд▓реА рдХреА рддрд╕реНрд╡реАрд░ рдереА, рдлрд┐рд░ рдЙрдиреНрд╣реЛрдВрдиреЗ рд╕реЛрдЪрд╛ рдХрд┐ рдЖрдБрдЦреЛрдВ рдХреА рдЧрддрд┐ рдмрдврд╝ рд░рд╣реА рд╣реИ рдФрд░ рдбреЗрд╡рд▓рдкрд░ рдиреЗ рдЗрд╕ рд╡рд┐рдЪрд╛рд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рдЫрд╡рд┐ рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреГрд╖реНрда рдкрд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рднрд╛рд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╢рд╛рдВрдд рдФрд░ рд╕реБрдЦрдж рдЫреЛрдЯреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдпрд╣ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдпрд╛ рджреЛрд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ:

  1. рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдВрдбреЛ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдкрд░ рдХреЗрдВрджреНрд░ рдмрд┐рдВрджреБ рдХреЛ рдирд╡реАрдиреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЫреЛрдЯреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдЦреЛрд▓реЗрдВ рдФрд░ рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдХрд╛ рдЖрдХрд╛рд░ рджреЗрдВ, рдмрд┐рд▓реНрд▓реА рдХрд░реНрд╕рд░ рдкрд░ рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИред
  2. рдХреЗрдВрджреНрд░ рдмрд┐рдВрджреБ рдХреЛ рдмрд╛рдИрдВ рдЖрдВрдЦ рдкрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдЪрдХреНрд░ рдХреЗ рджреВрд░рдмреАрди рдХреЗрдВрджреНрд░ рдореЗрдВред
  3. рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдВрдЦреЛрдВ рдХреЗ рдмреАрдЪ рдХрд░реНрд╕рд░ рдШреБрдорд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдВрдЦреЛрдВ рдХреЗ рд╕реЗрдм рдПрдХ рд╕рд╛рде рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ рдФрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЖрдВрдЦреЗрдВ рдЕрдирдВрдд рдХреЛ рджреЗрдЦ рд░рд╣реА рд╣реИрдВ, рдЗрд╕реАрд▓рд┐рдП рдмрд┐рд▓реНрд▓реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддреА рд╣реИ, рдпрд╣ рдЙрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИред
  4. рдЖрдВрдЦреЛрдВ рдХреЗ рдЖрдВрджреЛрд▓рди рддрддреНрдХрд╛рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реБрдЪрд╛рд░реВ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
  5. рдорд╛рд░реНрдЬрд┐рди-рд▓реЗрдлреНрдЯ / рдорд╛рд░реНрдЬрд┐рди-рдЯреЙрдк рдЪреЗрдВрдЬрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╕реЗрдм рдХреА рдЪрд╛рд▓ рд╣реЛрддреА рд╣реИред рдпрд╣ рдЧрд▓рдд рд╣реИ, рдиреАрдЪреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЦреЛрдЬреЗрдВред
  6. рдпрджрд┐ рдХрд░реНрд╕рд░ рдлреБрдЯрд░ рдХреЗ рдиреАрдЪреЗ рд╣реИ рддреЛ рдЖрдВрдЦреЗрдВ рдирд╣реАрдВ рд╣рд┐рд▓рддреА рд╣реИрдВред

рдореИрдВ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВ

рдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдирд┐рд░реНрджреЛрд╖ рдЖрдВрдЦреЛрдВ рдХреЗ рдЖрдВрджреЛрд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

1. рдорд╛рд░реНрдХрдЕрдк рддреИрдпрд╛рд░ рдХрд░реЗрдВ

<div class="cat"> <div class="cat__eye _left"></div> <div class="cat__eye _right"></div> </div> 

2. рдЖрдВрдЦреЛрдВ рдХреЗ рддрддреНрд╡реЛрдВ рдХреЗ рд▓рд┐рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

 const cat = document.querySelector('.cat'); const eyes = cat.querySelectorAll('.cat__eye'); const eye_left = eyes[0]; const eye_right = eyes[1]; 

3. mousemove рдЗрд╡реЗрдВрдЯ рд╢реНрд░реЛрддрд╛ рдкрдВрдЬреАрдХреГрдд рдХрд░реЗрдВ рдФрд░ рдХрд░реНрд╕рд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ:

 let mouseX; let mouseY; window.addEventListener('mousemove', e => { mouseX = e.clientX; mouseY = e.clientY; }) 

рдореИрдВ рд╡рд┐рдВрдбреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдкрд░ mousemove рд╢реНрд░реЛрддрд╛ рдХреЛ рдЬреЛрдбрд╝рддрд╛ рд╣реВрдВ, рди рдХрд┐ рдбреЙрдХреНрдпреВрдореЗрдВрдЯ рдмреЙрдбреА рдХреЗ рд▓рд┐рдП, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдорд╛рдЙрд╕ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕рднреА рд╕реНрдХреНрд░реАрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

4. рдЖрдВрджреЛрд▓рди
рдЪреВрдВрдХрд┐ рдореИрдВ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдЬрд╛ рд░рд╣рд╛ рд╣реВрдВ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЙрдиреНрд╣реЗрдВ рдореВрд╕рдореЛрд╡ рд╣реИрдВрдбрд▓рд░ рдореЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ред

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

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

 window.requestAnimationFrame = (function () { return window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || function (callback) { window.setTimeout(callback, 1000 / 60); }; })(); 

рд╕рдордп рдореЗрдВ рдЕрджреНрдпрддрди рдХреЛ рдирд╡реАрдиреАрдХреГрдд рдХрд░рдиреЗ рдпрд╛ рд╕реНрдерд┐рд░ рд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВрдиреЗ рдЪрд░ рд╢реБрд░реВ рдХрд┐рдпрд╛

 let started = false; let mouseX; let mouseY; window.addEventListener('mousemove', e => { mouseX = e.clientX; mouseY = e.clientY; if(!started){ started = true; update(); } }) function update(){ // Here comes eyes movement magic requestAnimationFrame(update); } 

рдЗрд╕ рддрд░рд╣ рдореБрдЭреЗ рд▓рдЧрд╛рддрд╛рд░ рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдФрд░ рдХрд░реНрд╕рд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдорд┐рд▓рддреЗ рд░рд╣реЗред рдлрд┐рд░ рдореБрдЭреЗ рдЖрдВрдЦреЛрдВ рдХреЗ рдЕрдВрджрд░ рд╕реЗрдм рдХреЗ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред

рдореИрдВ рджреЛрдиреЛрдВ рдЖрдВрдЦреЛрдВ рдХреЛ рдПрдХ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ

 let dx = mouseX - eyesCenterX; let dy = mouseY - eyesCenterY; let angle = Math.atan2(dy, dx); let distance = Math.sqrt(dx * dx + dy * dy); distance = distance > EYES_RADIUS ? EYES_RADIUS : distance; let x = Math.cos(angle) * distance; let y = Math.sin(angle) * distance; eye_left.style.transform = 'translate(' + x + 'px,' + y + 'px)'; eye_right.style.transform = 'translate(' + x + 'px,' + y + 'px)'; 

рдмрд╣реБрдд рд╕рд░рд▓: рдбреАрдПрдХреНрд╕ рдФрд░ рдбрд╛рдИ рдЦреЛрдЬреЗрдВ, рдЬреЛ рдЖрдВрдЦреЛрдВ рдХреЗ рдХреЗрдВрджреНрд░ рдФрд░ рдорд╛рдЙрд╕ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХрд╛ рд╕рдордиреНрд╡рдп рдХрд░рддреЗ рд╣реИрдВ, рдХреЗрдВрджреНрд░ рд╕реЗ рд▓реЗрдХрд░ рдХрд░реНрд╕рд░ рддрдХ рдХреЗ рдХреЛрдг рдХреЛ рдвреВрдВрдврддреЗ рд╣реИрдВ, Math.cos рдФрд░ Math.sin рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдХреНрд╖реИрддрд┐рдЬ рдФрд░ рдКрд░реНрдзреНрд╡рд╛рдзрд░ рдХреЗ рд▓рд┐рдП рдЖрдВрджреЛрд▓рди рдореВрд▓реНрдп рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЯрд░реНрдирд░реА рдСрдкрд░реЗрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдЖрдВрдЦреЛрдВ рдХреЗ рдЖрдВрджреЛрд▓рди рдХреНрд╖реЗрддреНрд░ рдХреЛ рд╕реАрдорд┐рдд рдХрд░реЗрдВред


Y рдорд╛рди рдкрд╣рд▓реЗ Math.atan2 рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдлрд┐рд░ x рдорд╛рдиред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдВрдЦреЛрдВ рдХреА рдЧрддрд┐ рдФрд░ рдХреЛрдИ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХрддрд╛ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рддрд╛ рд╣реИред

рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рддреНрдпреЗрдХ рдЖрдВрдЦреЗрдВ рдореВрд╡ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВред

 // left eye let left_dx = mouseX - eyesCenterX + 48; let left_dy = mouseY - eyesCenterY; let left_angle = Math.atan2(left_dy, left_dx); let left_distance = Math.sqrt(left_dx * left_dx + left_dy * left_dy); left_distance = left_distance > EYES_RADIUS ? EYES_RADIUS : left_distance; let left_x = Math.cos(left_angle) * left_distance; let left_y = Math.sin(left_angle) * left_distance; eye_left.style.transform = 'translate(' + left_x + 'px,' + left_y + 'px)'; // right eye let right_dx = mouseX - eyesCenterX - 48; let right_dy = mouseY - eyesCenterY; let right_angle = Math.atan2(right_dy, right_dx); let right_distance = Math.sqrt(right_dx * right_dx + right_dy * right_dy); right_distance = right_distance > EYES_RADIUS ? EYES_RADIUS : right_distance; let right_x = Math.cos(right_angle) * right_distance; let right_y = Math.sin(right_angle) * right_distance; eye_right.style.transform = 'translate(' + right_x + 'px,' + right_y + 'px)'; 


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

рдореИрдВ рдкреВрд░реЗ рдХреЛрдб рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреГрдкрдпрд╛ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ:


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

рдЪреМрд░рд╕рд╛рдИ

рд▓рд┐рдВрдХ рдЯреНрд╡реЗрдирдореИрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ?

 TweenMax.to( eye, 0.15, {x: x, y: y}); 

рд╕рд░рд▓ рдХрд╛рд░реНрдп рдХреЗ рд▓рд┐рдП рдкреВрд░реЗ рдХрд╛рдо рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХрд╛ рдХреЛрдИ рдорддрд▓рдм рдирд╣реАрдВ рд╣реИ, рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдЦрд░реЛрдВрдЪ рд╕реЗ рдЪреМрд░рд╕рд╛рдИ рдХрд░рддрд╛ рд╣реВрдВред

рдпрд╣ рдорд╛рдорд▓рд╛ рд░рдЦреЗрдВ рдХрд┐ рдкреГрд╖реНрда рдкрд░ рдХреЗрд╡рд▓ рдПрдХ рд╣реА рдЖрдВрдЦ рддрддреНрд╡ рд╣реИ рдФрд░ рдЗрд╕рдХрд╛ рд╡рд┐рд╕реНрдерд╛рдкрди рдХреНрд╖реЗрддреНрд░ рдХреЗрд╡рд▓ рд╕реАрдорд┐рдд рдирд╣реАрдВ рд╣реИред рдореВрд▓реНтАНрдпреЛрдВ рдХрд╛ рдореВрд╡рдореЗрдВрдЯ рд╕рдореНтАНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдореИрдВ рдЗрд╕ рдореИрдХреЗрдирд┐рдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ:

 const SMOOTHING = 10; x += (needX - x) / SMOOTHING; y += (needY - y) / SMOOTHING; eye.style.transform = 'translate3d(' + x + 'px,' + y + 'px,0)'; 

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

рдЪрд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ 16.6ms (60 pics рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб) рдЪрд░ x рдФрд░ y рдореЗрдВ рдЖрд╡рд╢реНрдпрдХ рдорд╛рди рд╣реИрдВред рдкреНрд░рддреНрдпреЗрдХ рдирд╡реАрдХрд░рдг рдЕрдВрддрд░ рдХреЗ 1/10 рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдореВрд▓реНрдп рдХреЛ рдмрдВрдж рдХрд░ рджреЗрддрд╛ рд╣реИред

 let x = 0; let needX = 100; let SMOOTHING = 2; function update(){ x += (needX - x) / SMOOTHING; console.log(x); } 

рдлрд┐рд░ рд╣рд░ 16.6 рдПрдордПрд╕ рдирд╡реАрдиреАрдХрд░рдг рдореЗрдВ рд╣рдореЗрдВ рд╕рд░рд▓ рд╕реНрдореВрдерд┐рдВрдЧ рдФрд░ рдЕрдЧрд▓реЗ x рдорд╛рди (рд▓рдЧрднрдЧ) рдорд┐рд▓рддреЗ рд╣реИрдВ:

 50 75 87.5 93.75 96.875 98.4375 99.21875 99.609375 100 

рдПрдХ рдФрд░ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯ рдЪрд╛рд▓:

- рд╡рд░реНрдХрд▓реЛрдб рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдпрд╣ рдкрд░реАрдХреНрд╖рд╛ рд╢реБрд░реВ рдХрд░реЗрдВ

 if(x != needX || y != needY){ eye.style.transform = 'translate3d(' + x + 'px,' + y + 'px,0)'; } 

рд▓реЗрдХрд┐рди рдЖрдкрдХреЛ рдПрдХреНрд╕ рдХреЛ рдПрдХреНрд╕рдПрдХреНрд╕рдПрдХреНрд╕ рдХреА рдмрд░рд╛рдмрд░реА рдХрд░рдиреА рд╣реЛрдЧреА рдЬрдм рд╡реЗ рдХрд░реАрдм рдкрд╣реБрдВрдЪрддреЗ рд╣реИрдВ рдХреНрдпреЛрдВрдХрд┐ рдЖрдВрдЦреЛрдВ рдХреА рд╕реНрдерд┐рддрд┐ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд╣реЛрддреА рд╣реИ

 if(Math.abs(x - needX) < 0.25){ x = needX; } if(Math.abs(y - needY) < 0.25){ y = needY; } 

рдЕрдиреНрдпрдерд╛ x рдФрд░ y рдорд╛рди рдЬрд░реВрд░рддрдордВрджреЛрдВ рдФрд░ рдЬрд░реВрд░рддрдордВрджреЛрдВ рддрдХ рдмрд╣реБрдд рд▓рдВрдмреЗ рд╕рдордп рддрдХ рдкрд╣реБрдВрдЪрддреЗ рд░рд╣реЗрдВрдЧреЗ; рдХреЛрдИ рджреГрд╢реНрдп рдЕрдВрддрд░ рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рд╣рд░ рд╕реНрдХреНрд░реАрди рдкрд░рд┐рд╡рд░реНрддрди рдЖрдВрдЦреЛрдВ рдХреА рд╢реИрд▓рд┐рдпреЛрдВ рдХреЛ рдкреНрд░рднрд╛рд╡рд┐рдд рдХрд░реЗрдЧрд╛ред Btw рдЖрдк рдЕрдкрдиреЗ рдЖрдк рдХреЛ рдЗрд╕рдХреЗ рд╕рд╛рде рдЪрд╛рд░реЛрдВ рдУрд░ рдмреЗрд▓рд╛ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

 let x = 0; let needX = 100; let smoothing = 2; function update(){ x += (needX - x) / smoothing; if( Math.abs(x - needX) > 0.25 ){ // replace 0.25 with anything else and check number of x renewals. window.requestAnimationFrame(update); } else { x = needX; } console.log( x.toString(10) ); } update(); 

- рдпрджрд┐ рдЙрдкрд░реНрдпреБрдХреНрдд рдпрд╛рдВрддреНрд░рд┐рдХреА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рддреЛ рдЖрдк рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рднрд╛рд╡ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╡рд╕рдВрддред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЪреМрд░рд╕рд╛рдИ рдФрд░ рдХрд░реНрд╕рд░ рд╕рдиреНрдирд┐рдХрдЯрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:

 x += (mouseX - x) / smoothing; y += (mouseY - y) / smoothing; 


рдЖрд╡рд╢реНрдпрдХ рдФрд░ рд╡рд░реНрддрдорд╛рди рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдорд╛рдиреЛрдВ рдХреЗ рдмреАрдЪ рдЕрдВрддрд░ рдХреЛ рдЪреМрд░рд╕рд╛рдИ рдЬреЛрдбрд╝реЗрдВред


рдХрднреА-рдХрднреА рд╕рдиреНрдирд┐рдХрдЯрди рд╕реАрдорд╛ рд╕рдордЭ рдореЗрдВ рдЖрддрд╛ рд╣реИред рдКрдкрд░ рдЙрджрд╛рд╣рд░рдг рд╣реИ рдЬрд╣рд╛рдВ рдорд╛рди 0 рд╕реЗ 100 рддрдХ рдмрджрд▓рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП 1 рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐ рдореВрд▓реНрдп "50" рддрдХ рдкрд╣реБрдВрдЪрддрд╛ рд╣реИ, рдпрд╣ 1 рдЪрд░рдг рдХреЗ рд▓рд┐рдП рдмрд╣реБрдд рдмрдбрд╝рд╛ рдЖрдВрдХрдбрд╝рд╛ рд╣реИред рдпрд╣ рдпрд╛рдВрддреНрд░рд┐рдХреА рдереЛрдбрд╝реЗ рд╕реЗ рдЕрдХрд┐рд▓реАрдЬрд╝ рдФрд░ рдХрдЫреБрдП рдХреЗ рд╡рд┐рд░реЛрдзрд╛рднрд╛рд╕ рдХреЛ рдпрд╛рдж рджрд┐рд▓рд╛рддрд╛ рд╣реИ


рдкрд▓рдХ рдЭрдкрдХрд╛рдирд╛

рд╣рд░ 2-3 рд╕реЗрдХрдВрдб рдореЗрдВ рдЖрдВрдЦреЛрдВ рдХреЗ рд╕реЗрдм рдХреЛ рдЫрд┐рдкрд╛рдПрдВ рдФрд░ рджрд┐рдЦрд╛рдПрдВред рд╕рдмрд╕реЗ рддреБрдЪреНрдЫ рд╡рд┐рдзрд┐ рд╣реИ "рдкреНрд░рджрд░реНрд╢рди: рдХреЛрдИ рдирд╣реАрдВ?", "рд░реВрдкрд╛рдВрддрд░: рдкреИрдорд╛рдирд╛ (рдПрди)" рд╡рд╛рдИ-рд╕реНрдХреЗрд▓ рдХреЗ рдЧрддрд┐рд╢реАрд▓ рдореВрд▓реНрдп рдХреЗ рд╕рд╛рде рдереЛрдбрд╝рд╛ рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рд╣реИред

2 рдХрд╛рдБрд╕реНрдЯ рдмрдирд╛рдПрдБ

const BLINK_COUNTER_LIMIT = 180; - рдирд┐рдорд┐рд╖ рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ рдирд╡реАрдХрд░рдг рдХреА рд╕рдВрдЦреНрдпрд╛,
const BLINKED_COUNTER_LIMIT = 6; - рдПрдХ рдкрд▓рдХ рдХреЗ рджреМрд░рд╛рди рдирд╡реАрдХрд░рдг рдХреА рд╕рдВрдЦреНрдпрд╛ред

рдФрд░ 2 рдЪрд░, рдЬреЛ рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╣рд░ рдирд╡реАрдХрд░рдг рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред

 let blinkCounter = 0; let blinkedCounter = 0; 

рдкрд▓рдХ рдХрд╛ рдХреЛрдб

 let blinkTransform = ''; blinkCounter++; if(blinkCounter > BLINK_COUNTER_LIMIT){ blinkedCounter++ if(blinkedCounter > BLINKED_COUNTER_LIMIT){ blinkCounter = 0; } else { blinkTransform = ' scaleY(' + (blinkedCounter / BLINKED_COUNTER_LIMIT) + ')'; } } else { blinkedCounter = 0; } 

рдмреНрд▓рд┐рдВрдХрдЯреНрд░рд╛рдВрд╕рдлреЙрд░реНрдо рд╡рд╣ рд╕реНрдЯреНрд░реЛрдХ рд╡реИрд░рд┐рдПрдмрд▓ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╡рд┐рдВрдХрд┐рдВрдЧ рдХреЗ рджреМрд░рд╛рди рд░рд┐рдВрдХрд┐рдВрдЧ рдФрд░ рдлреЙрд▓реЛрдЗрдВрдЧ рдХреЗ рдмреАрдЪ рдХреА рдЦрд╛рд▓реА рд╡реИрд▓реНрдпреВ рд╣реЛрддреА рд╣реИ

 ' scaleY(0.17)' ' scaleY(0.33)' ' scaleY(0.50)' ' scaleY(0.67)' ' scaleY(0.83)' ' scaleY(1.00)' 

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

 eye_left.style.transform = 'translate(' + xLeft + 'px,' + y + 'px)' + blinkTransform; eye_right.style.transform = 'translate(' + xRight + 'px,' + y + 'px)' + blinkTransform; 

рдХрд╣рд╛рдиреА рдХрд╛ рдкрд╛рда

рд╣рд░ рджрд┐рди рд╣рдо рдРрд╕реА рдЪреАрдЬреЛрдВ рдХреЛ рдкреВрд░рд╛ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рд╕рд░рд▓ рдФрд░ рд╕реНрдкрд╖реНрдЯ рд▓рдЧрддреА рд╣реИрдВ рдФрд░ рд╣рдо рдпрд╣ рднреА рдирд╣реАрдВ рд╕рдордЭрддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдмрд╛рд╣рд░реА рд╕рд░рд▓рддрд╛ рд╕рд╡рд╛рд▓реЛрдВ рдФрд░ рд╕реБрдзрд╛рд░реЛрдВ рдХреА рдПрдХ рд╡рд┐рд╢рд╛рд▓ рд░рд╛рд╢рд┐ рдХреЛ рдЫрд┐рдкрд╛рддреА рд╣реИред рдореЗрд░реА рд░рд╛рдп рдореЗрдВ рд╢реИрддрд╛рди рдЙрди рд╡рд┐рд╡рд░рдгреЛрдВ рдореЗрдВ рд╣реИ рдЬреЛ рд╕рдВрдкреВрд░реНрдг рдЕрдВрддрд┐рдо рдкрд░рд┐рдгрд╛рдо рдмрдирд╛рддреЗ рд╣реИрдВред 20 рд╡реАрдВ рд╢рддрд╛рдмреНрджреА рдХреЗ рд╕рд░реНрд╡рд╢реНрд░реЗрд╖реНрда рдореБрдХреНрдХреЗрдмрд╛рдЬ рдореБрд╣рдореНрдордж рдЕрд▓реА рдиреЗ рд╕реАрдзреЗ рдкрдВрдЪ рдХреЗ рдХреНрд╖рдг рдореЗрдВ рдкреАрдЫреЗ рдХреЗ рдкреИрд░ рдХреА рдПрдбрд╝реА рдХреЛ рдЙрдард╛рдпрд╛ред рдЗрд╕ рдкреИрдВрддрд░реЗрдмрд╛рдЬрд╝реА рдиреЗ рдкреНрд░рднрд╛рд╡реА рджреВрд░реА рдХреЛ рдмрдврд╝рд╛рдпрд╛ рдФрд░ рдЙрд╕реЗ рдЬреАрддрдиреЗ рдХреЗ рд▓рд┐рдП рдФрд░ рдЕрдзрд┐рдХ рдореМрдХреЗ рджрд┐рдПред рдЗрд╕рдиреЗ рд╣рдореЗрд╢рд╛ рдХрд╛рдо рдХрд┐рдпрд╛ред

PS рдореБрдЭреЗ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдХреЛрдИ рдЕрд╕рд░ рдирд╣реАрдВ рдкрдбрд╝рд╛ рд╣реИ рдФрд░ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдорд╛рд▓рд┐рдХ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдЕрдкрд░рд╛рдз рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЛрдб рдореЗрдВ рдЖрдВрдЦ = рдЖрдВрдЦ рдХрд╛ рд╕реЗрдм рдирд╛рдо рджрд┐рдпрд╛ред

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


All Articles