Web Animations APIã§ãŠã§ãã¢ãã¡ãŒã·ã§ã³ã®åãè§£ãæŸã¡ãŸããããããã°ã©ã ã«ããå¶åŸ¡ãã¿ã€ã ã©ã€ã³ç®¡çããããŠæ»ããã§é«æ§èœãªã¢ãã¡ãŒã·ã§ã³ãäœæããããã®ãã¹ããã©ã¯ãã£ã¹ãåŠã³ãŸãã
Web Animations API: ããã°ã©ã ã«ããã¢ãã¡ãŒã·ã§ã³å¶åŸ¡ãšã¿ã€ã ã©ã€ã³ç®¡ç
Web Animations API (WAAPI) ã¯ãåŸæ¥ã®CSSã¢ãã¡ãŒã·ã§ã³ãJavaScriptããŒã¹ã®ã¢ãã¡ãŒã·ã§ã³ã©ã€ãã©ãªãšæ¯èŒããŠãéçºè ã«æ¯é¡ã®ãªãå¶åŸ¡æ§ãšæè»æ§ãæäŸãããŠã§ãã¢ãã¡ãŒã·ã§ã³æè¡ã«ããã倧ããªé²æ©ãæå³ããŸãããã®å æ¬çãªã¬ã€ãã§ã¯ãWAAPIã®äžæ žçãªæŠå¿µã§ããããã°ã©ã ã«ããã¢ãã¡ãŒã·ã§ã³å¶åŸ¡ãšã¿ã€ã ã©ã€ã³ç®¡çã«çŠç¹ãåœãŠããã®åŒ·åãªããŒã«ãç¿åŸããããã®å®è·µçãªäŸãæäŸããŸãã
Web Animations APIå ¥é
æŽå²çã«ããŠã§ãã¢ãã¡ãŒã·ã§ã³ã¯CSSã®ãã©ã³ãžã·ã§ã³ãã¢ãã¡ãŒã·ã§ã³ããŸãã¯jQuery animateãGSAPã®ãããªJavaScriptã¢ãã¡ãŒã·ã§ã³ã©ã€ãã©ãªã®ããããã䜿çšããŠå®çŸãããŠããŸãããCSSã¢ãã¡ãŒã·ã§ã³ã¯ãã©ãŠã¶ã®æé©åã«ããã·ã³ãã«ããšããã©ãŒãã³ã¹ã®å©ç¹ãæäŸããŸãããè€éãªã€ã³ã¿ã©ã¯ã·ã§ã³ã«å¿ èŠãªåçãªå¶åŸ¡ã«æ¬ ããããšããããããŸããäžæ¹ãJavaScriptã©ã€ãã©ãªã¯ãã倧ããªå¶åŸ¡ãæäŸããŸãããæ éã«å®è£ ããªããšããã©ãŒãã³ã¹ã«åœ±é¿ãäžããå¯èœæ§ããããŸãã
Web Animations APIã¯ãã¢ãã¡ãŒã·ã§ã³ã¿ã€ã ã©ã€ã³ãçŽæ¥æäœããããã®JavaScriptããŒã¹ã®ã€ã³ã¿ãŒãã§ãŒã¹ãæäŸããããšã§ãã®ã®ã£ãããåããéçºè ããã现ããªå¶åŸ¡ã§é«æ§èœãã€ã€ã³ã¿ã©ã¯ãã£ããªã¢ãã¡ãŒã·ã§ã³ãäœæã§ããããã«ããŸããWAAPIã¯ãCSSã¢ãã¡ãŒã·ã§ã³ãšåæ§ã«ãæé©åãããããã©ãŒãã³ã¹ã®ããã«ãã©ãŠã¶ã®ã¬ã³ããªã³ã°ãšã³ãžã³ã掻çšãã€ã€ãJavaScriptã®æè»æ§ãæäŸããŸãã
ããã°ã©ã ã«ããã¢ãã¡ãŒã·ã§ã³å¶åŸ¡
ããã°ã©ã ã«ããã¢ãã¡ãŒã·ã§ã³å¶åŸ¡ã¯ãWAAPIã®äž»èŠãªå©ç¹ã§ããããã«ãããéçºè ã¯ãŠãŒã¶ãŒã®ã€ã³ã¿ã©ã¯ã·ã§ã³ãã¢ããªã±ãŒã·ã§ã³ã®ç¶æ ããŸãã¯ããŒã¿ã®å€æŽã«åºã¥ããŠã¢ãã¡ãŒã·ã§ã³ãåçã«äœæã倿Žãå¶åŸ¡ã§ããŸãããã®ã¬ãã«ã®å¶åŸ¡ã¯ãCSSã¢ãã¡ãŒã·ã§ã³ã ãã§ã¯éæãå°é£ãŸãã¯äžå¯èœã§ãã
JavaScriptã«ããã¢ãã¡ãŒã·ã§ã³ã®äœæ
WAAPIã®åºæ¬çãªæ§æèŠçŽ ã¯ããã¹ãŠã®Element
ãªããžã§ã¯ãã§å©çšå¯èœãªanimate()
ã¡ãœããã§ãããã®ã¡ãœããã¯2ã€ã®åŒæ°ãåããŸãïŒ
- ããŒãã¬ãŒã : ã¢ãã¡ãŒã·ã§ã³ã®ããŸããŸãªæç¹ã§ã®ç¶æ ãå®çŸ©ãããªããžã§ã¯ãã®é åãåãªããžã§ã¯ãã¯ããŒãã¬ãŒã ã衚ããã¢ãã¡ãŒã·ã§ã³åããããããã£ãšãã®æç¹ã§ã®å€ãæå®ããŸãã
- ãªãã·ã§ã³: durationãeasingãdelayãiterationsãªã©ã®ã¢ãã¡ãŒã·ã§ã³ã¿ã€ãã³ã°ããããã£ãå«ããªããžã§ã¯ãã
以äžã¯ãèŠçŽ ã®äžéæåºŠãã¢ãã¡ãŒã·ã§ã³åããç°¡åãªäŸã§ãïŒ
const element = document.getElementById('myElement');
const animation = element.animate(
[
{ opacity: 0 },
{ opacity: 1 }
],
{
duration: 1000, // 1 second
easing: 'ease-in-out'
}
);
ãã®äŸã§ã¯ãanimation
倿°ã¯Animation
ãªããžã§ã¯ããä¿æããŠãããã¢ãã¡ãŒã·ã§ã³ã®åçãå¶åŸ¡ããããã®ã¡ãœãããæäŸããŸãã
ã¢ãã¡ãŒã·ã§ã³åçã®å¶åŸ¡
Animation
ãªããžã§ã¯ãã¯ãã¢ãã¡ãŒã·ã§ã³ã®ç¶æ
ãå¶åŸ¡ããããã®ã¡ãœãããæäŸããŸããããã«ã¯ä»¥äžãå«ãŸããŸãïŒ
play()
: ã¢ãã¡ãŒã·ã§ã³ãéå§ãŸãã¯åéããŸããpause()
: ã¢ãã¡ãŒã·ã§ã³ãäžæåæ¢ããŸããreverse()
: ã¢ãã¡ãŒã·ã§ã³ã®æ¹åãå転ãããŸããcancel()
: ã¢ãã¡ãŒã·ã§ã³ã忢ããèŠçŽ ããåé€ããŸããfinish()
: ã¢ãã¡ãŒã·ã§ã³ãæåŸãŸã§ã¹ãããããŸãã
ãããã®ã¡ãœããã®äœ¿ç𿹿³ã¯æ¬¡ã®ãšããã§ãïŒ
animation.play(); // Start the animation
setTimeout(() => {
animation.pause(); // Pause after 2 seconds
}, 2000);
setTimeout(() => {
animation.play(); // Resume after 4 seconds
}, 4000);
setTimeout(() => {
animation.reverse(); // Reverse after 6 seconds
}, 6000);
ã¢ãã¡ãŒã·ã§ã³ããããã£ã®åçãªå€æŽ
WAAPIã§ã¯ãã¢ãã¡ãŒã·ã§ã³ãéå§ãããåŸã§ãã¢ãã¡ãŒã·ã§ã³ã®ããããã£ãåçã«å€æŽã§ããŸããããã¯ãå€åããæ¡ä»¶ã«é©å¿ããã¬ã¹ãã³ã·ããªã¢ãã¡ãŒã·ã§ã³ãäœæããã®ã«ç¹ã«äŸ¿å©ã§ãã
Animation
ãªããžã§ã¯ãã®effect
ããã³timeline
ããããã£ãä»ããŠãã¢ãã¡ãŒã·ã§ã³ã®ã¿ã€ãã³ã°ããããã£ã«ã¢ã¯ã»ã¹ãã倿Žããããšãã§ããŸãã
// Change the duration of the animation
animation.effect.updateTiming({
duration: 2000 // Increase duration to 2 seconds
});
// Change the easing function
animation.effect.updateTiming({
easing: 'ease-out'
});
ã¿ã€ã ã©ã€ã³ç®¡ç
ã¿ã€ã ã©ã€ã³ç®¡çã¯WAAPIã®éèŠãªåŽé¢ã§ãããè€æ°ã®ã¢ãã¡ãŒã·ã§ã³ãåæã»èª¿æŽããŠãè€éã§å調ãã广ãäœæããããšãã§ããŸããWAAPIã¯ãã°ããŒãã«ãªããã¥ã¡ã³ãã¿ã€ã ã©ã€ã³ã®å¶åŸ¡ãã«ã¹ã¿ã ã¿ã€ã ã©ã€ã³ã®äœæãªã©ãã¢ãã¡ãŒã·ã§ã³ã¿ã€ã ã©ã€ã³ã管çããããã®ããã€ãã®ã¡ã«ããºã ãæäŸããŸãã
ããã¥ã¡ã³ãã¿ã€ã ã©ã€ã³ã®çè§£
ããã©ã«ãã§ã¯ãWAAPIã§äœæãããã¢ãã¡ãŒã·ã§ã³ã¯ããã¥ã¡ã³ãã¿ã€ã ã©ã€ã³ã«é¢é£ä»ããããŸããããã¯ãã©ãŠã¶ãŠã£ã³ããŠå ã®æéã®é²è¡ã衚ããŸããããã¥ã¡ã³ãã¿ã€ã ã©ã€ã³ã¯ãã©ãŠã¶ã«ãã£ãŠæé»çã«ç®¡çããããã®ã¿ã€ã ã©ã€ã³äžã®ã¢ãã¡ãŒã·ã§ã³ã¯ãã©ãŠã¶ã®ã¬ã³ããªã³ã°ãµã€ã¯ã«ãšåæãããŸãã
ããã¥ã¡ã³ãã¿ã€ã ã©ã€ã³ã«ã¯document.timeline
ããããã£ãä»ããŠã¢ã¯ã»ã¹ã§ããŸãã
ã«ã¹ã¿ã ã¿ã€ã ã©ã€ã³ã®äœæ
ã¢ãã¡ãŒã·ã§ã³ã®ã¿ã€ãã³ã°ãããé«åºŠã«å¶åŸ¡ããããã«ãAnimationTimeline
ã€ã³ã¿ãŒãã§ãŒã¹ã䜿çšããŠã«ã¹ã¿ã ã¿ã€ã ã©ã€ã³ãäœæã§ããŸããã«ã¹ã¿ã ã¿ã€ã ã©ã€ã³ã䜿çšãããšãã¢ãã¡ãŒã·ã§ã³ãããã¥ã¡ã³ãã¿ã€ã ã©ã€ã³ããåãé¢ãããããã®åçãç¬ç«ããŠå¶åŸ¡ã§ããŸãã
ã«ã¹ã¿ã ã¿ã€ã ã©ã€ã³ã®äœææ¹æ³ã¯æ¬¡ã®ãšããã§ãïŒ
const customTimeline = new AnimationTimeline();
ã¢ãã¡ãŒã·ã§ã³ãã«ã¹ã¿ã ã¿ã€ã ã©ã€ã³ã«é¢é£ä»ããã«ã¯ãAnimation
ãªããžã§ã¯ãã®setTimeline()
ã¡ãœããã䜿çšããå¿
èŠããããŸãã
animation.setTimeline(customTimeline);
ããã§ãã¢ãã¡ãŒã·ã§ã³ã¯ã«ã¹ã¿ã ã¿ã€ã ã©ã€ã³ã«ãã£ãŠå¶åŸ¡ãããã¿ã€ã ã©ã€ã³ã®ã¡ãœããã䜿çšããŠãã®åçãå¶åŸ¡ã§ããŸãã
ã¢ãã¡ãŒã·ã§ã³ã®åæ
ã¿ã€ã ã©ã€ã³ç®¡çã®äž»èŠãªå©ç¹ã®1ã€ã¯ãè€æ°ã®ã¢ãã¡ãŒã·ã§ã³ãåæããæ©èœã§ããWAAPIã¯ãåæãå®çŸããããã®ããã€ãã®ãã¯ããã¯ãæäŸããŸããããã«ã¯ä»¥äžãå«ãŸããŸãïŒ
- åãã¿ã€ã ã©ã€ã³ã䜿çšãã: è€æ°ã®ã¢ãã¡ãŒã·ã§ã³ãåãã¿ã€ã ã©ã€ã³ã«é¢é£ä»ããããšã§ãããããåæããŠåçãããããšãä¿èšŒã§ããŸãã
startTime
ã䜿çšãã: ã¢ãã¡ãŒã·ã§ã³ãªãã·ã§ã³ã§startTime
ããããã£ãæå®ããŠãã¿ã€ã ã©ã€ã³ã®éå§ã«å¯ŸããŠã¢ãã¡ãŒã·ã§ã³ã®éå§ãé å»¶ãããããšãã§ããŸããsequenceEffect
ã䜿çšãã:sequenceEffect
ã䜿çšããŠãã¢ãã¡ãŒã·ã§ã³ãç¹å®ã®é åºã§åçã§ããŸããgroupEffect
ã䜿çšãã:groupEffect
ã䜿çšããŠãã¢ãã¡ãŒã·ã§ã³ãåæã«åçã§ããŸãã
以äžã¯ãåãã¿ã€ã ã©ã€ã³ã䜿çšããŠ2ã€ã®ã¢ãã¡ãŒã·ã§ã³ãåæããäŸã§ãïŒ
const timeline = document.timeline;
const element1 = document.getElementById('element1');
const element2 = document.getElementById('element2');
const animation1 = element1.animate(
[
{ transform: 'translateX(0)' },
{ transform: 'translateX(100px)' }
],
{
duration: 1000,
timeline: timeline
}
);
const animation2 = element2.animate(
[
{ transform: 'translateY(0)' },
{ transform: 'translateY(100px)' }
],
{
duration: 1000,
timeline: timeline,
delay: 500 // Start 0.5 seconds after animation1
}
);
ãã®äŸã§ã¯ãanimation1
ãšanimation2
ã®äž¡æ¹ãããã¥ã¡ã³ãã¿ã€ã ã©ã€ã³ã«é¢é£ä»ããããŠããŸããanimation2
ã¯500ããªç§é
å»¶ãããŠãããããanimation1
ã0.5ç§éå®è¡ãããåŸã«åçãéå§ãããŸãã
WAAPIã䜿çšããããã®ãã¹ããã©ã¯ãã£ã¹
WAAPIã䜿çšããéã«æé©ãªããã©ãŒãã³ã¹ãšä¿å®æ§ã確ä¿ããããã«ã以äžã®ãã¹ããã©ã¯ãã£ã¹ãèæ ®ããŠãã ããïŒ
- DOMæäœãæå°éã«æãã: é床ãªDOMæäœã¯ããã©ãŒãã³ã¹ã«æªåœ±é¿ãäžããå¯èœæ§ããããŸãã
transform
ãopacity
ãªã©ãã¬ã€ã¢ãŠãã®ãªãããŒãåŒãèµ·ãããªãããããã£ãã¢ãã¡ãŒã·ã§ã³åããããã«ããŠãã ããã - ããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã䜿çšãã: GPUã§ãµããŒããããŠããããããã£ãã¢ãã¡ãŒã·ã§ã³åããããšã§ãããŒããŠã§ã¢ã¢ã¯ã»ã©ã¬ãŒã·ã§ã³ã掻çšããŸããããã«ãããã¢ãã¡ãŒã·ã§ã³ã®ããã©ãŒãã³ã¹ãå€§å¹ ã«åäžããŸãã
- ããŒãã¬ãŒã ãæé©åãã: äžèŠãªããŒãã¬ãŒã ã¯é¿ããŠãã ãããç®çã®ã¢ãã¡ãŒã·ã§ã³å¹æãéæããããã«å¿ èŠãªããŒãã¬ãŒã ã®ã¿ã䜿çšããŸãã
- ã€ãŒãžã³ã°é¢æ°ã广çã«äœ¿çšãã: æ»ããã§èªç¶ãªã¢ãã¡ãŒã·ã§ã³ãäœæããããã«ãé©åãªã€ãŒãžã³ã°é¢æ°ãéžæããŸããããŸããŸãªã€ãŒãžã³ã°é¢æ°ã詊ããŠãã¢ãã¡ãŒã·ã§ã³ã«æé©ãªãã®ãèŠã€ããŠãã ããã
- èŠçŽ ãšã¢ãã¡ãŒã·ã§ã³ããã£ãã·ã¥ãã: é »ç¹ã«äœ¿çšããèŠçŽ ãã¢ãã¡ãŒã·ã§ã³ããã£ãã·ã¥ããŠãåé·ãªDOMã«ãã¯ã¢ãããã¢ãã¡ãŒã·ã§ã³äœæãé¿ããŸãã
- è€éãªã¢ãã¡ãŒã·ã§ã³ã«ã¯requestAnimationFrameã䜿çšãã: ãã现ããªå¶åŸ¡ãå¿
èŠãªéåžžã«è€éãªã¢ãã¡ãŒã·ã§ã³ã«ã¯ãWAAPIãšçµã¿åãããŠ
requestAnimationFrame
ã䜿çšããããšãæ€èšããæé©ãªããã©ãŒãã³ã¹ãå®çŸããŸãã - ã¢ãã¡ãŒã·ã§ã³ã€ãã³ããåŠçãã:
animationstart
ãanimationend
ãanimationcancel
ãªã©ã®ã¢ãã¡ãŒã·ã§ã³ã€ãã³ãããªãã¹ã³ããŠãã¢ãã¡ãŒã·ã§ã³ã®ç¶æ å€åã«å¿çããŸãã
ãã©ãŠã¶äºææ§ãšPolyfill
Web Animations APIã¯ãChromeãFirefoxãSafariãEdgeãªã©ãçŸä»£ã®ãã©ãŠã¶ã§åªãããµããŒãã享åããŠããŸããããããå€ããã©ãŠã¶ã¯WAAPIãå®å
šã«ã¯ãµããŒãããŠããªãå ŽåããããŸããå€ããã©ãŠã¶ãšã®äºææ§ã確ä¿ããããã«ãweb-animations-js
polyfillãªã©ã®polyfillã䜿çšã§ããŸãã
ãããžã§ã¯ãã«polyfillãå«ããã«ã¯ãHTMLãã¡ã€ã«ã«æ¬¡ã®ã¹ã¯ãªããã¿ã°ã远å ããŸãïŒ
<script src="https://cdn.jsdelivr.net/npm/web-animations-js@2.3.2/web-animations.min.js"></script>
polyfillã¯ããã©ãŠã¶ãWAAPIããµããŒãããŠãããã©ãããèªåçã«æ€åºãããµããŒãããŠããªãå Žåã¯ãã©ãŒã«ããã¯å®è£ ãæäŸããŸãã
å®äžçã®äŸ
WAAPIã¯ã以äžãå«ãããŸããŸãªã¢ããªã±ãŒã·ã§ã³ã§äœ¿çšã§ããŸãïŒ
- UIãã©ã³ãžã·ã§ã³: ãã¥ãŒããŒãã«åºå ¥ãããèŠçŽ ã®ããã«ãæ»ããã§é åçãªUIãã©ã³ãžã·ã§ã³ãäœæããŸãã
- ã€ã³ã¿ã©ã¯ãã£ããªã¢ãã¡ãŒã·ã§ã³: ããŠã¹ã¯ãªãã¯ããããŒãã¹ã¯ããŒã«ãªã©ã®ãŠãŒã¶ãŒå ¥åã«å¿çããã€ã³ã¿ã©ã¯ãã£ããªã¢ãã¡ãŒã·ã§ã³ãå®è£ ããŸãã
- ããŒã¿å¯èŠå: ãã¬ã³ãããã¿ãŒã³ã匷調ããããã«ããŒã¿å¯èŠåãã¢ãã¡ãŒã·ã§ã³åããŸãã
- ã²ãŒã éçº: ã²ãŒã ã®ã¢ãã¡ãŒã·ã§ã³ããšãã§ã¯ããäœæããŸãã
- ããŒãã£ã³ã°ã¢ãã¡ãŒã·ã§ã³: ãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãåäžãããããã«ãèŠèŠçã«é åçãªããŒãã£ã³ã°ã¢ãã¡ãŒã·ã§ã³ãæäŸããŸãã
以äžã¯ãWAAPIãå®äžçã®ã·ããªãªã§ã©ã®ããã«äœ¿çšã§ãããã®ããã€ãã®äŸã§ãïŒ
äŸ1ïŒã¢ãã¡ãŒã·ã§ã³ä»ãããã²ãŒã·ã§ã³ã¡ãã¥ãŒ
ãã¿ã³ãã¯ãªãã¯ããããšãã«æšªããã¹ã©ã€ãã€ã³ããã¢ãã¡ãŒã·ã§ã³ä»ãããã²ãŒã·ã§ã³ã¡ãã¥ãŒãäœæããŸãã
äŸ2ïŒã¹ã¯ããŒã«ããŒã¹ã®ã¢ãã¡ãŒã·ã§ã³
èŠçŽ ããã¥ãŒããŒãã«åºå ¥ããããšãã«ããªã¬ãŒãããã¹ã¯ããŒã«ããŒã¹ã®ã¢ãã¡ãŒã·ã§ã³ãå®è£ ããŸããããã¯ããã©ã©ãã¯ã¹å¹æãäœæãããããŠãŒã¶ãŒãã¹ã¯ããŒã«ããã«ã€ããŠã³ã³ãã³ãã衚瀺ãããããããã«äœ¿çšã§ããŸãã
äŸ3ïŒã€ã³ã¿ã©ã¯ãã£ããªè£œåã·ã§ãŒã±ãŒã¹
ãŠãŒã¶ãŒãããŠã¹æäœã§è£œåç»åãå転ããã³ãºãŒã ã§ããã€ã³ã¿ã©ã¯ãã£ããªè£œåã·ã§ãŒã±ãŒã¹ãäœæããŸãã
çµè«
Web Animations APIã¯ã髿§èœã§ã€ã³ã¿ã©ã¯ãã£ããªãŠã§ãã¢ãã¡ãŒã·ã§ã³ãäœæããããã®åŒ·åãªããŒã«ã§ããããã°ã©ã ã«ããã¢ãã¡ãŒã·ã§ã³å¶åŸ¡ãšã¿ã€ã ã©ã€ã³ç®¡çãç¿åŸããããšã§ãéçºè ã¯é åçã§èŠèŠçã«èšŽãããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãäœæããããã®æ°ããªå¯èœæ§ãåãéãããšãã§ããŸããUIãã©ã³ãžã·ã§ã³ãããŒã¿å¯èŠåããŸãã¯ã²ãŒã ã¢ãã¡ãŒã·ã§ã³ãæ§ç¯ããŠããå Žåã§ããWAAPIã¯åµé çãªããžã§ã³ãå®çŸããããã«å¿ èŠãªæè»æ§ãšå¶åŸ¡ãæäŸããŸãã
Web Animations APIãåãå ¥ãããŠã§ãã¢ãã¡ãŒã·ã§ã³ã®ã¹ãã«ã次ã®ã¬ãã«ã«åŒãäžããŸãããããã®ã¬ã€ãã§èšåãããŠãããªãœãŒã¹ãæ¢çŽ¢ããããŸããŸãªãã¯ããã¯ã詊ããŠWAAPIã®å šãŠã®å¯èœæ§ãçºèŠããŠãã ãããããã©ãŒãã³ã¹ãæè»æ§ãå¶åŸ¡ã®çµã¿åããã«ãããWAAPIã¯ãŠã§ãã¢ãã¡ãŒã·ã§ã³éçºã®æšæºãšãªãæ å¢ãæŽã£ãŠããŸãã