рд╣реЗрд▓реЛ, рд╣реЗрдмреНрд░!рдореИрдВ рд▓рдВрдмреЗ рд╕рдордп рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред рд▓реЗрдХрд┐рди рдореИрдВрдиреЗ рдХреЗрд╡рд▓ рд░рд┐рдПрдХреНрдЯ-рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд░рд┐рдПрдХреНрдЯ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдРрд╕рд╛ рдХрд┐рдпрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореБрдЭреЗ рдХреБрдЫ рдФрд░ рдирд╣реАрдВ рдкрддрд╛ рдерд╛редрд▓реЗрдХрд┐рди рдЖрдЦрд┐рд░рдХрд╛рд░, рдореИрдВрдиреЗ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдХрд┐ рдпрд╣ рд╕рдм рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдФрд░ рдореЗрд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрддрд╛ рд╣реИ!рдпрджрд┐ рдЖрдк рднреА рд╣рд░ рдЬрдЧрд╣ рд╕реНрдкреНрд░рд┐рдВрдЧ-рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдмрд┐рд▓реНрд▓реА рдХреЗ рдиреАрдЪреЗ рдЬрд╛рдПрдВред рд╡рд╣рд╛рдВ рдЖрдкрдХреЛ рдХреБрдЫ рд╕рд┐рджреНрдзрд╛рдВрдд рдорд┐рд▓реЗрдВрдЧреЗ, рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рд╢реБрджреНрдз рдЬреЗрдПрд╕ рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рдирд╛, рдФрд░ рдШрдЯрдХреЛрдВ рдФрд░ рд░рдЪрдирд╛-рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╡реАрдпреВ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреАрдореЗрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдирд╛редрдЯреАрдПрд▓, рдбреЙ
рдЬреЗрдПрд╕ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреАрдореЗрд╢рди рд▓рд╛рдЧреВ рдХрд░рдирд╛: https://playcode.io/590645/ редрдЖрдкрдХреЛ рдЕрдкрдиреА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ - рдкреЙрдкрдореЛрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рд▓реЗрдВ редрдЖрдкрдХреЛ рдЕрдкрдиреЗ Vue рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдЬреЛрдбрд╝рдиреЗ рдХреА рдЬрд╝рд░реВрд░рдд рд╣реИ - рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рдкреЙрдкрдореЛрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рд▓реЗрдВ рдФрд░ рдЙрд╕ рдкрд░ рдПрдХ рдЖрд╡рд░рдг рд▓рд┐рдЦреЗрдВредрд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдХрд┐рд╕рдХреЗ рд▓рд┐рдП рд╣реИрдВ?
рд╡реЗрдм рдкрд░ рдкрд╛рд░рдВрдкрд░рд┐рдХ рд╕реАрдПрд╕рдПрд╕ рдПрдирд┐рдореЗрд╢рди рд╕рдордп-рд╕рдордп рдкрд░ рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдЕрд╡рдзрд┐ рдФрд░ рдПрдХ рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВредрд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдПрдХ рдЕрд▓рдЧ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ - рд╕реНрдкреНрд░рд┐рдВрдЧ рднреМрддрд┐рдХреАредрдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд┐рд╕реНрдЯрдо рдХреЗ рднреМрддрд┐рдХ рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВ: рд╡рд╕рдВрдд рдХрд╛ рджреНрд░рд╡реНрдпрдорд╛рди, рд╡рд╕рдВрдд рдХреА рд▓реЛрдЪ рдХрд╛ рдЧреБрдгрд╛рдВрдХ, рдордзреНрдпрдо рдХреЗ рдШрд░реНрд╖рдг рдХрд╛ рдЧреБрдгрд╛рдВрдХред рддрдм рд╣рдо рд╡рд╕рдВрдд рдХреЛ рдЙрд╕ рджреВрд░реА рддрдХ рдЦреАрдВрдЪрддреЗ рд╣реИрдВ, рдЬрд┐рд╕реЗ рд╣рдореЗрдВ рдЪреЗрддрди рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЙрд╕реЗ рдЫреЛрдбрд╝ рджреЗрддреЗ рд╣реИрдВредрдлреНрд░рдВрдЯ-рдПрдВрдб рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕ рдореЗрдВ, рдореБрдЭреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдлрд╛рдпрджреЗ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВ:1. рдЖрдк рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдПрдиреАрдореЗрд╢рди рдЧрддрд┐ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВредрдпрджрд┐ рд╕рд╛рдЗрдЯ рдкреНрд░рдХреНрд░рд┐рдпрд╛рдПрдВ рдЖрдкрдХреА рдЙрдВрдЧрд▓рд┐рдпреЛрдВ рд╕реЗ рд╕реНрд╡рд╛рдЗрдк рдХрд░рддреА рд╣реИрдВ рдпрд╛ рдорд╛рдЙрд╕ рдХреЗ рд╕рд╛рде рдШрд╕реАрдЯрддреА рд╣реИрдВ, рддреЛ рдСрдмреНрдЬреЗрдХреНрдЯ рдПрдирд┐рдореЗрд╢рди рдЕрдзрд┐рдХ рд╕реНрд╡рд╛рднрд╛рд╡рд┐рдХ рджрд┐рдЦреЗрдВрдЧреЗ рдпрджрд┐ рдЖрдк рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рд╛рдЗрдк рд╕реНрдкреАрдб рдпрд╛ рдорд╛рдЙрд╕ рд╕реНрдкреАрдб рдХреЗ рд╕рд╛рде рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЧрддрд┐ рдХреЗ рд╕рд╛рде рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВред
рд╕реАрдПрд╕рдПрд╕ рдПрдиреАрдореЗрд╢рди рдЬреЛ рдорд╛рдЙрд╕ рдХреА рдЧрддрд┐ рдХреЛ рдмрдирд╛рдП рдирд╣реАрдВ рд░рдЦрддрд╛ рд╣реИ
рд╕реНрдкреНрд░рд┐рдВрдЧ-рдПрдиреАрдореЗрд╢рди, рдЬрд┐рд╕рдореЗрдВ рдорд╛рдЙрд╕ рдХреА рдЧрддрд┐ рдХреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ2 рдореЗрдВ рдкреНрд░реЗрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдЖрдк рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдмрджрд▓ рд╕рдХрддреЗ рд╣реИрдВредрдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рдЖрдк рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рдХреЗ рд▓рд┐рдП рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдПрдирд┐рдореЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк CSS рдХреА рдорджрдж рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ - рдЬрдм рдЖрдк рдХрд░реНрд╕рд░ рдХреА рд╕реНрдерд┐рддрд┐ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдПрдиреАрдореЗрд╢рди рдХреЛ рдлрд┐рд░ рд╕реЗ рд╢реБрд░реВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд╛рд░рдг рд╣реЛрдЧрд╛ рдЭрдЯрдХреЗ рд▓рдЧ рд░рд╣реЗ рд╣реИрдВредрд╕реНрдкреНрд░рд┐рдВрдЧ-рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рд╛рде рдРрд╕реА рдХреЛрдИ рд╕рдорд╕реНрдпрд╛ рдирд╣реАрдВ рд╣реИ - рдпрджрд┐ рдЖрдкрдХреЛ рдПрдиреАрдореЗрд╢рди рдХреЗ рд╕рдорд╛рдкрди рдмрд┐рдВрджреБ рдХреЛ рдмрджрд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ, рддреЛ рд╣рдо рд╡рд╕рдВрдд рдХреЛ рд╡рд╛рдВрдЫрд┐рдд рдЗрдВрдбреЗрдВрдЯ рдореЗрдВ рдЦрд┐рдВрдЪрд╛рд╡ рдпрд╛ рд╕рдВрдкреАрдбрд╝рд┐рдд рдХрд░рддреЗ рд╣реИрдВред
рдПрдХ рддрддреНрд╡ рдХреЛ рдорд╛рдЙрд╕ рдХрд░реНрд╕рд░ рдХреЛ рдПрдирд┐рдореЗрдЯ рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг; рд╢реАрд░реНрд╖ - рд╕реАрдПрд╕рдПрд╕ рдПрдиреАрдореЗрд╢рди, рдиреАрдЪреЗ - рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреАрдореЗрд╢рдирд╡рд╕рдВрдд рднреМрддрд┐рдХреА
рдПрдХ рд▓реЛрдб рдХреЗ рд╕рд╛рде рдПрдХ рд╕рд╛рдзрд╛рд░рдг рд╡рд╕рдВрдд рд▓реЗрдВред рд╡рд╣ рдЕрдм рднреА рдЖрд░рд╛рдо рдХрд░ рд░рд╣реА рд╣реИредрдЙрд╕реЗ рдереЛрдбрд╝рд╛ рдиреАрдЪреЗ рдЦреАрдВрдЪреЛред рдПрдХ рд▓реЛрдЪрджрд╛рд░ рдмрд▓ (), рдЬреЛ рд╡рд╕рдВрдд рдХреЛ рдЙрд╕рдХреА рдореВрд▓ рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯрд╛рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реИред рдЬрдм рд╣рдо рд╡рд╕рдВрдд рдЬрд╛рд░реА рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдпрд╣ рд╕рд╛рдЗрдирд╕реЙрдЗрдб рдХреЗ рд╕рд╛рде рд╕реНрд╡рд┐рдВрдЧ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░ рджреЗрдЧрд╛:рдШрд░реНрд╖рдг рдмрд▓ рдЬреЛрдбрд╝реЗрдВред рдЗрд╕реЗ рд╕реАрдзреЗ рд╡рд╕рдВрдд рдХреА рдЧрддрд┐ рдХреЗ рд▓рд┐рдП рдЖрдиреБрдкрд╛рддрд┐рдХ рд╣реЛрдиреЗ рджреЗрдВ () рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╕рдордп рдХреЗ рд╕рд╛рде рджреЛрд▓рдиреЛрдВ рдХрд╛ рдХреНрд╖рдп рд╣реЛрдЧрд╛:рд╣рдо рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдХрд┐ рд╣рдорд╛рд░рд╛ рд╕реНрдкреНрд░рд┐рдВрдЧ-рдПрдирд┐рдореЗрд╢рди рдЙрд╕реА рддрд░рд╣ рдПрдирд┐рдореЗрдЯреЗрдб рд╣реЛ, рдЬрд┐рд╕ рддрд░рд╣ рдПрдХ рд╕реНрдкреНрд░рд┐рдВрдЧ рд▓реЛрдЪ рдФрд░ рдШрд░реНрд╖рдг рдХреЗ рд╕рдВрдкрд░реНрдХ рдореЗрдВ рдЖрддрд╛ рд╣реИредрд╣рдо рдПрдиреАрдореЗрд╢рди рдХреЗ рд▓рд┐рдП рд╡рд╕рдВрдд рдХреА рд╕реНрдерд┐рддрд┐ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ
рдПрдирд┐рдореЗрд╢рди рдХреЗ рд╕рдВрджрд░реНрдн рдореЗрдВ, рдПрдиреАрдореЗрд╢рди рдХреЗ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдФрд░ рдЕрдВрддрд┐рдо рдореВрд▓реНрдп рдХреЗ рдмреАрдЪ рдХрд╛ рдЕрдВрддрд░ рд╡рд╕рдВрдд рдХрд╛ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рддрдирд╛рд╡ рд╣реИ редрдПрдиреАрдореЗрд╢рди рдХреА рд╢реБрд░реБрдЖрдд рд╕реЗ рдкрд╣рд▓реЗ, рд╣рдореЗрдВ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ: рд╡рд╕рдВрдд рджреНрд░рд╡реНрдпрдорд╛рди, рд▓реЛрдЪ рдХрд╛ рд╡рд╕рдВрдд рдЧреБрдгрд╛рдВрдХ , рдорд╛рдзреНрдпрдо рдХрд╛ рдШрд░реНрд╖рдг рдЧреБрдгрд╛рдВрдХ рддрдирд╛рд╡ рдлреВрдЯрддрд╛ рд╣реИ , рд╢реБрд░реВ рдХрд░рдиреЗ рдХреА рдЧрддрд┐ редрдПрдиреАрдореЗрд╢рди рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдкреНрд░рддрд┐ рд╕реЗрдХрдВрдб рдХрдИ рдмрд╛рд░ рджрд╕рд┐рдпреЛрдВ рдмрд╛рд░ рдХреА рдЬрд╛рддреА рд╣реИред рдПрдиреАрдореЗрд╢рди рдЧрдгрдирд╛рдУрдВ рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИредрдкреНрд░рддреНрдпреЗрдХ рдирдИ рдЧрдгрдирд╛ рдХреЗ рджреМрд░рд╛рди, рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рд╡рд╕рдВрдд рдХреА рдЧрддрд┐ рд╣реИ рдФрд░ рд╡рд╕рдВрдд рддрдирд╛рд╡ рдЕрдВрддрд┐рдо рдПрдиреАрдореЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рдкрд░ред рдПрдиреАрдореЗрд╢рди рдХреА рдкрд╣рд▓реА рдЧрдгрдирд╛ рдХреЗ рд▓рд┐рдП, редрд╣рдо рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП рдПрдиреАрдореЗрд╢рди рдХреА рд╕реНрдерд┐рддрд┐ рдХреА рдЧрдгрдирд╛ рдХрд░рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ!рдиреНрдпреВрдЯрди рдХреЗ рджреВрд╕рд░реЗ рдирд┐рдпрдо рдХреЗ рдЕрдиреБрд╕рд╛рд░, рд╕рднреА рд▓рд╛рдЧреВ рдмрд▓реЛрдВ рдХрд╛ рдпреЛрдЧ рдЗрд╕рдХреЗ рддреНрд╡рд░рдг рджреНрд╡рд╛рд░рд╛ рдЧреБрдгрд╛ рдХрд┐рдП рдЧрдП рд╢рд░реАрд░ рдХреЗ рджреНрд░рд╡реНрдпрдорд╛рди рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:
рджреЛ рдмрд▓ рдПрдХ рд╡рд╕рдВрдд рдкрд░ рдХрд╛рд░реНрдп рдХрд░рддреЗ рд╣реИрдВ - рд▓реЛрдЪрджрд╛рд░ рдмрд▓ рдФрд░ рдШрд░реНрд╖рдг рдмрд▓:
рд╣рдо рдмрд▓реЛрдВ рдХреЛ рдФрд░ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рд▓рд┐рдЦреЗрдВрдЧреЗ рдФрд░ рддреНрд╡рд░рдг рдЬреНрдЮрд╛рдд рдХрд░реЗрдВрдЧреЗ:
рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо рдПрдХ рдирдИ рдЧрддрд┐ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдкрд┐рдЫрд▓реЗ рдПрдиреАрдореЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рдореЗрдВ рдЧрддрд┐ рдХреЗ рдпреЛрдЧ рдФрд░ рд╕рдордп рдЕрдВрддрд░рд╛рд▓ рд╕реЗ рдЧреБрдгрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ:
рдЧрддрд┐ рдЬрд╛рдирдиреЗ рдХреЗ рдмрд╛рдж, рдЖрдк рд╡рд╕рдВрдд рдХреА рдирдИ рд╕реНрдерд┐рддрд┐ рдкрд╛ рд╕рдХрддреЗ рд╣реИрдВ:
рд╣рдореЗрдВ рд╕рд╣реА рд╕реНрдерд┐рддрд┐ рдорд┐рд▓реА, рдЗрд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдПрдВ!рдкреНрд░рджрд░реНрд╢рд┐рдд рд╣реЛрдиреЗ рдХреЗ рдмрд╛рдж, рдПрдХ рдирдпрд╛ рдПрдиреАрдореЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рд╢реБрд░реВ рдХрд░реЗрдВред рдПрдХ рдирдП рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд▓рд┐рдП, редрдПрдиреАрдореЗрд╢рди рдХрдм рдмрдВрдж рд╣реЛрдиреЗ рд▓рд╛рдпрдХ рд╣реИ рддрдерд╛ рдмрд╣реБрдд рдЫреЛрдЯрд╛ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ - рдЗрд╕ рд╕рдордп рд╡рд╕рдВрдд рдХреЗ рджреЛрд▓рди рд▓рдЧрднрдЧ рдЕрджреГрд╢реНрдп рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВредрдЬреЗрдПрд╕ рд╡рд╕рдВрдд рдПрдирд┐рдореЗрд╢рди
рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЖрд╡рд╢реНрдпрдХ рд╕реВрддреНрд░ рд╣реИрдВ, рдпрд╣ рд╣рдорд╛рд░реЗ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдХреЛ рд▓рд┐рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛ рд╣реБрдЖ рд╣реИ:class Spring {
constructor({ mass, tension, friction, initVelocity, from, to, onUpdate }) {
this.mass = mass;
this.tension = tension;
this.friction = friction;
this.initVelocity = initVelocity;
this.from = from;
this.to = to;
this.onUpdate = onUpdate;
}
startAnimation() {
const callDoAnimationTick = () => {
const isFinished = this.doAnimationTick();
if (isFinished) {
return;
}
this.nextTick = window.requestAnimationFrame(callDoAnimationTick);
};
callDoAnimationTick();
}
stopAnimation() {
const { nextTick } = this;
if (nextTick) {
window.cancelAnimationFrame(nextTick);
}
this.isFinished = true;
}
doAnimationTick() {
const {
mass, tension, friction, initVelocity, from, to,
previousTimestamp, prevVelocity, prevValue, onUpdate,
} = this;
const currentTimestamp = performance.now();
const deltaT = (currentTimestamp - (previousTimestamp || currentTimestamp))
/ 1000;
const normalizedDeltaT = Math.min(deltaT, 0.046);
let prevSafeVelocity = prevVelocity || initVelocity || 0;
let prevSafeValue = prevValue || from;
const springRestoringForce = -1 * tension * (prevSafeValue - to);
const dampingForce = -1 * prevSafeVelocity * friction;
const acceleration = (springRestoringForce + dampingForce) / mass;
const newVelocity = prevSafeVelocity + acceleration * normalizedDeltaT;
const newValue = prevSafeValue + newVelocity * normalizedDeltaT;
const precision = 0.001;
const isFinished = Math.abs(newVelocity) < precision
&& Math.abs(newValue - to) < precision;
onUpdate({ value: newValue, isFinished });
this.previousTimestamp = currentTimestamp;
this.prevValue = newValue;
this.prevVelocity = newVelocity;
this.isFinished = isFinished;
return isFinished;
}
}
рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдХреЛрдб рд╡рд╛рд▓рд╛ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:https://playcode.io/590645рдорд╛рдЗрдирд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдЗрдореНрдкреНрд░реВрд╡рдореЗрдВрдЯ
рд╣рдорд╛рд░реЗ рд╡рд╕рдВрдд рд╡рд░реНрдЧ рдХреЗ рд╕рд╛рде рдПрдХ рдЫреЛрдЯреА рд╕реА рд╕рдорд╕реНрдпрд╛ рд╣реИ - рдПрдиреАрдореЗрд╢рди рдХреА рдирдИ рд╢реБрд░реБрдЖрдд рдХреЗ рд╕рд╛рде рд╣рд░ рдмрд╛рд░ рдЕрд▓рдЧ рд╣реЛрдЧрд╛редрдкреБрд░рд╛рдиреЗ рд╕реЗрд▓ рдлреЛрди рдкрд░ рдЦреЛрд▓реЗрдВ -рд╣рдорд╛рд░реА рдЕрдзрд┐рдХрддрдо рд╕реАрдорд╛ 46 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдЧреАред рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдХрдВрдкреНрдпреВрдЯрд░ рдкрд░ рдЦреЛрд▓реЗрдВ -16-17 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рд╣реЛрдЧрд╛редрдмрджрд▓рдирд╛рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдПрдиреАрдореЗрд╢рди рдХреА рдЕрд╡рдзрд┐ рдФрд░ рдПрдирд┐рдореЗрдЯреЗрдб рдореВрд▓реНрдп рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрди рд╣рд░ рдмрд╛рд░ рдереЛрдбрд╝рд╛ рдЕрд▓рдЧ рд╣реЛрдЧрд╛редрдРрд╕рд╛ рд╣реЛрдиреЗ рд╕реЗ рд░реЛрдХрдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдпрд╣ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:рд▓реЛрдирд┐рд╢реНрдЪрд┐рдд рдореВрд▓реНрдп рдХреЗ рд░реВрдк рдореЗрдВред рдПрдХ рдирдП рдПрдиреАрдореЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рдХреЗ рд╕рд╛рде, рд╣рдореЗрдВ рдЧрдгрдирд╛ рдХрд░рдиреА рд╣реЛрдЧреА рдХрд┐ рдЕрдВрддрд┐рдо рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдмрд╛рдж рдХрд┐рддрдирд╛ рд╕рдордп рдмреАрдд рдЪреБрдХрд╛ рд╣реИ рдФрд░ рдЗрд╕рдореЗрдВ рдХрд┐рддрдиреЗ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рди рд╣реИрдВред рдпрджрд┐ рд╕рдордп рд╕реЗ рд╡рд┐рднрд╛рдЬреНрдп рдирд╣реАрдВ рд╣реИ, рдлрд┐рд░ рд╢реЗрд╖ рдХреЛ рдЕрдЧрд▓реЗ рдПрдиреАрдореЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рдкрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВредрдлрд┐рд░ рд╣рдо рдЧрдгрдирд╛ рдХрд░рддреЗ рд╣реИрдВ рддрдерд╛ рдЬрд┐рддрдиреА рдмрд╛рд░ рд╣рдордиреЗ рддрдп рдХрд┐рдпрд╛, рдорд╛рди рд▓рд┐рдпрд╛ред рдЕрдВрддрд┐рдо рдореВрд▓реНрдпрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛ рд░рд╣рд╛ рд╣реИредрдЙрджрд╛рд╣рд░рдг:рдЪрд▓реЛ 1 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЗрддреЗ рд╣реИрдВ, 32 рдорд┐рд▓реАрд╕реЗрдХрдВрдб рдЕрдВрддрд┐рдо рдФрд░ рдирдП рдПрдиреАрдореЗрд╢рди рдЕрдВрддрд░рд╛рд▓ рдХреЗ рдмреАрдЪ рдкрд╛рд░рд┐рдд рд╣реБрдЖредрд╣рдореЗрдВ 32 рдмрд╛рд░ рднреМрддрд┐рдХреА рдХреА рдЧрдгрдирд╛ рдХрд░рдиреА рд╣реИ, рддрдерд╛ ; рдЕрдВрддрд┐рдордЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЛ рджрд┐рдЦрд╛рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПредрдпрд╣ рд╡рд╣реА рд╣реИ рдЬреЛ DoAnimationTick рд╡рд┐рдзрд┐ рдХреА рддрд░рд╣ рджрд┐рдЦреЗрдЧрд╛:class Spring {
doAnimationTick() {
const {
mass, tension, friction, initVelocity, from, to,
previousTimestamp, prevVelocity, prevValue, onUpdate,
} = this;
const currentTimestamp = performance.now();
const fractionalDiff = currentTimestamp - (previousTimestamp || currentTimestamp);
const naturalDiffPart = Math.floor(fractionalDiff);
const decimalDiffPart = fractionalDiff % 1;
const normalizedDiff = Math.min(naturalDiffPart, 46);
let safeVelocity = prevVelocity || initVelocity || 0;
let safeValue = prevValue || from;
for (let i = 0; i < normalizedDiff; i++) {
const springRestoringForce = -1 * tension * (safeValue - to);
const dampingForce = -1 * safeVelocity * friction;
const acceleration = (springRestoringForce + dampingForce) / mass;
safeVelocity = safeVelocity + acceleration / 1000;
safeValue = safeValue + safeVelocity / 1000;
}
const precision = 0.001;
const isFinished = Math.abs(safeVelocity) < precision
&& Math.abs(safeValue - to) < precision;
onUpdate({ value: safeValue, isFinished });
this.previousTimestamp = currentTimestamp - decimalDiffPart;
this.prevValue = safeValue;
this.prevVelocity = safeVelocity;
this.isFinished = isFinished;
return isFinished;
}
}
рднреМрддрд┐рдХреА рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рдпрд╣ рд╡рд┐рдзрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛-рд╡рд╕рдВрдд рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ, рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рдЖрдк рдЕрдзрд┐рдХ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВредрдХреНрд╖реАрдгрди рдЧреБрдгрд╛рдВрдХ рдФрд░ рдЖрдВрддрд░рд┐рдХ рджреЛрд▓рди рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ
рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рджреЗрдЦрддреЗ рд╣реБрдП - рднрд╛рд░ рдХрд╛ рджреНрд░рд╡реНрдпрдорд╛рди, рд▓реЛрдЪ рдХрд╛ рдЧреБрдгрд╛рдВрдХ рдФрд░ рдорд╛рдзреНрдпрдо рдХреЗ рдШрд░реНрд╖рдг рдХреЗ рдЧреБрдгрд╛рдВрдХ - рдпрд╣ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЕрд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╡рд╕рдВрдд рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИред рд╕реНрдкреНрд░рд┐рдВрдЧ-рдПрдирд┐рдореЗрд╢рди рдмрдирд╛рддреЗ рд╕рдордп, рдЗрди рдЪрд░ рдХреЛ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рд░реВрдк рд╕реЗ рддрдм рддрдХ рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬрдм рддрдХ рдХрд┐ рдкреНрд░реЛрдЧреНрд░рд╛рдорд░ рдПрдирд┐рдореЗрд╢рди рдХреЗ "рд╕реНрдкреНрд░рд┐рдВрдЧрдиреЗрд╕" рд╕реЗ рд╕рдВрддреБрд╖реНрдЯ рди рд╣реЛ рдЬрд╛рдПредрд╣рд╛рд▓рд╛рдВрдХрд┐, рднреМрддрд┐рдХреА рдореЗрдВ рдПрдХ рдирдо рд╡рд╕рдВрдд рдХреЗ рд▓рд┐рдП рдХреБрдЫ рдЪрд░ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рджреЗрдЦрдХрд░ рдЖрдк рдмрддрд╛ рд╕рдХрддреЗ рд╣реИрдВ рдХрд┐ рд╡рд╕рдВрдд рдХреИрд╕реЗ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИредрдЙрдиреНрд╣реЗрдВ рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЗрдП рдиреНрдпреВрдЯрди рдХреЗ рджреВрд╕рд░реЗ рдирд┐рдпрдо рдХреЗ рд╣рдорд╛рд░реЗ рд╕рдореАрдХрд░рдг рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ:
рд╣рдо рдЗрд╕реЗ рдПрдХ рд╡рд┐рднреЗрджрдХ рд╕рдореАрдХрд░рдг рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд┐рдЦрддреЗ рд╣реИрдВ:
рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
рдХрд╣рд╛рдБ рдкреЗ рдШрд░реНрд╖рдг рдмрд▓ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗ рдмрд┐рдирд╛ рд╡рд╕рдВрдд рдХреЗ рджреЛрд▓рди рдХреА рдЖрд╡реГрддреНрддрд┐, - рдХреНрд╖реАрдгрди рдЧреБрдгрд╛рдВрдХредрдпрджрд┐ рд╣рдо рдЗрд╕ рд╕рдореАрдХрд░рдг рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рд╣рдореЗрдВ рдХрдИ рдХрд╛рд░реНрдп рдорд┐рд▓рддреЗ рд╣реИрдВрдХрд┐ рд╡рд╕рдВрдд рдмрдирд╛рдо рд╕рдордп рдХреА рд╕реНрдерд┐рддрд┐ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддреЗ рд╣реИрдВред рдореИрдВрдиреЗ рд╕реНрдкреЙрдЗрд▓рд░ рдХреЗ рдиреАрдЪреЗ рд╕рдорд╛рдзрд╛рди рдбрд╛рд▓ рджрд┐рдпрд╛, рддрд╛рдХрд┐ рд▓реЗрдЦ рдХреЛ рдмрд╣реБрдд рдЕрдзрд┐рдХ рди рдЦреАрдВрдЪрд╛ рдЬрд╛рдП, рд╣рдо рд╕реАрдзреЗ рдкрд░рд┐рдгрд╛рдо рдкрд░ рдЬрд╛рдПрдВрдЧреЗредрд╕рдореАрдХрд░рдг рд╕рдорд╛рдзрд╛рди, :
https://www.youtube.com/watch?v=uI2xt8nTOlQ:
:
:
1.
.
:
тАФ , :
:
.
, 0.
2.
.
:
тАФ , :
:
, 0. ,
.
, , , 0 ,
. , ?
3.
.
:
тАФ , :
:
, 0.
,
0, .. .
.
рдкрд░ рд╣рдореЗрдВ рдПрдХ рд╕рдореАрдХрд░рдг рдорд┐рд▓рддрд╛ рд╣реИ рдЬреЛ рдПрдХ рд╡рд╕рдВрдд рдХреЗ рдХрдВрдкрд┐рдд рдХрдВрдкрди рдХрд╛ рд╡рд░реНрдгрди рдХрд░рддрд╛ рд╣реИред рдХрдо, рдШрд░реНрд╖рдг рдмрд▓ рдХрдо рдФрд░ рдЕрдзрд┐рдХ рджреГрд╢реНрдп рдХрдВрдкрдиредрдкрд░рд╣рдо рдорд╣рддреНрд╡рдкреВрд░реНрдг рдШрд░реНрд╖рдг рдХреЗ рд╕рд╛рде рд╕рдореАрдХрд░рдг рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рддреНред рд╡рд╣ рд╕рдореАрдХрд░рдг рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ рд╕рдмрд╕реЗ рддреЗрдЬрд╝ рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрддреБрд▓рди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯрддрд╛ рд╣реИредрдкрд░рд╣рдореЗрдВ рдПрдХ рд╕рдореАрдХрд░рдг рдорд┐рд▓рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рд╕рд┐рд╕реНрдЯрдо рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ рд╕рдВрддреБрд▓рди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рд▓реМрдЯрддрд╛ рд╣реИред рдпрд╣ рд╕рд╛рде рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдзреАрдореА рд╣реЛрдЧреА; рд╡реГрджреНрдзрд┐ рдХреЗ рд╕рд╛рде рд╕рдВрддреБрд▓рди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдЕрднрд┐рд╕рд░рдг рдХреА рджрд░ рдШрдЯ рдЬрд╛рддреА рд╣реИредрд╡рд┐рднрд┐рдиреНрди рдХреЗ рд▓рд┐рдП рдПрдирд┐рдореЗрд╢рди рдХреЗ рдЙрджрд╛рд╣рд░рдг ред рдПрдирд┐рдореЗрд╢рди рд╕реНрдкреАрдб 4 рдЧреБрдирд╛ рдХрдо рд╣реЛ рдЧрдИредрдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╡рд╕рдВрдд рджреЛрд▓рдиреЛрдВ рдХреА рдПрдХ рдФрд░ рд╕рдордЭрдиреЗ рдпреЛрдЧреНрдп рд╡рд┐рд╢реЗрд╖рддрд╛ рд╣реИ - рдмрд┐рдирд╛ рдШрд░реНрд╖рдг рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦреЗ рд╡рд╕рдВрдд рджреЛрд▓рдиреЛрдВ рдХреА рдЕрд╡рдзрд┐:
рд╣рдореЗрдВ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рдорд┐рд▓реЗ:тЖТ, рдЬреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдПрдиреАрдореЗрд╢рди рдореЗрдВ рдХрд┐рддрдирд╛ рдЙрддрд╛рд░-рдЪрдврд╝рд╛рд╡ рд╣реЛрдЧрд╛редрд╕рдВрднрд╛рд╡рд┐рдд рдорд╛рди0 рд╕реЗ 1.рдХрдо, рд╡рд╕рдВрдд рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛ рдЕрдзрд┐рдХ рдХрдВрдкрдиред 0 рдкрд░, рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ рдШрд░реНрд╖рдг рдирд╣реАрдВ рд╣реЛрдЧрд╛, рд╡рд╕рдВрдд рдХреНрд╖реАрдгрди рдХреЗ рдмрд┐рдирд╛ рджреЛрд▓рди рдХрд░реЗрдЧрд╛; 1 рдкрд░, рд╡рд╕рдВрдд рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╣рд┐рдЪрдХрд┐рдЪрд╛рд╣рдЯ рдХреЗ рд╕рдВрддреБрд▓рди рдХреА рд╕реНрдерд┐рддрд┐ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред1 рд╕реЗ рдЕрдзрд┐рдХ рдореВрд▓реНрдп рд╣рдорд╛рд░реЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИрдВ - рд╡реЗ 1 рдХреЗ рд░реВрдк рдореЗрдВ рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдХреЗрд╡рд▓ рд╡реНрдпрд░реНрде рдореЗрдВ рд╣рдорд╛рд░реЗ рдПрдиреАрдореЗрд╢рди рдХреЛ рдмрд╛рд╣рд░ рдирд┐рдХрд╛рд▓рддреЗ рд╣реИрдВредтЖТрдЬреЛ рдХрд╣реЗрдЧрд╛ рдХрд┐ рдПрдиреАрдореЗрд╢рди рдХрд┐рддрдиреЗ рд╕рдордп рддрдХ рдЪрд▓реЗрдЧрд╛редрдпрд╣ рдкреИрд░рд╛рдореАрдЯрд░ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдПрдШрд░реНрд╖рдг рдмрд▓ рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрддреЗ рд╣реБрдП рд╡рд╕рдВрдд рдХреЗ рдПрдХ рдХрдВрдкрди рдХреА рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдПрдиреАрдореЗрд╢рди рдХреА рдХреБрд▓ рдЕрд╡рдзрд┐ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдирд╣реАрдВредрдЕрдм рд╣рдо рд▓реЛрдЪ рдХреЗ рдЧреБрдгрд╛рдВрдХ рдФрд░ рдорд╛рдзреНрдпрдо рдХреЗ рдШрд░реНрд╖рдг рдХреЗ рдЧреБрдгрд╛рдВрдХ рдХреЛ рдЬрд╛рди рд╕рдХрддреЗ рд╣реИрдВ рддрдерд╛ рдФрд░ рдпрд╣ рдорд╛рдирддреЗ рд╣реБрдП :
рд╣рдо рдЗрд╕ рддрд░реНрдХ рдХреЛ рдХреЛрдб рдореЗрдВ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ:const getSpringValues = ({ dampingRatio, period }) => {
const mass = 1;
const tension = Math.pow(2 * Math.PI / period, 2);
const friction = 4 * Math.PI * dampingRatio / period;
return {
mass,
tension,
friction,
};
};
new Spring({
...getSpringValues({
dampingRatio: 0.3,
period: 0.6,
}),
from: 0,
to: 20,
onUpdate: () => { },
});
new Spring({
...getSpringValues({
dampingRatio: 1,
period: 0.2,
}),
from: 0,
to: 20,
onUpdate: () => { },
});
рдЕрдм рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдПрдХ getSpringValues тАЛтАЛрддрд░реАрдХрд╛ рд╣реИ рдЬреЛ рдорд╛рдирд╡-рдкрдардиреАрдп рдХреНрд╖реАрдгрди рдЧреБрдгрд╛рдВрдХ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ рджреЛрд▓рди рдХреА рдЕрд╡рдзрд┐ рдФрд░ рд╡рд╕рдВрдд рдХрд╛ рджреНрд░рд╡реНрдпрдорд╛рди, рдШрд░реНрд╖рдг рдХрд╛ рдЧреБрдгрд╛рдВрдХ рдФрд░ рд▓реЛрдЪ рдХрд╛ рдЧреБрдгрд╛рдВрдХ рд▓реМрдЯрд╛рддрд╛ рд╣реИредрдпрд╣ рд╡рд┐рдзрд┐ рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рд▓рд┐рдВрдХ рдкрд░ рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдореЗрдВ рд╣реИ, рдЖрдк рд╕рд╛рдорд╛рдиреНрдп рд╕рд┐рд╕реНрдЯрдо рдЧреБрдгреЛрдВ рдХреЗ рдмрдЬрд╛рдп рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:https://playcode.io/590645Vue рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреАрдореЗрд╢рди
Vue рдореЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдЖрд╕рд╛рдиреА рд╕реЗ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рджреЛ рдХрд╛рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдПрдХ рдЖрд╡рд░рдг рдШрдЯрдХ рдпрд╛ рд░рдЪрдирд╛-рдПрдкреА рд╡рд┐рдзрд┐ рд▓рд┐рдЦреЗрдВ редрдШрдЯрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреАрдореЗрд╢рди
рдЖрдЗрдП рдПрдХ рдШрдЯрдХ рд▓рд┐рдЦреЗрдВ рдЬреЛ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреНрд▓рд╛рд╕ рдХреЗ рдЙрдкрдпреЛрдЧ рдХреЛ рд░реЛрдХрддрд╛ рд╣реИредрдЗрд╕реЗ рд▓рд┐рдЦрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ, рдХрд▓реНрдкрдирд╛ рдХрд░реЗрдВ рдХрд┐ рд╣рдо рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ:<template>
<div>
<SpringWrapper
:mass="1"
:tension="170"
:friction="14"
:animationProps="{ x, y }"
:animate="true"
v-slot="{ x: newX, y: newY }"
>
<div :style="{ transform: `translate(${newX}px, ${newY}px)` }" />
</SpringWrapper>
</div>
</template>
<script>
import SpringWrapper from 'path/to/SpringWrapper';
export default {
components: {
SpringWrapper,
},
data() {
return {
x: 0,
y: 0,
};
},
mounted() {
setTimeout(() => {
this.x = 100;
this.y = 100;
}, 1000);
},
};
</script>
рд╣рдо рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ:- рдЖрдк рд╡рд╕рдВрдд рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
- рдПрдирд┐рдореЗрд╢рдирдкреНрд░реЙрдкреНрд╕ рдкреИрд░рд╛рдореАрдЯрд░ рдореЗрдВ, рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдирд╛ рд╕рдВрднрд╡ рдерд╛ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЪреЗрддрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ
- рдЪреЗрддрди рдкреИрд░рд╛рдореАрдЯрд░ рдиреЗ рдорд╛рди рдкрд╛рд╕ рдХрд┐рдпрд╛ рдХрд┐ рдХреНрдпрд╛ рдПрдиреАрдореЗрд╢рдирдкреНрд░реЙрдкреНрд╕ рдХреЛ рдПрдирд┐рдореЗрдЯреЗрдб рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП
- рдЬрдм рднреА рдлрд╝реАрд▓реНрдб рдПрдиреАрдореЗрд╢рдирдкреНрд░реЙрдкреНрд╕ рдореЗрдВ рдмрджрд▓рддреЗ рд╣реИрдВ, рддреЛ рдЙрдиреНрд╣реЗрдВ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдиреАрдореЗрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрджрд▓ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рд╕реНрдХреЛрдк рд╕реНрд▓реЙрдЯ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
рдкреВрд░реНрдг рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдХреЗ рд▓рд┐рдП, рдШрдЯрдХ рдХреЛ рдЕрднреА рднреА рд╡рд╕рдВрдд рдХреА рдЧрддрд┐ рдХреЛ рдмрджрд▓рдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рд▓реЗрдХрд┐рди рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╣рдо рдРрд╕рд╛ рдирд╣реАрдВ рдХрд░реЗрдВрдЧреЗредрд╣рдо рд╡рд┐рдХрд╛рд╕ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:const SpringWrapper = {
props: {
friction: { type: Number, default: 10 },
tension: { type: Number, default: 270 },
mass: { type: Number, default: 1 },
animationProps: { type: Object, required: true },
animate: { type: Boolean, required: true },
},
data: () => ({
actualAnimationProps: null,
}),
created() {
this.actualAnimationProps = this.animationProps;
this._springs = {};
},
watch: {
animationProps: {
deep: true,
handler(animationProps) {
const {
friction, tension, mass,
animate, actualAnimationProps, _springs,
} = this;
if (!animate) {
this.actualAnimationProps = animationProps;
return;
}
Object.entries(animationProps).forEach((([key, value]) => {
const _spring = _springs[key];
const actualValue = actualAnimationProps[key];
if (_spring && !_spring.isFinished) {
_spring.to = value;
return;
}
const spring = new Spring({
friction,
tension,
mass,
initVelocity: 0,
from: actualValue,
to: value,
onUpdate: ({ value }) => {
actualAnimationProps[key] = value;
},
});
spring.startAnimation();
_springs[key] = spring;
}));
}
},
animate(val) {
const { _springs } = this;
if (!val) {
Object.values(_springs).forEach((spring) => {
spring.stopAnimation();
})
this.actualAnimationProps = this.animationProps;
}
},
},
render() {
const { $scopedSlots, actualAnimationProps } = this;
return $scopedSlots.default(actualAnimationProps)[0];
},
};
рдПрдХ рдШрдЯрдХ рдХреЗ рд╕рд╛рде рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:https://playcode.io/591686/рд░рдЪрдирд╛-рдПрдкреАрдЖрдИ рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╡рд╕рдВрдд рдПрдиреАрдореЗрд╢рди
рдХрдВрдкреЛрдЬреАрд╢рди-рдПрдкреАрдЖрдИ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЬреЛ Vue 3.0 рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдЧрд╛, рд╣рдореЗрдВ рдХрдВрдкреЛрдЬреАрд╢рди-рдПрдкреА рдкреИрдХреЗрдЬ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ редрдЗрд╕реЗ рдЦреБрдж рд╕реЗ рдЬреЛрдбрд╝реЗрдВ:npm i @vue/composition-api
import Vue from 'vue'
import VueCompositionApi from '@vue/composition-api';
Vue.use(VueCompositionApi);
рдЕрдм рдЖрдЗрдП рд╕реЛрдЪрддреЗ рд╣реИрдВ рдХрд┐ рд╣рдо рдЕрдкрдиреА рдПрдиреАрдореЗрд╢рди рд╡рд┐рдзрд┐ рдХреЛ рдХреИрд╕реЗ рджреЗрдЦрдирд╛ рдЪрд╛рд╣реЗрдВрдЧреЗ:<template>
<div>
<div :style="{ transform: `translate(${x}px, ${y}px)` }" />
</div>
</template>
<script>
import useSpring from 'path/to/useSpring';
export default {
setup() {
const { x, y, animate } = useSpring({
mass: 1,
tension: 170,
friction: 10,
x: 0,
y: 0,
});
setTimeout(() => {
x.value = 100;
y.value = 100;
}, 1000);
return {
x,
y,
animate,
};
},
};
</script>
рд╣рдо рдкрд╕рдВрдж рдХрд░реЗрдВрдЧреЗ:- рдЖрдк рд╡рд╕рдВрдд рдХреЗ рдЧреБрдгреЛрдВ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ
- рдлрд╝рдВрдХреНрд╢рди рдЙрди рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЗ рд╕рд╛рде рдПрдХ рдСрдмреНрдЬреЗрдХреНрдЯ рд▓реЗрддрд╛ рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдирд┐рдореЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
- рдлрд╝рдВрдХреНрд╢рди рдкрд░рд┐рдХрд▓рд┐рдд рд░реИрдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЧрдпрд╛ред рд╕реЗрдЯрд░реНрд╕ рдЙрди рдореВрд▓реНрдпреЛрдВ рдХреЛ рд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВрдЧреЗ рдЬрд┐рдиреНрд╣реЗрдВ рд╣рдо рдЗрдирдкреБрдЯ рдХреЗ рд░реВрдк рдореЗрдВ рдЪреЗрддрди рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ; рдЧреЗрдЯреНрд╕ рдПрдХ рдПрдирд┐рдореЗрдЯреЗрдб рдорд╛рди рд▓реМрдЯрд╛рдПрдЧрд╛
- рдлрд╝рдВрдХреНрд╢рди рдиреЗ рдЪреЗрддрди рдЪрд░ рд▓реМрдЯрд╛рдпрд╛, рдЬреЛ рдЗрд╕ рдмрд╛рдд рдХреЗ рд▓рд┐рдП рдЬрд╝рд┐рдореНрдореЗрджрд╛рд░ рд╣реЛрдЧрд╛ рдХрд┐ рд╣рдореЗрдВ рдПрдиреАрдореЗрд╢рди рдХреЛ рдЪрд▓рд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
рдЬреИрд╕рд╛ рдХрд┐ рдШрдЯрдХ рдХреЗ рдорд╛рдорд▓реЗ рдореЗрдВ, рд╣рдо рд╡рд╕рдВрдд рдЧрддрд┐ рдХреЗ рдЕрдиреБрдХреВрд▓рди рдХреЛ рдирд╣реАрдВ рдЬреЛрдбрд╝реЗрдВрдЧреЗ рддрд╛рдХрд┐ рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рди рдХрд░реЗрдВредрд╣рдо рдПрдХ рд╡рд┐рдзрд┐ рдмрдирд╛рдирд╛ рд╢реБрд░реВ рдХрд░рддреЗ рд╣реИрдВ:import { reactive, computed, ref, watch } from '@vue/composition-api';
import { Spring } from '@cag-animate/core';
const useSpring = (initialProps) => {
const {
mass, tension, friction,
animate: initialAnimate,
...restInitialProps
} = initialProps;
const actualProps = reactive(restInitialProps);
const springs = {};
const mirrorProps = {};
Object.keys(initialProps).forEach(key => {
mirrorProps[key] = computed({
get: () => actualProps[key],
set: val => {
const _spring = springs[key];
const actualValue = actualProps[key];
if (!mirrorProps.animate.value) {
actualProps[key] = val;
return
}
if (_spring && !_spring.isFinished) {
_spring.to = val;
return;
}
const spring = new Spring({
friction,
tension,
mass,
initVelocity: 0,
from: actualValue,
to: val,
onUpdate: ({ value }) => {
actualProps[key] = value;
},
});
spring.startAnimation();
springs[key] = spring;
},
});
});
mirrorProps.animate = ref(initialAnimate || true);
watch(() => mirrorProps.animate.value, (val) => {
if (!val) {
Object.entries(springs).forEach(([key, spring]) => {
spring.stopAnimation();
actualProps[key] = spring.to;
});
}
});
return mirrorProps;
};
export default useSpring;
рд╕реИрдВрдбрдмреЙрдХреНрд╕ рдХрдореНрдкреЛрдЬреАрд╢рди-рдПрдкреА рд╡рд┐рдзрд┐ рдФрд░ рдЗрд╕рдХреЗ рдЙрдкрдпреЛрдЧ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:https://playcode.io/591812/рдЖрдЦрд╝рд┐рд░реА рд╢рдмреНрдж
рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдПрдирд┐рдореЗрд╢рди рдХреА рдмреБрдирд┐рдпрд╛рджреА рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреА рдЬрд╛рдВрдЪ рдХреА рдФрд░ рдЙрдиреНрд╣реЗрдВ Vue рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ред рд▓реЗрдХрд┐рди рд╣рдорд╛рд░реЗ рдкрд╛рд╕ рдЕрднреА рднреА рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП рдЬрдЧрд╣ рд╣реИ - Vue- рдШрдЯрдХреЛрдВ рдореЗрдВ рдЖрдк рдЖрд░рдВрднреАрдХрд░рдг рдХреЗ рдмрд╛рдж рдирдП рдХреНрд╖реЗрддреНрд░реЛрдВ рдХреЛ рдЬреЛрдбрд╝рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ, рд╡рд╕рдВрдд рдХреА рдЧрддрд┐ рдореЗрдВ рдмрджрд▓рд╛рд╡ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВредрд╕рдЪ рд╣реИ, рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рдЕрдкрдиреЗ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХреЛ рд▓рд┐рдЦрдирд╛ рдмрд┐рд▓реНрдХреБрд▓ рднреА рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ: рдкреЙрдкрдореЛрд╢рди рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рддреИрдпрд╛рд░ рд╕реНрдкреНрд░рд┐рдВрдЧ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ ред рдЖрдк Vue рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрд╡рд░рдг рд▓рд┐рдЦ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рд╣рдордиреЗ рдКрдкрд░ рдХрд┐рдпрд╛ рдерд╛редрдЕрдВрдд рддрдХ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рдзрдиреНрдпрд╡рд╛рдж!рдкреНрд░рдпреБрдХреНрдд рд╕рд╛рдордЧреНрд░реА