ViewTransition: ready ããããã£
Baseline
2025
æè¿å©ç¨å¯è½
October 2025以éããã®æ©è½ã¯ææ°ã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã³ãã©ã¦ã¶ã¼ã§åä½ãã¾ããå¤ã端æ«ããã©ã¦ã¶ã¼ã§ã¯åä½ããªããã¨ãããã¾ãã
ready 㯠ViewTransition ã¤ã³ã¿ã¼ãã§ã¤ã¹ã®èªã¿åãå°ç¨ããããã£ã§ãæ¬ä¼¼è¦ç´ ããªã¼ã使ããããã¥ã¼é·ç§»ã®ã¢ãã¡ã¼ã·ã§ã³ãå§ã¾ãã¨ãã«å±¥è¡ããããããã¹ (Promise) ã§ãã
ready ã¯ãã©ã³ã¸ã·ã§ã³ãå§ããããªãå ´åã«æå¦ããã¾ããããã¯ãä¾ãã° view-transition-name ãéè¤ãã¦ããããDocument.startViewTransition() ã«æ¸¡ãããã³ã¼ã«ããã¯ãæå¦ããããããã¹ãçºçããããè¿ããããããªã©ãè¨å®ãã¹ãåå ã§ããå¯è½æ§ãããã¾ãã
å¤
ãããã¹ (Promise) ã§ãã
ä¾
次ã®ä¾ã§ã¯ãready ã使ç¨ãã¦ãã¯ãªãã¯æã«ã¦ã¼ã¶ã¼ã®ã«ã¼ã½ã«ä½ç½®ããåºããç¬èªã®åå½¢ã¬ãã¼ã«ãã¥ã¼é·ç§»ãéå§ãã¦ãã¾ããã¢ãã¡ã¼ã·ã§ã³ã¯ ã¦ã§ãã¢ãã¡ã¼ã·ã§ã³ API ã«ãã£ã¦æå®ããã¦ãã¾ãã
// æå¾ã®ã¯ãªãã¯ã¤ãã³ããä¿å
let lastClick;
addEventListener("click", (event) => (lastClick = event));
function spaNavigate(data) {
// ãã® API ã«å¯¾å¿ãã¦ããªããã©ã¦ã¶ã¼ã®ããã®ãã©ã¼ã«ããã¯
if (!document.startViewTransition) {
updateTheDOMSomehow(data);
return;
}
// ã¯ãªãã¯ä½ç½®ãåå¾ããããç»é¢ã®ä¸å¤®ã¸ãã©ã¼ã«ããã¯ãã
const x = lastClick?.clientX ?? innerWidth / 2;
const y = lastClick?.clientY ?? innerHeight / 2;
// æãé ãã³ã¼ãã¼ã¾ã§ã®è·é¢ãåå¾
const endRadius = Math.hypot(
Math.max(x, innerWidth - x),
Math.max(y, innerHeight - y),
);
// ãã©ã³ã¸ã·ã§ã³ã使
const transition = document.startViewTransition(() => {
updateTheDOMSomehow(data);
});
// æ¬ä¼¼è¦ç´ ã使ãããã®ãå¾
ã¤
transition.ready.then(() => {
// ã«ã¼ãã®æ°ãããã¥ã¼ãã¢ãã¡ã¼ã·ã§ã³
document.documentElement.animate(
{
clipPath: [
`circle(0 at ${x}px ${y}px)`,
`circle(${endRadius}px at ${x}px ${y}px)`,
],
},
{
duration: 500,
easing: "ease-in",
// ã¢ãã¡ã¼ã·ã§ã³ãããæ¬ä¼¼è¦ç´ ãæå®
pseudoElement: "::view-transition-new(root)",
},
);
});
}
ãã®ã¢ãã¡ã¼ã·ã§ã³ã«ã¯ä»¥ä¸ã® CSS ãå¿ è¦ã§ããæ¢å®ã®ã¢ãã¡ã¼ã·ã§ã³ããªãã«ããå¤ããã¥ã¼ã¨æ°ãããã¥ã¼ã®ç¶æ ãæ··ããåããªãããã«ãã¾ãï¼æ°ããç¶æ ã¯ãã¥ã¼é·ç§»ã®é·ç§»ã§ã¯ãªããå¤ãç¶æ ã®ããä¸ã«ãã¯ã¤ããããã¾ãï¼ã
::view-transition-image-pair(root) {
isolation: auto;
}
::view-transition-old(root),
::view-transition-new(root) {
animation: none;
mix-blend-mode: normal;
display: block;
}
仿§æ¸
| 仿§æ¸ |
|---|
| CSS View Transitions Module Level 1 > # dom-viewtransition-ready > |