Experimental: ì´ ê¸°ë¥ì ì¤íì ì¸ ê¸°ë¥ì
ëë¤.
íë¡ëì
íê²½ìì ì¬ì©í기 ì ì ë¸ë¼ì°ì í¸íì± í를 주ì ê¹ê² íì¸íì¸ì.
Invalid slug for templ/sidebar: View Transitions API
View Transitions APIë ìë¡ ë¤ë¥¸ DOM ìí ê°ì ì ëë©ì´ì ì íì ì½ê² ë§ë¤ ì ìë ë©ì»¤ëì¦ì ì ê³µíë ëìì í ë¨ê³ë¡ DOM ì½í ì¸ ë¥¼ ì ë°ì´í¸í ì ììµëë¤.
ê°ë ë° ì¬ì©ë²ë·° ì í(View Transition)ì ì¬ì©ìì ì¸ì§ ë¶í를 ì¤ì´ê³ ë§¥ë½ì ì ì§íë©° ì í리ì¼ì´ì ì ìí ëë ë·° ê°ì ì´ëí ë ì¸ì§ëë ë¡ë© ì§ì° ìê°ì ì¤ì´ëë° ë리 ì¬ì©ëë ëìì¸ ìµì ì ëë¤.
íì§ë§ ì¹ìì ë·° ì íì ë§ëë ê²ì ì§ê¸ê¹ì§ë ì´ë ¤ì ìµëë¤. ë¨ì¼ íì´ì§ ì í리ì¼ì´ì (SPA)ìì ìí ê° ì íìë ìë¹í ìì CSSì JavaScript를 ìì±í´ì¼ íë ê²½í¥ì´ ìììµëë¤.
ì½ê¸° ìì¹ ìì¤, ì´ì í¼ë, ì´ìí ë¼ì´ë¸ ìì ì림 ëìê³¼ ê°ì ì ê·¼ì± ë¬¸ì ê° ì ì½í ì¸ ì ì´ì ì½í ì¸ ê° DOMì í꺼ë²ì ì¡´ì¬í ë ë°ìí ì ììµëë¤. ëí, SPAê° ìë ì¼ë° ì¹ì¬ì´í¸ ë±ìì 문ì ê° ë·° ì íì´ ë¶ê°ë¥í©ëë¤.
View Transitions APIë íìí DOM ë³ê²½ ë° ì í ì ëë©ì´ì ì í¨ì¬ ì½ê² ì²ë¦¬í ì ìë ë°©ë²ì ì ê³µí©ëë¤.
ì°¸ê³ : The View Transitions APIë íì¬ ë¬¸ì ê° ë·° ì íì ì§ìíì§ ìì§ë§, í¥í ì¬ìì í¬í¨ë ìì ì´ë©° íì¬ íë°í ìì ì¤ì ëë¤.
기본ì ì¸ ë·° ì í ë§ë¤ê¸°ì를 ë¤ì´, SPAìë íì ë§í¬ê° í´ë¦ëê±°ë ìë²ìì ì
ë°ì´í¸ê° í¸ìëë ë±ì ì´ë²¤í¸ì ëí ìëµì¼ë¡ ì ì½í
ì¸ ë¥¼ ê°ì ¸ì¤ê³ DOMì ì
ë°ì´í¸íë 기ë¥ì´ í¬í¨ë ì ììµëë¤. 기본 ë·° ì í ë°ëª¨ììë í´ë¦í ì¬ë¤ì¼ì 기ë°ì¼ë¡ ìë¡ì´ ì ì²´ í¬ê¸° ì´ë¯¸ì§ë¥¼ íìíë displayNewImage()
í¨ìë¡ ì´ ê¸°ë¥ì ë¨ìííìµëë¤. ë¸ë¼ì°ì ìì ì§ìíë ê²½ì°ìë§ View Transition API를 í¸ì¶íë updateView()
í¨ì ìì ì´ ê¸°ë¥ì 캡ìííìµëë¤.
function updateView(event) {
// ì´ë²¤í¸ê° <a> íê·¸ìì ì¤íëëì§, <img> íê·¸ìì ì¤ííëì§ì ë°ë¼ ì°¨ì´ë¥¼ ì²ë¦¬í©ëë¤.
const targetIdentifier = event.target.firstChild || event.target;
const displayNewImage = () => {
const mainSrc = `${targetIdentifier.src.split("_th.jpg")[0]}.jpg`;
galleryImg.src = mainSrc;
galleryCaption.textContent = targetIdentifier.alt;
};
// ë·° ì íì ì§ìíì§ ìë ë¸ë¼ì°ì 를 ìí í´ë°±ì
ëë¤.
if (!document.startViewTransition) {
displayNewImage();
return;
}
// ë·° ì íì ì¬ì©í©ëë¤.
const transition = document.startViewTransition(() => displayNewImage());
}
ì´ ì½ëë íìëë ì´ë¯¸ì§ ê°ì ì íì ì²ë¦¬íë ë° ì¶©ë¶í©ëë¤. ì§ì ë¸ë¼ì°ì ììë ì´ì ì´ë¯¸ì§ì 캡ì ìì ì ì´ë¯¸ì§ì 캡ì ì¼ë¡ì ë³ê²½ì´ ë¶ëë¬ì´ í¬ë¡ì¤ íì´ë(기본 ë·° ì í)ë¡ íìë©ëë¤. ë¹ì§ì ë¸ë¼ì°ì ììë ì¬ì í ìëíì§ë§, ë©ì§ ì ëë©ì´ì ì ì ê³µëì§ ììµëë¤.
ëí startViewTransition()
ì ë·° ì í íë¡ì¸ì¤ì ì¬ë¬ ë¶ë¶ì ëë¬í ëë§ë¤ ì½ë를 ì¤íí ì ìëë¡ ì¬ë¬ íë¡ë¯¸ì¤ë¥¼ í¬í¨íë ViewTransition
ì¸ì¤í´ì¤ë¥¼ ë°ííë¤ë ì ë ì¸ê¸í ê°ì¹ê° ììµëë¤.
ë·° ì íì´ ì´ë»ê² ìëíëì§ ì´í´ë³´ê² ìµëë¤.
document.startViewTransition()
ì´ í¸ì¶ëë©´, APIë íì¬ íì´ì§ì ì¤í¬ë¦°ì·ì ì°ìµëë¤.
ê·¸ë° ë¤ì startViewTransition()
ì ì ë¬ë ì½ë°±(ì´ ê²½ì°, displayNewImage
)ì´ í¸ì¶ëì´ DOMì´ ë³ê²½ë©ëë¤. ì½ë°±ì´ ì±ê³µì ì¼ë¡ ì¤íëë©´ ViewTransition.updateCallbackDone
íë¡ë¯¸ì¤ê° ì´íëì´ DOM ì
ë°ì´í¸ì ìëµí ì ììµëë¤.
APIë íì´ì§ì ì ìí를 ì¤ìê° ííì¼ë¡ 캡ì²í©ëë¤.
APIë ë¤ìê³¼ ê°ì êµ¬ì¡°ë¡ ìì¬ ìì í¸ë¦¬ë¥¼ 구ì±í©ëë¤.
::view-transition ââ ::view-transition-group(root) ââ ::view-transition-image-pair(root) ââ ::view-transition-old(root) ââ ::view-transition-new(root)
::view-transition
ì 모ë ë·° ì íì í¬í¨íê³ ë¤ë¥¸ 모ë íì´ì§ ì½í
ì¸ ìì ìì¹íë ë·° ì í ì¤ë²ë ì´ì 루í¸ì
ëë¤.::view-transition-old
ë ì´ì íì´ì§ ë·°ì ì¤í¬ë¦°ì·ì´ê³ , ::view-transition-new
ë ì íì´ì§ ë·°ì ì¤ìê° ííì
ëë¤. ì´ ë ê°ì§ 모ë <img>
ëë <video>
ì ê°ì ë°©ìì¼ë¡ ëì²´ë ì½í
ì¸ ë¡ ë ëë§ëë¯ë¡ object-fit
ë° object-position
ê³¼ ê°ì í¸ë¦¬í ìì±ì ì¬ì©íì¬ ì¤íì¼ì ì§ì í ì ììµëë¤.ì í ì ëë©ì´ì
ì´ ì¤íëë ¤ê³ íë©´ ViewTransition.ready
íë¡ë¯¸ì¤ê° ì´íëë©°, ê¸°ë³¸ê° ëì ì¬ì©ì ì§ì ìë°ì¤í¬ë¦½í¸ ì ëë©ì´ì
ì ì¤ííì¬ ìëµí ì ììµëë¤.
ì´ì íì´ì§ ë·°ë opacity
1ìì 0ì¼ë¡ ì ëë©ì´ì
ì ì ì©íê³ , ìë¡ì´ ë·°ë opacity
를 0ìì 1ë¡ ì ëë©ì´ì
ì ì ì©íë©° 기본 í¬ë¡ì¤ íì´ëê° ìì±ë©ëë¤.
ì í ì ëë©ì´ì
ì´ ì¢
ë£ ìíì ëë¬íë©´, ViewTransition.finished
íë¡ë¯¸ì¤ê° ì´íëì´ ìëµí ì ììµëë¤.
íì¬ DOM ì
ë°ì´í¸ ì ë³ê²½ëë 모ë ë¤ë¥¸ ììë ëì¼í ì ëë©ì´ì
ì ì¬ì©íì¬ ì íë©ëë¤. ë¤ë¥¸ ììì 기본 "루í¸" ì ëë©ì´ì
ê³¼ ë¤ë¥¸ ì ëë©ì´ì
ì ì ì©íë ¤ë©´ view-transition-name
ìì±ì ì¬ì©íì¬ ìì를 구ë¶í ì ììµëë¤. ìëë ììì
ëë¤.
figcaption {
view-transition-name: figure-caption;
}
ë·° ì í 측면ìì íì´ì§ì ëë¨¸ì§ ë¶ë¶ê³¼ 구ë¶í기 ìí´ <figcaption>
ììì figure-caption
ì´ë¼ë view-transition-name
ì ì§ì íìµëë¤.
ì´ CSS를 ì ì©íë©´, ìì¬ ìì í¸ë¦¬ë ì´ì ë¤ìê³¼ ê°ì´ íìë©ëë¤.
::view-transition ââ ::view-transition-group(root) â ââ ::view-transition-image-pair(root) â ââ ::view-transition-old(root) â ââ ::view-transition-new(root) ââ ::view-transition-group(figure-caption) ââ ::view-transition-image-pair(figure-caption) ââ ::view-transition-old(figure-caption) ââ ::view-transition-new(figure-caption)
ë ë²ì§¸ ìì¬ ìì ì¸í¸ì ì¡´ì¬ë¡ <figcaption>
ìë§ ë³ëì ë·° ì í ì¤íì¼ì ì ì©í ì ììµëë¤. ìë¡ ë¤ë¥¸ ì´ì ë° ì íì´ì§ ë·° 캡ì²ë ìë¡ ìì í ë¶ë¦¬ëì´ ì²ë¦¬ë©ëë¤.
view-transition-name
ì ê°ì none
ì ì ì¸í 모ë ê°ì ì¬ì©í ì ìì¼ë©°, í¹í none
ê°ì í´ë¹ ììê° ë·° ì íì ì°¸ì¬íì§ ììì ì미í©ëë¤.
ì ëë©ì´ì ì¬ì©ì ì§ì íê¸°ì°¸ê³ :
view-transition-name
ì ê³ ì í´ì¼ í©ëë¤. ë§ì½ ë ëë§ë ë ìììview-transition-name
ì´ ê°ì¼ë©´,ViewTransition.ready
ê° ê±°ë¶ëê³ ì íì´ ê±´ëë°ì´ì§ëë¤.
ë·° ì í ìì¬ ìììë 기본 CSS ì ëë©ì´ì ì´ ì ì©ë©ëë¤. (참조 íì´ì§ì ìì¸í ì¤ëª ëì´ ììµëë¤).
í¹í ëì´
, ëë¹
, ìì¹
ë° ë³í
ì ëí ì íìë ë¶ëë¬ì´ êµì°¨ íì´ë ì ëë©ì´ì
ì´ ì¬ì©ëì§ ììµëë¤. ëì , ëì´ ë° ëë¹ ì íì ë¶ëë¬ì´ ì¤ì¼ì¼ë§ ì ëë©ì´ì
ì ì ì©í©ëë¤. ë°ë©´ ìì¹ì ë³í ì íì ììì ë¶ëë¬ì´ ì´ë ì ëë©ì´ì
ì ì ì©í©ëë¤.
ì¼ë° CSS를 ì¬ì©íì¬ ìíë ë°©ìì¼ë¡ 기본 ì ëë©ì´ì ì ìì í ì ììµëë¤.
ì를 ë¤ì´ ìë를 ë³ê²½í ì ììµëë¤.
::view-transition-old(root),
::view-transition-new(root) {
animation-duration: 0.5s;
}
ì¢ ë í¥ë¯¸ë¡ì´ ê²ì ì´í´ë³´ê² ìµëë¤. <figcaption>
ì ëí ì¬ì©ì ì§ì ì ëë©ì´ì
ì
ëë¤.
@keyframes grow-x {
from {
transform: scaleX(0);
}
to {
transform: scaleX(1);
}
}
@keyframes shrink-x {
from {
transform: scaleX(1);
}
to {
transform: scaleX(0);
}
}
::view-transition-old(figure-caption),
::view-transition-new(figure-caption) {
height: auto;
right: 0;
left: auto;
transform-origin: right center;
}
::view-transition-old(figure-caption) {
animation: 0.25s linear both shrink-x;
}
::view-transition-new(figure-caption) {
animation: 0.25s 0.25s linear both grow-x;
}
ì¬ê¸°ìë ì¬ì©ì ì ì CSS ì ëë©ì´ì
ì ë§ë¤ì´ ::view-transition-old(figure-caption)
ë° ::view-transition-new(figure-caption)
ìì¬ ììì ì ì©íìµëë¤. ëí ë ììì ë¤ë¥¸ ì¬ë¬ ì¤íì¼ì ì¶ê°íì¬ ê°ì ìì¹ì ì ì§íê³ ê¸°ë³¸ ì¤íì¼ì´ ì¬ì©ì ì ì ì ëë©ì´ì
ì ë°©í´íì§ ìëë¡ íìµëë¤.
ëí ìë³´ë¤ ë ê°ë¨íê³ ë ë©ì§ 결과를 ë§ë¤ì´ ë´ë ë¤ë¥¸ ì í ìµì
ë ë°ê²¬íìµëë¤. ìµì¢
<figcaption>
ë·° ì íì ë¤ìê³¼ ê°ì´ ìì±ëììµëë¤.
figcaption {
view-transition-name: figure-caption;
}
::view-transition-old(figure-caption),
::view-transition-new(figure-caption) {
height: 100%;
}
기본ì ì¼ë¡ ::view-transition-group
ì ì´ì ë·°ì ì ë·° ê°ì ëë¹ì ëì´ë¥¼ ì íí기 ë문ì ì´ ë°©ë²ì´ ìëí©ëë¤. ë ìí 모ëì ê³ ì ë ëì´
를 ì¤ì íê¸°ë§ íë©´ ìëí©ëë¤.
JavaScriptë¡ ì ëë©ì´ì ì ì´íê¸°ì°¸ê³ : View Transitions API를 ì¬ì©í ë¶ëë½ê³ ê°ë¨í ì íìë ëª ê°ì§ ë¤ë¥¸ ì¬ì©ì ì§ì ìì ê° í¬í¨ëì´ ììµëë¤.
document.startViewTransition()
ë©ìëë ì¬ë¬ íë¡ë¯¸ì¤ 멤ë²ë¥¼ í¬í¨íë ViewTransition
ê°ì²´ ì¸ì¤í´ì¤ë¥¼ ë°ííë©°, ì´ ì¸ì¤í´ì¤ìë ì íì ë¤ìí ìíì ëë¬í ë JavaScript를 ì¤íí ì ìë ì¬ë¬ íë¡ë¯¸ì¤ 멤ë²ê° ììµëë¤. ì를 ë¤ì´, ìì¬ ìì í¸ë¦¬ê° ìì±ëê³ ì ëë©ì´ì
ì´ ììëë©´ ViewTransition.ready
ê° ì´íëê³ , ì ëë©ì´ì
ì´ ìë£ëê³ ì íì´ì§ ë·°ê° ì¬ì©ììê² íìëê³ ìí¸ ìì©íë©´ ViewTransition.finished
ê° ì´íë©ëë¤.
ì를 ë¤ì´, ë¤ì JavaScript를 ì¬ì©íì¬ í´ë¦ ì ì¬ì©ìì 커ì ìì¹ìì ë°ìíë ìí ë·° ì íì ìì±í ì ìì¼ë©°, Web Animations 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 ì ëë©ì´ì ì ëê³ ì´ì ë·° ìíì ì ë·° ìíê° ì´ë¤ ìì¼ë¡ë í¼í©ëì§ ìê³ , ìë¡ì´ ìíê° ì íëë ê²ì´ ìëë¼ ì´ì ìí ìë¡ "ì§ìì§ëë¡" íë ¤ë©´, ë¤ì CSSë íìí©ëë¤.
::view-transition-image-pair(root) {
isolation: auto;
}
::view-transition-old(root),
::view-transition-new(root) {
animation: none;
mix-blend-mode: normal;
display: block;
}
ì¸í°íì´ì¤
ViewTransition
ë·° ì íì ëíë´ë©°, ì íì´ ë¤ë¥¸ ìí(ì: ì ëë©ì´ì ì¤í ì¤ë¹ ëë ì ëë©ì´ì ìë£)ì ëë¬í ë ë°ìíê±°ë, ì íì ìì í ê±´ëë¸ ì ìë 기ë¥ì ì ê³µí©ëë¤.
Document.startViewTransition()
ì ë·° ì íì ììíê³ ì´ë¥¼ ëíë´ë ViewTransition
ê°ì²´ë¥¼ ë°íí©ëë¤.
view-transition-name
ì íí ììì ë³ëì ìë³ ì´ë¦ì ì ê³µíê³ ë£¨í¸ ë·° ì íê³¼ ë³ëì ë·° ì íì ì°¸ì¬íëë¡ íê±°ë none
ê°ì´ ì§ì ë ê²½ì° ë·° ì íì ìííì§ ìëë¡ í©ëë¤.
::view-transition
모ë ë·° ì íì í¬í¨íê³ ë¤ë¥¸ 모ë íì´ì§ ì½í ì¸ ìì ìì¹íë ë·° ì í ì¤ë²ë ì´ì 루í¸ì ëë¤.
::view-transition-group()
ë¨ì¼ ë·° ì íì 루í¸ì ëë¤.
::view-transition-image-pair()
ë·° ì íì ì´ì ë·°ì ì ë·°(ì í ì ê³¼ í)를 ìí 컨í ì´ëì ëë¤.
::view-transition-old()
ì í ì ì´ì ë·°ì ëí ì ì ì¤í¬ë¦°ì·ì ëë¤.
::view-transition-new()
ì í í ìë¡ì´ ë·°ì ëí ì¤ìê° ííì ëë¤.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4