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

рдЕрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдкреГрд╖реНрда рдкрд░ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рднрд╛рд╡ рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИред рдпрд╣ рд╢рд╛рдВрдд рдФрд░ рд╕реБрдЦрдж рдЫреЛрдЯреА рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ, рдпрд╣ рдкрдХрдбрд╝рддрд╛ рд╣реИ, рдлрд┐рд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рд╕рд╣рдпреЛрдЧрд┐рдпреЛрдВ рдпрд╛ рджреЛрд╕реНрддреЛрдВ рдХреЗ рд╕рд╛рде рдЪрд░реНрдЪрд╛ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдпрд╣рд╛рдВ рддрдХ тАЛтАЛрдХрд┐ рдЗрд╕ рд╕реБрд╡рд┐рдзрд╛ рдХреЛ рджреЛрд╣рд░рд╛рддрд╛ рд╣реИред рдпрд╣ рдЖрд╕рд╛рди рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдпрджрд┐ рдирд╣реАрдВ:
- рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рдВрдбреЛ рдХрд╛ рдЖрдХрд╛рд░ рдмрджрд▓рдиреЗ рдкрд░ рдХреЗрдВрджреНрд░ рдмрд┐рдВрджреБ рдХреЛ рдирд╡реАрдиреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд░рд╣рд╛ рд╣реИред рдЫреЛрдЯреА рдЪреМрдбрд╝рд╛рдИ рдХреЗ рд╡реНрдпреВрдкреЛрд░реНрдЯ рдХреЗ рд╕рд╛рде рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд┐рдВрдбреЛ рдЦреЛрд▓реЗрдВ рдФрд░ рдкреВрд░реНрдг рд╕реНрдХреНрд░реАрди рдХрд╛ рдЖрдХрд╛рд░ рджреЗрдВ, рдмрд┐рд▓реНрд▓реА рдХрд░реНрд╕рд░ рдкрд░ рдирд╣реАрдВ рджрд┐рдЦрддреА рд╣реИред
- рдХреЗрдВрджреНрд░ рдмрд┐рдВрджреБ рдХреЛ рдмрд╛рдИрдВ рдЖрдВрдЦ рдкрд░ рд░рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ рдЪрдХреНрд░ рдХреЗ рджреВрд░рдмреАрди рдХреЗрдВрджреНрд░ рдореЗрдВред
- рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдВрдЦреЛрдВ рдХреЗ рдмреАрдЪ рдХрд░реНрд╕рд░ рдШреБрдорд╛рддрд╛ рд╣реИ, рддреЛ рдЖрдВрдЦреЛрдВ рдХреЗ рд╕реЗрдм рдПрдХ рд╕рд╛рде рдирд╣реАрдВ рдорд┐рд▓рддреЗ рд╣реИрдВ рдФрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред рдЖрдВрдЦреЗрдВ рдЕрдирдВрдд рдХреЛ рджреЗрдЦ рд░рд╣реА рд╣реИрдВ, рдЗрд╕реАрд▓рд┐рдП рдмрд┐рд▓реНрд▓реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рдирд╣реАрдВ рджреЗрдЦрддреА рд╣реИ, рдпрд╣ рдЙрд╕рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рджрд┐рдЦрддрд╛ рд╣реИред
- рдЖрдВрдЦреЛрдВ рдХреЗ рдЖрдВрджреЛрд▓рди рддрддреНрдХрд╛рд▓ рд╣реЛрддреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рд╕реБрдЪрд╛рд░реВ рд╣реЛрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред
- рдорд╛рд░реНрдЬрд┐рди-рд▓реЗрдлреНрдЯ / рдорд╛рд░реНрдЬрд┐рди-рдЯреЙрдк рдЪреЗрдВрдЬрд┐рдВрдЧ рдХреЗ рдХрд╛рд░рдг рд╕реЗрдм рдХреА рдЪрд╛рд▓ рд╣реЛрддреА рд╣реИред рдпрд╣ рдЧрд▓рдд рд╣реИ, рдиреАрдЪреЗ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЦреЛрдЬреЗрдВред
- рдпрджрд┐ рдХрд░реНрд╕рд░ рдлреБрдЯрд░ рдХреЗ рдиреАрдЪреЗ рд╣реИ рддреЛ рдЖрдВрдЦреЗрдВ рдирд╣реАрдВ рд╣рд┐рд▓рддреА рд╣реИрдВред
рдореИрдВ рдХреНрдпрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддрд╛ рд╣реВрдВрдПрдХ рд╢реБрд░реБрдЖрдд рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдирд┐рд░реНрджреЛрд╖ рдЖрдВрдЦреЛрдВ рдХреЗ рдЖрдВрджреЛрд▓рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред
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(){
рдЗрд╕ рддрд░рд╣ рдореБрдЭреЗ рд▓рдЧрд╛рддрд╛рд░ рдЕрдкрдбреЗрдЯ рд╡рд┐рдзрд┐ рдФрд░ рдХрд░реНрд╕рд░ рдирд┐рд░реНрджреЗрд╢рд╛рдВрдХ рдорд┐рд▓рддреЗ рд░рд╣реЗред рдлрд┐рд░ рдореБрдЭреЗ рдЖрдВрдЦреЛрдВ рдХреЗ рдЕрдВрджрд░ рд╕реЗрдм рдХреЗ рдЖрдВрджреЛрд▓рдиреЛрдВ рдХреЗ рдореВрд▓реНрдпреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
рдореИрдВ рджреЛрдиреЛрдВ рдЖрдВрдЦреЛрдВ рдХреЛ рдПрдХ рддрддреНрд╡ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рддрд╛ рд╣реВрдВ
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 рдорд╛рдиред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЖрдВрдЦреЛрдВ рдХреА рдЧрддрд┐ рдФрд░ рдХреЛрдИ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреА рдЕрдкреНрд░рд╛рдХреГрддрд┐рдХрддрд╛ рдХреЛ рдиреЛрдЯрд┐рд╕ рдХрд░рддрд╛ рд╣реИред
рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рдВрджрд░реНрдн рдХреЗ рдмрд┐рдирд╛ рдкреНрд░рддреНрдпреЗрдХ рдЖрдВрдЦреЗрдВ рдореВрд╡ рдХрд░реЗрдВ рдФрд░ рджреЗрдЦреЗрдВред
рджрд┐рд▓рдЪрд╕реНрдк рд▓реЗрдХрд┐рди рдкрд┐рдЫрд▓реЗ рдкрд░рд┐рдгрд╛рдо рд╕реЗ рднреА рдмрджрддрд░, рдЖрдБрдЦреЗрдВ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдКрдкрд░ рдФрд░ рдиреАрдЪреЗ рдЪрд▓рддреА рд╣реИрдВред рдЗрд╕рд▓рд┐рдП рдореИрдВрдиреЗ рдкрд╣рд▓реЗ рдбреЗрдореЛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдПрдХ рдЖрдВрджреЛрд▓рди рдореИрдХреЗрдирд┐рдХ рдмреЗрд╕рд┐рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдФрд░ рдХрд░реНрд╕рд░ рдХреЗ рдЪрд░рд┐рддреНрд░ рдХреЗ рдХреЗрдВрджреНрд░ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рджреЗрдЦрддреЗ рд╣реБрдП рдЖрдВрдЦреЛрдВ рдХреЗ рд╕реЗрдм рдХреЛ рдПрдХ рд╕рд╛рде рдорд┐рд▓рд╛рдпрд╛ред
рдореИрдВ рдкреВрд░реЗ рдХреЛрдб рдХрд╛ рд╡рд░реНрдгрди рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреГрдкрдпрд╛ рдЗрд╕рдХрд╛ рдкрд░рд┐рдгрд╛рдо рджреЗрдЦреЗрдВ:
рдкрд░реАрдХреНрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐ рд╕реЗ рдореИрдВрдиреЗ рдЖрдВрдЦреЛрдВ рдХреЗ рдЖрдВрджреЛрд▓рди рдФрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдорд╛рдкрджрдВрдбреЛрдВ рдХрд╛ рдорд┐рд▓рд╛рди рдХрд┐рдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЕрдм рдореБрдЭреЗ рд╕реНрдореВрдереА рдЪрд╛рд╣рд┐рдПред
рдЪреМрд░рд╕рд╛рдИрд▓рд┐рдВрдХ
рдЯреНрд╡реЗрдирдореИрдХреНрд╕ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рдХреЛрдб рдХреБрдЫ рдЗрд╕ рддрд░рд╣ рд╕реЗ?
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 ){
- рдпрджрд┐ рдЙрдкрд░реНрдпреБрдХреНрдд рдпрд╛рдВрддреНрд░рд┐рдХреА рд╕реНрдкрд╖реНрдЯ рд╣реИ, рддреЛ рдЖрдк рдЕрдзрд┐рдХ рдЬрдЯрд┐рд▓ рдкреНрд░рднрд╛рд╡ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рд╡рд╕рдВрддред рд╕рдмрд╕реЗ рд╕рд░рд▓ рдЪреМрд░рд╕рд╛рдИ рдФрд░ рдХрд░реНрд╕рд░ рд╕рдиреНрдирд┐рдХрдЯрди рдЗрд╕ рддрд░рд╣ рджрд┐рдЦрддрд╛ рд╣реИ:
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 рдореБрдЭреЗ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рдХреЛрдИ рдЕрд╕рд░ рдирд╣реАрдВ рдкрдбрд╝рд╛ рд╣реИ рдФрд░ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдорд╛рд▓рд┐рдХ рдореЗрд░реА рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдкрд░ рдЕрдкрд░рд╛рдз рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП рдореИрдВрдиреЗ рдХреЛрдб рдореЗрдВ рдЖрдВрдЦ = рдЖрдВрдЦ рдХрд╛ рд╕реЗрдм рдирд╛рдо рджрд┐рдпрд╛ред