ViewTransition: types ããããã£
Baseline
2026
æè¿å©ç¨å¯è½
January 2026以éããã®æ©è½ã¯ææ°ã®ãã¼ã¸ã§ã³ã®ç«¯æ«ããã³ãã©ã¦ã¶ã¼ã§åä½ãã¾ããå¤ã端æ«ããã©ã¦ã¶ã¼ã§ã¯åä½ããªããã¨ãããã¾ãã
types 㯠ViewTransition ã¤ã³ã¿ã¼ãã§ã¤ã¹ã®èªã¿åãå°ç¨ããããã£ã§ãViewTransitionTypeSet ã§ããããã®ãã¥ã¼é·ç§»ã«è¨å®ãããåã«ã¢ã¯ã»ã¹ãããã夿´ããããããã¨ãã§ãã¾ãã
å¤
ViewTransitionTypeSet ã§ãããã㯠Set 風ãªãã¸ã§ã¯ãã§ãããclear()ãadd()ãdelete() ãªã©ã®ã¡ã½ãããå©ç¨ãã¦ããã¥ã¼é·ç§»ã«é©ç¨ããã¦ããã¿ã¤ãããã®å ´ã§å¤æ´ãããã¨ãã§ãã¾ãã
ä¾
>åºæ¬çãªä½¿ãæ¹
ãã®ä¾ã§ã¯ã2 ã¤ã®ç°ãªãã³ã³ãã³ãéã§é·ç§»ãä¼´ãåºæ¬çãªææ¸ãè¨è¼ãã¦ãã¾ãã3 ã¤ã®ãã¿ã³ãæå®ãã¦ããããããããé·ç§»ãéå§ãã¾ãããtype 屿§ãããããç°ãªãå¤ã«è¨å®ãããã¨ã§ãé·ç§»ã«ç°ãªã種é¡ã®ã¢ãã¡ã¼ã·ã§ã³ãé©ç¨ãã¦ãã¾ãã
HTML
ãã®ãã¼ã¯ã¢ããã«ã¯ãã³ã³ãã³ããå«ãåä¸ã® <p> è¦ç´ ã¨ããã¥ã¼é·ç§»ãéå§ããããã® 3 ã¤ã® <button> è¦ç´ ãããã¾ãã
<p>ãããç§ã®åãã¦ã®ã³ã³ãã³ãã§ããæ°ã«å
¥ã£ã¦ããã ããã¨ãããªãã</p>
<div>
<button id="default">Default</button>
<button id="slide">Slide</button>
<button id="flip">Flip</button>
</div>
JavaScript
ãã®ã¹ã¯ãªããã§ã¯ããã¿ã³ã¨æ¬æã®åç §ã使ãã2 ã¤ã®ç°ãªãã³ã³ãã³ãã2ã¤ã®å®æ°ã«æ ¼ç´ããããã«ä½¿ç¨ãã¾ãã
const defaultBtn = document.getElementById("default");
const slideBtn = document.getElementById("slide");
const flipBtn = document.getElementById("flip");
const content = document.querySelector("p");
const first =
"ãããç§ã®åãã¦ã®ã³ã³ãã³ãã§ããæ°ã«å
¥ã£ã¦ããã ããã¨ãããªãã";
const second = "ãããç§ã® 2 ã¤ç®ã®ã³ã³ãã³ãã§ãã1 ã¤ç®ããè¯ãã§ãããï¼";
次ã«ããã¿ã³ã« click ã¤ãã³ãã®ãªã¹ãã¼ã追å ãã¾ãããã¿ã³ãã¯ãªãã¯ãããã¨ãchangeContent() 颿°ãå®è¡ããã¾ãã
defaultBtn.addEventListener("click", changeContent);
slideBtn.addEventListener("click", changeContent);
flipBtn.addEventListener("click", changeContent);
æå¾ã«ãchangeContent() 颿°ãå®ç¾©ãã¾ããã¾ããstartViewTransition() ã¡ã½ãããå¼ã³åºãã¦ã³ã³ãã³ããæ´æ°ãããã©ã³ã¸ã·ã§ã³ãå§ã¾ãããã«ãã¾ããããã¦ãè¿ããã ViewTransition ãªãã¸ã§ã¯ãã vt ã¨ãã宿°ã«æ ¼ç´ãã¾ããstartViewTransition() å
ã§ã¯ãupdate ã³ã¼ã«ããã¯ããæ®µè½ã® textContent ã first ã®æååã¨çãããã©ããã調ã¹ã¾ããçããå ´åã¯ãsecond ã®æååã«è¨å®ãã¾ããçãããªãå ´åã¯ãfirst ã®æååã«è¨å®ãã¾ãã
changeContent() 颿°ã®å¾åã§ã¯ãclick ã¤ãã³ãã®å¯¾è±¡ã¨ãªãè¦ç´ ã®å¤ã調ã¹ã¾ãã
- ãã¹ã©ã¤ãããã¿ã³ã®å ´åã¯ã
vt.types.add("slide")ã使ç¨ãã¦ãã¢ã¯ãã£ããªãã¥ã¼é·ç§»ã®åã«slideåã追å ãã¾ãã - ãFlipããã¿ã³ã®å ´åã¯ã
vt.types.add("flip")ã使ç¨ãã¦ãã¢ã¯ãã£ããªãã¥ã¼é·ç§»ã®åã«flipåã追å ãã¾ãã - ãããã©ã«ãããã¿ã³ãæ¼ãããå ´åã¯ãä½ããã®å¦çãè¡ãã¾ããããã®å ´åãããã©ã«ãã®ãã¥ã¼é·ç§»ã§ããã¯ãã¹ãã§ã¼ãã¢ãã¡ã¼ã·ã§ã³ã使ç¨ãã¾ãã
function changeContent(e) {
const vt = document.startViewTransition({
update() {
content.textContent === first
? (content.textContent = second)
: (content.textContent = first);
},
});
if (e.target === slideBtn) {
vt.types.add("slide");
} else if (e.target === flipBtn) {
vt.types.add("flip");
}
}
CSS
ãã®ã¹ã¿ã¤ã«ã§ã¯ãã¾ã :active-view-transition æ¬ä¼¼ã¯ã©ã¹ã使ç¨ãã¦ãä¸é£ã®ã«ã¼ã«ã使ãã¾ãããããã®ã¹ã¿ã¤ã«ã¯ããã¥ã¼é·ç§»ã®ç¨®é¡ã«ãããããããã¥ã¼é·ç§»ãã¢ã¯ãã£ããªã¨ãã¯å¸¸ã«é©ç¨ããã¾ããview-transition-name ã«ã¯ none ã®å¤ã :root ã«é©ç¨ãã¦ãã¾ããããã¯ã<p> è¦ç´ ã«ã¯ view-transition-name ã¨ã㦠content ãæå®ãã¦ãã¾ããããã以å¤ã®è¦ç´ ã¯é·ç§»æã«ææããã¦ã¢ãã¡ã¼ã·ã§ã³ããªãããã«ããããã§ãã
html:active-view-transition {
:root {
view-transition-name: none;
}
p {
view-transition-name: content;
}
}
次ã«ã:active-view-transition-type() æ¬ä¼¼ã¯ã©ã¹ã使ç¨ãã¦ã2 ã¤ã®ãã¹ããããã¹ã¿ã¤ã«ãããã¯ã使ãã¾ãã1 ã¤ç®ã¯ãã¢ã¯ãã£ããªãã¥ã¼é·ç§»ã®åã slide ã®å ´åã«ã®ã¿é©ç¨ããããããã¯ã§ã2 ã¤ç®ã¯ãã¢ã¯ãã£ããªãã¥ã¼é·ç§»ã®åã flip ã®å ´åã«ã®ã¿é©ç¨ããããããã¯ã§ããããããã®ãããã¯ã§ã¯ã::view-transition-old() ããã³ ::view-transition-new() ã¨ããæ¬ä¼¼è¦ç´ ã使ç¨ãã¦ãslide ãã£ããã£ã°ã«ã¼ãã®é·åºãã¥ã¼ã¨é·å
¥ãã¥ã¼ã«ãç¬èªã® animation-name å¤ãé©ç¨ãã¦ãã¾ãã
çµæçã«ã次ã®ããã«ãªãã¾ãã
- é·ç§»åã
slideã®å ´åãå¤ãã³ã³ãã³ããã¥ã¼ãå·¦ã¸ã¹ã©ã¤ããã¦æ¶ããæ°ããã³ã³ãã³ããã¥ã¼ãå³ããã¹ã©ã¤ããã¦è¡¨ç¤ºããã¾ãã - é·ç§»åã
flipã®å ´åãå¤ãã³ã³ãã³ããã¥ã¼ã¯æ°´å¹³æ¹åã« 90 度å転ãã¦é表示ã¨ãªããæ°ããã³ã³ãã³ããã¥ã¼ãå転ãã¦è¡¨ç¤ºããã¾ãã - ãã以å¤ã®å ´åã¯ãããã©ã«ãã®ã¯ãã¹ãã§ã¼ããã¥ã¼é·ç§»ã®ã¢ãã¡ã¼ã·ã§ã³ã使ç¨ããã¾ãã
html:active-view-transition-type(slide) {
&::view-transition-old(content) {
animation-name: slide-out-to-left;
}
&::view-transition-new(content) {
animation-name: slide-in-from-right;
}
}
html:active-view-transition-type(flip) {
&::view-transition-old(content) {
animation-name: flip-out;
}
&::view-transition-new(content) {
animation-name: flip-in;
animation-delay: 0.6s;
}
}
æå¾ã«ã@keyframes ã¢ãã¡ã¼ã·ã§ã³ãããã¯ã使ç¨ãã¦ãåååç
§ããã¢ãã¡ã¼ã·ã§ã³ãå®ç¾©ãã¾ããåæã«ããã¹ã¦ã®ãã£ããã£ã°ã«ã¼ãã«å¯¾ãã¦ç¬èªã® animation-duration ãè¨å®ããé·ç§»ã¢ãã¡ã¼ã·ã§ã³ã®é度ããããã«é
ããã¾ãã
@keyframes slide-out-to-left {
to {
translate: -100vw 0;
}
}
@keyframes slide-in-from-right {
from {
translate: 100vw 0;
}
}
@keyframes flip-out {
to {
rotate: x 90deg;
}
}
@keyframes flip-in {
from {
rotate: x -90deg;
}
}
::view-transition-group(*) {
animation-duration: 0.6s;
}
çµæ
ãã®ä¾ã¯æ¬¡ã®ããã«è¡¨ç¤ºããã¾ãã
ããããã®ãã¿ã³ãã¯ãªãã¯ãã¦ã¿ã¦ãDOM ã®å¤æ´å 容ã¯ã©ã®å ´åã§ãåãã§ãããã¢ãã¡ã¼ã·ã§ã³ãç°ãªããã¨ã«æ³¨ç®ãã¦ãã ãããããã¯ãã©ã®ãã¿ã³ãæ¼ããããã«ãã£ã¦ç°ãªãé·ç§»åãè¨å®ããã¦ããããã§ãï¼"Default" ã®å ´åã¯é·ç§»åãè¨å®ããã¾ããï¼ã
é©ç¨ä¾
MPA ã®è¤æ°ã®é·ç§»åã®ä¾ï¼ã½ã¼ã¹ã³ã¼ãï¼ãã覧ãã ãããããã§ã¯ãç°ãªãé·ç§»åã§è¡¨ãããããã²ã¼ã·ã§ã³ã®ç¨®é¡ã«å¿ãã¦ãããã¥ã¡ã³ãéã®è¡¨ç¤ºé·ç§»ã«ãã¾ãã¾ãªã¢ãã¡ã¼ã·ã§ã³ãé©ç¨ããæ¹æ³ã示ãã¦ãã¾ããé·ç§»åã¯ãããã²ã¼ã·ã§ã³ä¸ã« JavaScript ã«ãã£ã¦åçã«æ±ºå®ããã¾ãã
pageswap ããã³ pagereveal ã¤ãã³ãã使ç¨ãã¦ç°ãªãææ¸éãç§»åã§ã¯ããã®ä¾ãé ã追ã£ã¦èª¬æãã¦ãã¾ãã
仿§æ¸
| 仿§æ¸ |
|---|
| CSS View Transitions Module Level 2 > # dom-viewtransition-types > |