ํ๋ฐํธ์๋ ๊ฐ๋ฐ์ ๊ฐ์ฅ ๋ง์ ์ํฅ์ ์ฃผ๋ ํฌ๋กฌ ๋ธ๋ผ์ฐ์ ์ ๋ฒ์ ๋ณ ๋ณ๊ฒฝ ์์ ํญ๋ชฉ์ ์ ๋ฆฌ ๋ฐ ๊ณต์ ํ๋ค.
๐ก ๊ฐ ํญ๋ชฉ์ Chrome Platform Status์ Roadmap๊ณผ ํ ๋ฌ๊ฐ์ blink-dev ํ๋ ์์ฝ์ ๋ฐํ์ผ๋ก ์ ๋ฆฌํ๋ค.
๐ก ๊ฐ ํญ๋ชฉ์ ๐ซ๋ ์ง์ ์ค๋จ ๋ฐ ์ ๊ฑฐ(Removed), โ ๏ธ๋ ์ง์ ์ค๋จ(Deprecated), โ ๋ ์๋ก์ด ๊ธฐ๋ฅ(Enabled by default), ๐งช๋ ๊ฐ๋ฐ์ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ(Trial)๋ฅผ ์๋ฏธํ๋ค.
๐ก ๊ฐ ํญ๋ชฉ ์ค ๊ธฐ์กด ์๋น์ค์ ๋ฏธ์น๋ ์ํฅ์ด ํฌ๋ค๊ณ ํ๋จํ ํญ๋ชฉ์ ์์ ๋ชฉ ๋ค์ ๐ ํ์๋ฅผ ํ๋ค.
๐ก ์ง์ ์ค๋จ ๋ฐ ์ ๊ฑฐ(๐ซ), ์ง์ ์ค๋จ(โ ๏ธ) ์ธ์ ํญ๋ชฉ์ ๊ณต์ ๊ฐ์น๊ฐ ์๋ค๊ณ ํ๋จํ ๊ฒฝ์ฐ์๋ง ํฌํจํ๋ค.
๐ก ๊ฐ๋ฐ์ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ(๐งช)๋ chrome://flags
์์ Experimental Web Platform features
ํญ๋ชฉ์ ํ์ฑํํด ์ฌ์ฉํ ์ ์๋ค.
๐ก ๊ฐ ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ Chrome Platform Status๋ฅผ ๊ทธ๋๋ก ์ธ์ฉํ๋ค.
document.domain
์ค์ ์(Setter) ์ง์ ์ค๋จ ๐display
์์ฑdisplay
, content-visibility
์ ์ ๋๋ฉ์ด์
์ฌ์ฉ ์ง์SVGUseElement
์ data:
URL ์ง์ ์ค๋จ ๋ฏธ๋ฆฌ ๋ณด๊ธฐzoom
์์ฑ ์ง์ ์ค๋จ ๐RTCPeerConnection.getStats()
์ฝ๋ฐฑ ๋ฐฉ์ ์ง์ ์ค๋จ@scope
๊ท์นshadowroot
์์ฑ ์ง์ ์ค๋จdocument.domain
์ค์ ์(Setter) ์ง์ ์ค๋จ ๐SOP(Same-Origin Policy)๋ ๋ธ๋ผ์ฐ์ ๋ณด์ ์ ์ฑ
์ผ๋ก, ๋ ํ์ด์ง๊ฐ ์๋ก ๋ค๋ฅธ ์ถ์ฒ(origin)์ผ ๋ ์ด ๋ ํ์ด์ง ์ฌ์ด์ ํต์ ์ ๋ง๋๋ค. ์๋ฅผ ๋ค์ด parent.example.com
ํ์ด์ง์ <iframe>
์ผ๋ก child.example.com
ํ์ด์ง๋ฅผ ๋ถ๋ฌ์ค๋ฉด ๊ธฐ๋ณธ์ ์ผ๋ก child.example.com
์ window.parent
๋ก ๋ถ๋ชจ์ฐฝ์ ์ ๊ทผํ ์ ์๊ณ , ์ด ๋ฐ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ค. ๊ธฐ์กด์๋ ์์ ๋๋ฉ์ธ์ด ๊ฐ์ ๊ฒฝ์ฐ, document.domain
์ค์ ์๋ฅผ ์ฌ์ฉํ์ฌ ์์ ๋๋ฉ์ธ(example.com
)์ผ๋ก ์ถ์ฒ๋ฅผ ๋ณ๊ฒฝํด SOP๋ฅผ ์ํํ ์ ์์๋ค. ๋ณด๋ค ๊ฐ๋ ฅํ ๋ณด์์ ์ํด ์ด ์ค์ ์๋ฅผ ์ง์ ์ค๋จํ๋ค. ์ง์ ์ค๋จ ๊ธฐ๊ฐ ๋์ document.domain
์ค์ ์๋ฅผ ํธ์ถํ ์๋ ์์ง๋ง ์ถ์ฒ๋ ๋ณํ์ง ์๋๋ค.
์ฌ์ฉ์๊ฐ ์ง์ chrome://flags
์์ Origin-keyed agent clusters
๊ธฐ๋ฅ์ ์ค์ ํด ๊ธฐ์กด์ฒ๋ผ document.domain
์ผ๋ก ์ถ์ฒ๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค. ํ์ง๋ง ๊ธฐ๋ณธ ์ต์
์ด ์๋๊ธฐ์ ๋์์ ์ฐพ๋ ๊ฒ์ด ์ข๋ค. ๊ฐ์ฅ ๊ฐ๋จํ ๋์์ window.postMessage
๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค.
// parent.example.com
window.addEventListener('message', (event) => {
if (event.origin !== 'http://child.example.com') {
return;
}
console.log(event.data); // ์๋
ํ์ธ์?
});
// child.example.com
window.postMessage('์๋
ํ์ธ์?', 'http://parent.example.com');
window.postMessage
์ ์์ธํ ์ฌ์ฉ๋ฒ ๋ฐ ๋ค๋ฅธ ๋์์ ์ฌ๊ธฐ๋ฅผ ์ฐธ๊ณ ํด๋ ์ข๋ค.
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
document.domain
setter.MutationEvent
๋ DOM ์์์ ๋ณ๊ฒฝ์ด ์์ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ๋ก, DOMSubtreeModified
, DOMNodeInserted
, DOMNodeRemoved
๋ฑ์ด ์๋ค.
element.addEventListener(
'DOMNodeInserted',
(event) => {
console.log('์๋ก์ด ์์๋ฅผ ๊ฐ์งํ์ต๋๋ค.', event.srcElement);
},
false
);
element.append(document.createElement('span'));
// ์๋ก์ด ์์๋ฅผ ๊ฐ์งํ์ต๋๋ค. <span></span>
์ด ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๋ฉด DOM ๋ณ๊ฒฝ์ ์ถ์ ํ ์ ์์ผ๋, ์ค๊ณ์ ๊ฒฐํจ๊ณผ ์น๋ช ์ ์ธ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ด์ ๋ก 2011๋ ์ ํ์ค์์ ํด์ถ๋์๋ค.
2012๋
์ ๋ ์์ ์ ์ธ MutationObserver
๊ฐ ๋ฑ์ฅํ์ฌ ํ์ฌ ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ์์ ์ด ์ด๋ฒคํธ ์ฌ์ฉ ์ ์ฝ์์ ๊ฒฝ๊ณ ๋ฅผ ๋
ธ์ถํ๋ค. ์์ง MutationEvent
๋ฅผ ์ฌ์ฉํ๋ค๋ฉด MutationObserver
๋ก ์ ํํ ๊ฒ์ ์ ๊ทน ๊ถ์ฅํ๋ค.
const observer = new MutationObserver((mutations) => {
for (const mutation of mutations) {
if (mutation.type === 'childList') {
console.log('์๋ก์ด ์์๋ฅผ ๊ฐ์งํ์ต๋๋ค.', ...mutation.addedNodes);
}
}
});
observer.observe(element, { childList: true });
element.append(document.createElement('span'));
// ์๋ก์ด ์์๋ฅผ ๊ฐ์งํ์ต๋๋ค. <span></span>
Chrome 115๋ถํฐ๋ Mutation ์ด๋ฒคํธ ์ฌ์ฉ ์ ์ข ๋ ๊ฐ๋ ฅํ ๊ฒฝ๊ณ ๋ฅผ ๋ ธ์ถํ๋ฉฐ, ๋ด๋ 7์ ๋ง ๋ฐฐํฌ ์์ ์ธ Chrome 127๋ถํฐ๋ ์์ ํด๋น API๋ฅผ ์ ๊ฑฐํ ์์ ์ด๋ค.
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
display
์์ฑdisplay
์์ฑ์ ์ต๋ 3๊ฐ์ ๊ฐ์ ๊ฐ์ด ํ ๋นํ ์ ์๋๋ก ๋ณ๊ฒฝํ๋ค. ์๋ก์ด display
๋์์ด ์ถ๊ฐ๋๋ ๊ฒ์ด ์๋, ๊ธฐ์กด์ ํ๋์ ๊ฐ์ผ๋ก๋ง ์ฌ์ฉํ๋ display
์์ฑ์ ์ข ๋ ๋ช
์์ ์ผ๋ก ํํํ๋๋ก ๊ตฌ๋ฌธ์ ๋ณ๊ฒฝํ ๊ฒ์ด๋ค.
๋จผ์ ์๊ธฐ ์์ ์ ์ ๋ ฌ์ ๊ฒฐ์ ํ๋ <display-outside>
์ ์์ ์์์ ์ ๋ ฌ์ ๊ฒฐ์ ํ๋ <display-inside>
๋ฅผ ๋ฐ๋ก ์ง์ ํ ์ ์๋ค.
๊ธฐ์กด(์ถ์ฝ ๋ฌธ๋ฒ) | ๋ค์ค ์์ฑ |
---|---|
block |
block flow |
inline-block |
inline flow-root |
table |
block table |
inline-table |
inline table |
flex |
block flex |
inline-flex |
inline flex |
grid |
block grid |
inline-grid |
inline grid |
list-item |
block flow list-item |
ํนํ inline-
์ ๋์ฌ๋ฅผ ๊ฐ์ง ๊ฐ์ ๋ ๊ฑฐ์ ๊ฐ(<display-legacy>
)์ผ๋ก ์ทจ๊ธํ๋ค. ๋งค๋ฒ ์๋ก์ด ์์ฑ์ ์ถ๊ฐํ ๋๋ง๋ค inline-{์์ฑ๋ช
}
์ ๊ฐ์ด ์ถ๊ฐํด์ผ ํ๋ ๋ฒ๊ฑฐ๋ก์์ ์ค์ธ ๊ฒ์ด๋ค. ๊ธฐ์กด ์์ฑ์ ๋๋ถ๋ถ ๋ค์ค ์์ฑ ํ๊ธฐ์ ์ถ์ฝ ๋ฌธ๋ฒ์ผ๋ก ์ทจ๊ธํ๋ค.
์๋ก ์ถ๊ฐ๋ flow
, flow-root
๋ flow layout์ ๊ฒฐ์ ํ๋ ์์ฑ์ผ๋ก, flow
๋ <display-outside>
์ ๊ฐ์ ๋ฐ๋ผ ๋ด๋ถ์ block-container๋ฅผ ์์ฑํ ์ง, inline-box๋ฅผ ์์ฑํ ์ง๋ฅผ ๊ฒฐ์ ํ๋ฉฐ, flow-root
๋ ํญ์ ์๋ก์ด block-container๋ฅผ ์์ฑํ๋ค.
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํ์ฌ CSS ์ ๋๋ฉ์ด์
์ ๋ชจ๋ document.timeline
์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ DocumentTimeline
์ ์ ๋๋ฉ์ด์
์๊ฐ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ค. DocumentTimeline
์ ๋ฌธ์๋ฅผ ์ฐ ํ ์ง๋ ๋ฐ๋ฆฌ์ด ๋จ์์ ์๊ฐ๊ฐ์ผ๋ก, ํ์ฌ CSS ์ ๋๋ฉ์ด์
์ด ๋ชจ๋ ๊ฒฝ๊ณผ ์๊ฐ์ ๊ธฐ๋ฐ์ผ๋ก ๋์ํ๋ค๋ ์๋ฏธ์ด๊ธฐ๋ ํ๋ค.
Chrome 115์์ ์ ์ ๋ฐ์ ์์ ์ธ ScrollTimeline
, ViewTimeline
์ ์์์ ์คํฌ๋กค ์์น๊ฐ์ ์ ๋๋ฉ์ด์
์ ์๊ฐ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ค.
๊ธฐ์กด์๋ ์์ ๊ฐ์ ์์ ๋ฅผ ๊ตฌํํ๊ธฐ ์ํด ์คํฌ๋ฆฝํธ๊ฐ ํ์์์ผ๋, ์๋กญ๊ฒ ์ถ๊ฐ๋๋ animation-timeline
์์ฑ๊ณผ scroll()
ํจ์๋ฅผ ์ฌ์ฉํ๋ฉด CSS๋ง์ผ๋ก๋ ์์ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ์ ์๋ค.
@keyframes animate-progress {
from {
transform: scaleX(0);
}
to {
transform: scaleX(1);
}
}
#progress {
position: fixed;
transform-origin: left center;
width: 100%;
height: 48px;
background-color: coral;
animation: animate-progress auto linear;
animation-timeline: scroll(root vertical);
}
scroll()
ํจ์์๋ ์คํฌ๋กค ์์๋ฅผ ์ง์ ํ๋ <scroller>
์ ๋ฐฉํฅ์ ์ง์ ํ๋ <axis>
๋ ๊ฐ์ง ์์ฑ์ ๋๊ธธ ์ ์๋ค. ์ธ์๋ฅผ ์๋ตํ๋ฉด <scroller>
๋ ๊ฐ์ฅ ๊ฐ๊น์ด ์คํฌ๋กค ์์๋ฅผ ์ฐพ๋ nearest
๋ฅผ, <axis>
๋ block
์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ง์ ํ๋ค.
๋ ๋ค๋ฅธ ViewTimeline
์ animation-timeline
์ view()
ํจ์๋ฅผ ์ฌ์ฉํด ์ง์ ํด ์ฌ์ฉํ ์ ์๋ค. ScrollTimeline
์ด ์คํฌ๋กค ์งํ๋๋ฅผ ์๊ฐ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ค๋ฉด, ViewTimeline
์ ํด๋น ์์๊ฐ ์คํฌ๋กค์ ๋ฐ๋ผ ํ๋ฉด์ ๋ณด์ด๋ ์ ๋๋ฅผ ์๊ฐ๊ฐ์ผ๋ก ์ฌ์ฉํ๋ค.
(์ถ์ฒ: Animate elements on scroll with Scroll-driven animations)
์ ์์์์ ์์๊ฐ ํ๋ฉด ์๋์ ์๋ค๋ฉด ์ ๋๋ฉ์ด์
์ ์งํ๋๋ 0%
, ์์๊ฐ ์์ ํ ํ๋ฉด ์์ ์๋ค๋ฉด 100%
๊ฐ ๋๋ค. view()
์๋ scroll()
๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฐฉํฅ์ ์ง์ ํ๋ <axis>
์, ์งํ๋ ๊ณ์ฐ์ ์ฌ์ฉํ ์์์ ๊ฒฝ๊ณ๋ฅผ ์ค์ ํ๋ <view-timeline-inset>
์ ๋๊ธธ ์ ์๋ค.
.foo {
animation-timeline: view(block 12px);
}
์ด ๊ธฐ๋ฅ์ ์์ง ์ด์์ผ๋ก ์ฌ์ฉ๋ฒ์ด๋ ์ด๋ฆ ๋ฑ์ด ๋ฐ๋ ์ ์์์ ์ฃผ์ํ์.
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํด๋น ์ฌ์ดํธ๊ฐ HTTPS ์ฐ๊ฒฐ์ ์ง์ํ๋ ๊ฒฝ์ฐ, ์๋์ผ๋ก HTTPS ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํ๋ ๊ธฐ๋ฅ์ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋ฅผ ์ถ๊ฐํ๋ค. ๊ธฐ์กด์๋ Strict-Trasport-Security
ํค๋๋ฅผ ์ฌ์ฉํด ๋ธ๋ผ์ฐ์ ๊ฐ HTTPS ์ฐ๊ฒฐ์ ์ฌ์ฉํ๋๋ก ์ ๋ํ๊ฑฐ๋, Chrome ์ค์ ์ Always use secure connections
์ต์
์ ํตํด ๋ธ๋ผ์ฐ์ ๊ฐ HTTPS๋ฅผ ์ฌ์ฉํ๋๋ก ๊ฐ์ ํ ์ ์์๋ค. ํ์ง๋ง ์๋์ ๊ฐ์ ๊ฒฝ์ฐ ์ฌ์ฉ์๊ฐ HTTP ์ฐ๊ฒฐ์ ์ฌ์ฉํด ์ ๋ณด๋ฅผ ์ ๋ฌํ ์ ์์๋ค.
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
SHA(Secure Hash Algorithm)๋ ํด์ ํจ์์ ์งํฉ์ด๋ค. ๊ทธ ์ค์์๋ SHA-1์ ๊ณผ๊ฑฐ ์ธ์ฆ์์ ์ ์ ์๋ช ์ ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉํ๋ ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก,1995๋ ์ ์ฒ์ ๋ฑ์ฅํด 2000๋ ๋๋ถํฐ 2010๋ ๋ ์ด๋ฐ๊น์ง ํ์ค์ผ๋ก ๋๋ฆฌ ์ฌ์ฉํ๋ค. ํ์ง๋ง ์ทจ์ฝ์ ์ด ์ ๊ธฐ๋์ด 2011๋ ์ SHA-2๊ฐ ์๋ก์ด ํ์ค ํด์ฑ ์๊ณ ๋ฆฌ์ฆ์ด ๋์๊ณ , ํ์ฌ ๋๋ถ๋ถ์ ์ต์ OS, ๋ธ๋ผ์ฐ์ ์์ SHA-1 ์๊ณ ๋ฆฌ์ฆ์ ์ง์ํ์ง ์๋๋ค.
Chrome๋ ์ด๋ฏธ ๊ณผ๊ฑฐ์ SHA-1์ ์ฌ์ฉํ ์๋ฒ ์ธ์ฆ์๋ฅผ ์ง์ ์ค๋จํ๋ค. Chrome 117์์๋ SHA-1์ ์ฌ์ฉํ ์๋ฒ ์ ์ ์๋ช ์ ์ง์ ์ค๋จํ ์์ ์ด๋ค. SHA-1์ ์ฌ์ฉํ๋ ํด๋ผ์ด์ธํธ์ ์ธ์ฆ์๋ ์ ์ ์๋ช ์ ์์ง ์ง์ ์ค๋จ ์ผ์ ์ด ์์ด, ๋ณด์์ ๊ฐํํ๊ณ ์ ํ๋ค๋ฉด ์๋ฒ์์ ์ง์ SHA-1์ ์ฌ์ฉํ ์ธ์ฆ์๋ฅผ ๊ฑฐ๋ถ ์ฒ๋ฆฌํด์ผ ํ๋ค.
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
Chrome 115๋ 2023๋ 7์ 12์ผ์ ์ ์ ๋ฐฐํฌ ์์ ์ด๋ค.
CSS์ offset-path
์์ฑ์ ์ฌ์ฉํ ์ ์๋ ํจ์๋ฅผ ์ถ๊ฐํ๋ค. offset-path
๋ offset
์ ํ์ ์์ฑ์ผ๋ก, ํด๋น ์์๊ฐ ์์ง์ผ ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ ์์ฑ์ด๋ค.
(์ถ์ฒ: Motion Path Module Level 1)
๊ธฐ์กด์๋ path()
๋ก ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ถ๋ถ์ด์์ผ๋, ์
๋ฐ์ดํธ ์ดํ์๋ ๊ฐ๋๋ก ๊ฒฝ๋ก๋ฅผ ์ง์ ํ๋ ray()
, ์์ ๊ทธ๋ฆฌ๋ circle()
, polygon()
๋ฑ ๋ค์ํ ํจ์๋ฅผ ์ง์ํ ์์ ์ด๋ค.
(์ถ์ฒ: Motion Path Module Level 1)
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
display
, content-visibility
์ ์ ๋๋ฉ์ด์
์ฌ์ฉ ์ง์display
์์ฑ ๋ฐ content-visibility
์์ฑ์ CSS ์ ๋๋ฉ์ด์
์์ ์ฌ์ฉํ ์ ์๋๋ก ๋ณ๊ฒฝํ๋ค.
@keyframes slideOut {
from {
display: block;
}
to {
transform: translateX(40px);
opacity: 0;
}
}
.hide {
animation: slideOut 0.2s;
display: none;
}
์ ์์์์ hide
ํด๋์ค๋ฅผ ์ง์ ํ ์์๋ ์ ๋๋ฉ์ด์
์์ด ๋ฐ๋ก ํ๋ฉด์์ ์ฌ๋ผ์ง๋ค. display
์์ฑ์ opacity
๋ฑ์ ์์ฑ๊ณผ ๋ฌ๋ฆฌ ์ค๊ฐ๊ฐ์ ์ฐ์ฐํ ์ ์๋ ๋ถ์ฐ์(discrete
) ์์ฑ์ด๋ค. ์ ๋๋ฉ์ด์
์์ display
์์ฑ ์์ฒด๋ฅผ ์ง์ํ์ง ์์ display: block;
๊ตฌ๋ฌธ์ ๋ฌด์ํ ๊ฒ์ด๋ค.
์
๋ฐ์ดํธ ์ดํ์๋ display
๋ฐ content-visibility
์์ฑ์ ์ค๊ฐ๊ฐ์ none | hidden
์ด ์๋ ํน์ ๊ฐ์ผ๋ก ์ฐ์ฐํด ํด๋น ์์ฑ์ ์ ๋๋ฉ์ด์
์ฌ์ฉ์ ์ง์ํ ์์ ์ด๋ค.
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
CSS ๋ถ์ฐ์(discrete
) ์์ฑ์ด๋ ์ค๊ฐ๊ฐ์ ์ฐ์ฐํ ์ ์๋ display
, visibility
๋ฑ์ ๋งํ๋ค. ์ด๋ค์ ์ค๊ฐ๊ฐ์ ์ฐ์ฐํ ์ ์์ด transition
์์ฑ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์๋ค.
๊ธฐ์กด์๋ ํน์ ์ ๋๋ฉ์ด์
์ด ๋๋ ํ display: none;
์์ฑ์ ์ ์ฉํ๋ ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ง์ ์คํ์ผ์ ๋ณ๊ฒฝํด์ผ ํ๋ค.
.hide {
transition: opacity 0.3s;
opacity: 0;
/* display: none; */
}
const target = document.querySelector('#target');
target.addEventListener('transitionend', () => {
target.style.setProperty('display', 'none');
});
target.classList.add('hide');
Chrome 115๋ถํฐ๋ transition-property
์์ฑ์ ๋ถ์ฐ์ ์์ฑ์ ๋ช
์ํด transition
์ ๋์์ผ๋ก ์ง์ ํ ์ ์๋ค.
.hide {
transition: opacity 0.3s, display 0.3s;
opacity: 0;
display: none;
}
const target = document.querySelector('#target');
target.classList.add('hide');
์ฃผ์ํด์ผ ํ ์ ์ all
์ ์ฌ์ ํ ๋ถ์ฐ์ ์์ฑ์ ํฌํจํ์ง ์๋๋ค๋ ์ ์ด๋ค. ๋ถ์ฐ์ ์์ฑ์ transition
์ ๋์์ผ๋ก ์ง์ ํ๋ ค๋ฉด ํด๋น ์์ฑ์ ๋ช
์์ ์ผ๋ก transition-property
์ ์์ฑํด์ผ ํ๋ค.
/* ์ ๋๋ฉ์ด์
์์ด ๋ฐ๋ก ์ฌ๋ผ์ง๋ค. */
.hide {
transition: all 0.3s;
opacity: 0;
display: none;
}
/* 0.3์ด ํ ์ฌ๋ผ์ง๋ค. */
.hide {
transition: display 0.3s, opacity 0.3s;
opacity: 0;
display: none;
}
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
SVGUseElement
์ data:
URL ์ง์ ์ค๋จ ๋ฏธ๋ฆฌ ๋ณด๊ธฐSVG์ <use>
๋ฅผ ์ฌ์ฉํ๋ฉด ์ธ๋ถ SVG ์ด๋ฏธ์ง๋ฅผ ๋ถ๋ฌ์ ํ์ฌ ๋ฌธ์์ ๋ถ์ฌ๋ฃ์ ์ ์๋ค. ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด๋ ๋ณด์ ๋ฌธ์ ๊ฐ ์๋ ๋งํผ <use>
์๋ ๋์ผ ์ถ์ฒ ์ ์ฑ
(same-origin policy)์ด ์ ์ฉ๋๋ค. ํ์ง๋ง data:
URL์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๋ ํญ์ ๋์ผ ์ถ์ฒ๋ก ์ทจ๊ธํ๋ฉฐ, ์ผ๋ถ ๋ณด์ ๋ชจ๋์ ๊ฑฐ์น์ง ์๋๋ค.
๊ธฐ์กด์ data:
URL์ ์ฌ์ฉํ๋ค๋ฉด ํด๋น ์ด๋ฏธ์ง๋ฅผ ๋์ผ ์ถ์ฒ์ .svg
์ด๋ฏธ์ง๋ก ๋ณํํ๊ฑฐ๋, ์ธ๋ผ์ธ์์ ์ง์ ์ด๋ฏธ์ง๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ํํ๊ธฐ๋ฅผ ๊ถ์ฅํ๋ค.
<svg viewBox="0 0 32 32" xmlns="http://www.w3.org/2000/svg">
<circle id="circle" cx="5" cy="5" r="4" stroke="blue" />
<use href="#circle" />
</svg>
const url = URL.createObjectURL(blob);
const svg = document.createElementNS('http://www.w3.org/2000/svg', 'svg');
const use = document.createElementNS('http://www.w3.org/2000/svg', 'use');
use.setAttribute('href', `${url}#circle`);
svg.appendChild(use);
document.body.appendChild(svg);
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
Chrome 116์ 2023๋ 8์ 9์ผ์ ์ ์ ๋ฐฐํฌ ์์ ์ด๋ค. 7์ 19์ผ๋ถํฐ 7์ 27์ผ ์ฌ์ด์ Chrome ๋ฒ ํ ๋ฒ์ ์์ ํด๋น ๊ธฐ๋ฅ์ ๋ฏธ๋ฆฌ ํ์ธํด ๋ณผ ์ ์๋ค.
zoom
์์ฑ ์ง์ ์ค๋จ ๐๋นํ์ค CSS ์์ฑ์ธ zoom
์ ์ง์ ์ค๋จํ๋ค.
zoom
์ ์์ ํฌ๊ธฐ ๋ฐฐ์จ์ ์ง์ ํ๋ CSS ์์ฑ์ด๋ค. transform: scale()
๊ณผ ์ ์ฌํ๋, zoom
์ ์ค์ ๋ ์ด์์์ ์ํฅ์ ๋ฏธ์น๋ฉฐ, ์ ๋๋ฉ์ด์
์ ์ง์ํ์ง ์๋๋ค๋ ์ ์ด ๋ค๋ฅด๋ค.
์์ง zoom
์ ์ฌ์ฉํ๋ ํ์ด์ง๊ฐ ์๋ค๋ฉด ํ์ค ์์ฑ์ธ transform: scale()
์ผ๋ก์ ์ ํ์ ๊ณ ๋ คํด์ผ ํ๋ค. ํ์ฌ ์ด ์์ฑ์ ์ฌ์ฉํ๋ ํ์ด์ง๋ ์ ์ฒด ํ์ด์ง์ ์ฝ 0.5% ์ ๋๋ผ๊ณ ํ๋ค.
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
RTCPeerConnection.getStats()
์ฝ๋ฐฑ ๋ฐฉ์ ์ง์ ์ค๋จRTCPeerConnection.getStats()
๋ ํด๋น ์ค๋์ค๋ ๋น๋์ค ์ฐ๊ฒฐ์ ๋ํ ํต๊ณ ์๋ฃ๋ฅผ ๋ฐํํ๋ API๋ค. ํ์ฌ Chrome์์ ์ด API๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํ๋ ์ต์ ๋ฒ์ ๊ณผ, ์ฝ๋ฐฑ์ ์ฌ์ฉํ๋ ๊ตฌ๋ฒ์ ๋ ๊ฐ์ง๋ก ๋๋๋ค.
myPeerConnection.getStats(); // ์ต์ ๋ฒ์
myPeerConnection.getStats(null, onSuccess, onFailure); // ๊ตฌ๋ฒ์ , Promise ๋ฐํ X
์ฝ๋ฐฑ ๋ฐฉ์์ ๋ชจ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ์ด์ธ๋ฆฌ์ง ์๊ณ , ํ์ค ์คํ ๋ฌธ์๋ ์์ด ์ฅ๊ธฐ์ ์ผ๋ก ์ง์์ ์ค๋จํ ์์ ์ด๋ค. Chrome 113 ์ด์์์๋ ์ฝ๋ฐฑ ๋ฐฉ์ ์ฌ์ฉ ์ ์ฝ์์ ๊ฒฝ๊ณ ๋ฅผ ๋
ธ์ถํ๋ฉฐ, chrome://flags
์์ ์ง์ ์ค๋จ ํ๊ฒฝ์ ๋ฏธ๋ฆฌ ์ฒดํํ ์ ์๋ค.
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
ํน์ ์์์ ๊ธฐ๋ฐํด ํ์ฌ ์์๋ฅผ ๋ฐฐ์นํ ์ ์๋ Anchor ๋ฐฐ์น ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค. ํนํ ํดํ ๋ฑ์ ๊ตฌํํ ๋ ์ ์ฉํ๋ฐ, absolute
๋ฐฐ์น์ ๋น์ทํ๋ DOM ๊ตฌ์กฐ์ ๊ตฌ์ ๋ฐ์ง ์๊ณ ํดํ์ ๊ตฌํํ ์ ์๋ค๋ ์ ์ด ๋ค๋ฅด๋ค.
.anchor {
anchor-name: --tooltip;
}
.tooltip {
position: fixed;
anchor-default: --tooltip;
bottom: anchor(auto);
left: anchor(right);
min-width: anchor-size(width);
}
์์ ์ฒ๋ผ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด .tooltip
์ .anchor
์์์ ์ค๋ฅธ์ชฝ ์์ ๋ํ๋๋ค. ๋ง์ฝ .tooltip
์ด ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ๋ฒ์ด๋๋ค๋ฉด bottom: anchor(auto)
์ ์ํด .anchor
์์์ ์๋์ ๋ฐฐ์น๋๋ค.
anchor-name
์๋ ํด๋น Anchor์ ์ด๋ฆ์ ์ ์ธํ๋ฉฐ, ํด๋น Anchor์ ๋ฐฐ์นํ ์์์์ ์ด ์ด๋ฆ์ผ๋ก ํด๋น ์์์ ์์น๋ ํฌ๊ธฐ ๋ฑ์ ์ ๊ทผํ ์ ์๋ค. anchor()
ํจ์๋ ํด๋น Anchor์ ์์น๊ฐ์, anchor-size()
๋ ํด๋น Anchor์ ํฌ๊ธฐ๊ฐ์ ๋ฐํํ๋ ํจ์๋ก, ๊ธฐ๋ณธ์ ์ผ๋ก ์๋์ฒ๋ผ Anchor์ ์ด๋ฆ์ ์ธ์๋ก ๋ฐ๋๋ค.
.tooltip {
bottom: anchor(--tooltip auto);
max-width: anchor-size(--tooltip width);
}
๋ง์ฝ ํด๋น ์์์ anchor-default
๋ฅผ ์ค์ ํ๋ค๋ฉด ์ฒซ ๋ฒ์งธ ์ธ์๋ฅผ ์๋ตํ ์ ์๋ค.
.tooltip {
anchor-default: --tooltip;
bottom: anchor(auto);
max-width: anchor-size(width);
}
@position-fallback
๊ท์น์ ์ ์ธํ๋ฉด ํด๋น ์์๊ฐ ๋ธ๋ผ์ฐ์ ํ๋ฉด์ ๋ฒ์ด๋ ๊ฒฝ์ฐ์ ๋ํ ์คํ์ผ์ ์ ์ํ ์ ์๋ค.
@position-fallback --tooltip-position {
@try {
top: anchor(--tooltip bottom);
left: anchor(--tooltip left);
}
@try {
bottom: anchor(--tooltip top);
left: anchor(--tooltip left);
}
@try {
top: anchor(--tooltip bottom);
right: anchor(--tooltip right);
}
}
#tooltip {
position: fixed;
position-fallback: --tooltip-position;
}
์ ์ฝ๋๋ ๋จผ์ Anchor์ ์ผ์ชฝ ์๋์ ๋ฐฐ์น๋ฅผ ์๋ํ๋ฉฐ, ๋ง์ฝ ํ๋ฉด์ ๋ฒ์ด๋๋ฉด Anchor์ ์ผ์ชฝ ์, ๋ง์ง๋ง์ผ๋ก Anchor์ ์ค๋ฅธ์ชฝ ์๋์ #tooltip
์ ๋ฐฐ์นํ๋ผ๋ ์๋ฏธ์ด๋ค.
์ด ๊ธฐ๋ฅ์ ์์ง ์ด์์ผ๋ก ์ธ์ธํ ์คํ์ด๋ ๋์์ด ๋ฐ๋ ์ ์์์ ์ฃผ์ํ์.
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
@scope
๊ท์นCSS ์ด์์ผ๋ก ์ ์ ์ค์ธ @scope
๊ท์น์ ์ ์ฉํ๋ค. @scope
๋ CSS ๊ท์น์ ํน์ ๊ตฌ๊ฐ์๋ง ์ ์ฉํ ์ ์๋ ๋ฌธ๋ฒ์ผ๋ก, CSS์ ์ค์ฝํ๋ผ๋ ์๋ก์ด ๊ฐ๋
์ด ์๊ธฐ๋ ์
์ด๋ค.
@scope
๊ท์น์ ๋จ์ํ๊ฒ ์ฌ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
@scope (.red-theme) {
span {
color: red;
}
}
@scope (.blue-theme) {
span {
color: blue;
}
}
์ ๋ฌธ๋ฒ์ ์๋์ฒ๋ผ ์ผ๋ฐ ์ ํ์๋ก ๊ตฌํํ ์๋ ์์ผ๋, ๊ฝค ํฐ ์ฐจ์ด๊ฐ ์๋ค.
.red-theme span {
color: red;
}
.blue-theme span {
color: blue;
}
์๋ฅผ ๋ค์ด ์๋์ ๊ฐ์ ํ์ด์ง๊ฐ ์๋ค๊ณ ํด ๋ณด์.
<div class="blue-theme">
<span>this is blue-theme</span>
<div class="red-theme">
<span>this is red-theme</span>
</div>
</div>
์ผ๋ฐ ์ ํ์๋ก ๊ตฌํํ ์คํ์ผ์ ์ ์ฉํ๋ฉด ๋ <span>
ํ
์คํธ๋ ๋ชจ๋ ํ๋์์ผ๋ก ๋ํ๋๋ค. .blue-theme span
๊ณผ .red-theme span
์ CSS ์ฐ์ ์์๊ฐ ๊ฐ์ ๋์ค์ ์ ์ธํ .blue-theme span
์ ์คํ์ผ์ด .red-theme span
์ ์คํ์ผ์ ๋ฎ์ด์์ฐ๊ธฐ ๋๋ฌธ์ด๋ค.
@scope
๊ท์น์ผ๋ก ์์ฑํ ์คํ์ผ์ ์ ์ฉํ๋ฉด ์๋๋๋ก ์ฒซ ๋ฒ์งธ <span>
์ ํ๋์, ๋ ๋ฒ์งธ <span>
์ ๋นจ๊ฐ์์ผ๋ก ๋ํ๋๋ค. @scope
๋ @scope
์ ์ ์ธํ ์์ ์ค์ฝํ์ ํด๋น ์์๊ฐ ๊ฐ๊น์ธ ์๋ก ์ฐ์ ์์๊ฐ ๋๋ค. ๋๋ฌธ์ ๋ ๋ฒ์งธ <span>
์ ์คํ์ผ์ ์ ์ฉํ ๋ @scope (.blue-theme)
์์ ์ ์ธํ ๊ท์น๋ณด๋ค @scope (.red-theme)
์์ ์ ์ธํ ๊ท์น์ด ์ฐ์ ์์๊ฐ ๋ ๋์ color: red;
์คํ์ผ์ด color: blue;
์คํ์ผ์ ๋ฎ์ด ์์ด๋ค.
๋ํ @scope A to B
๊ท์น์ ์ฌ์ฉํ๋ฉด ์๋์ฒ๋ผ ์คํ์ผ์ ์ ์ฉ ๋ฒ์๋ฅผ ์ค์ ํ ์ ์๊ณ ,
@scope (.article) to (.comment) {
p {
margin: 12px 0;
}
}
&
์ ํ์ ๋๋ :scope
๊ฐ์ ์ ํ์๋ฅผ ์ด์ฉํ๋ฉด ํ์ฌ ์์ ์ค์ฝํ ์์๋ฅผ ์ ํํ ์ ์๋ค.
@scope (.light-theme) {
& {
background-color: white;
}
}
@scope (.dark-theme) {
:scope {
background-color: black;
}
}
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
Chrome 117์ 2023๋ 9์ 6์ผ์ ์ ์ ๋ฐฐํฌ ์์ ์ด๋ค. 8์ 16์ผ๋ถํฐ 8์ 24์ผ ์ฌ์ด์ Chrome ๋ฒ ํ ๋ฒ์ ์์ ํด๋น ๊ธฐ๋ฅ์ ๋ฏธ๋ฆฌ ํ์ธํด ๋ณผ ์ ์๋ค.
shadowroot
์์ฑ ์ง์ ์ค๋จ์ ์ธ์ Shadow DOM์ <template>
์์์ shadowroot
์์ฑ์ ์ง์ ํด ํ
ํ๋ฆฟ์์ ์ง์ Shadow DOM์ ํ์ฑํํ ์ ์๋ ๊ธฐ๋ฅ์ด๋ค. ํ์ค์์ ์ด ์์ฑ์ ๋ํ ์ด๋ฆ์ shadowrootmode
๋ก ๋ณ๊ฒฝํจ์ ๋ฐ๋ผ ๊ธฐ์กด shadowroot
์์ฑ์ ์ง์ ์ค๋จํ๋ค. shadowroot
๋ Chrome์์ ๊ทธ๋๋ก ๋์ํ๋, Chrome 111์์ ์ถ๊ฐ๋ ์คํธ๋ฆฌ๋ฐ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค. shadowrootmode
๋ Chrome 111 ์ด์์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์์๋ ์ง์ ์์ ์ด๋ฏ๋ก shadowrootmode
์์ฑ์ ์ฌ์ฉํ๋ ๊ฒ์ด ์ข๋ค.
<host-element>
- <template shadowroot="open">
+ <template shadowrootmode="open">
<slot></slot>
</template>
<h2>Light content</h2>
</host-element>
Chrome 112์์ shadowroot
์์ฑ์ ๋ํ ์ง์ ์ค๋จ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋ฅผ ์ถ๊ฐํ๋ค. Chrome 112 ์ด์์์ chrome://flags
์์ ํด๋น ๊ธฐ๋ฅ์ ํ์ฑํํด ์์ฑ ์ง์ ์ค๋จ์ ๋ฏธ๋ฆฌ ์ฒดํํ ์ ์๋ค.
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
shadowroot
attribute for declarative shadow DOM (Deprecated)WebSQL
์ ๊ณผ๊ฑฐ ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ธฐ ์ํด ์ ์๋ API๋ก, Webkit ๊ธฐ๋ฐ์ ์ผ๋ถ ๋ธ๋ผ์ฐ์ ์์๋ง ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์ด ํ๋ก์ ํธ๋ ๋ณด์ ๊ตฌํ ๋ฑ์ ์ด๋ ค์์ผ๋ก 1๋
๋ง์ ํ๊ธฐ๋์๊ณ , Webkit๋ 2019๋
์ ์ด API๋ฅผ ์ง์ ์ค๋จํ๋ค.
์ด๋ฏธ ๋๋ถ๋ถ์ ๋ธ๋ผ์ฐ์ ์์ Web Storage API
, IndexedDB API
๊ฐ์ ์ต์ ์ ์ฅ์ API๋ฅผ ์ฌ์ฉํ ์ ์์ด ์ด API๋ฅผ ์ง์ ์ค๋จํ๋ค. ์ด๋ฏธ Chrome 97์์ ์ 3์ ์ปจํ
์คํธ์์ WebSQL์ ์ ๊ฑฐํ์ผ๋ฉฐ, Chrome 105์์๋ ๋ณด์ ์ฐ๊ฒฐ์ ์ฌ์ฉํ์ง ์๋ ํ์ด์ง์์์ ์ฌ์ฉ์ ์ง์ ์ค๋จํ๋ค.
์น์์ SQL์ ๊ณ์ ์ฌ์ฉํ๋ ค๋ฉด ์น ์ด์ ๋ธ๋ฆฌ๋ฅผ ์ด์ฉํ SQLite๊ฐ ๊ณต์ ๋์์ด๋ฏ๋ก ์ฐธ๊ณ ํ์.
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
unload
์ด๋ฒคํธ๋ ํด๋น ๋ฌธ์ ๋๋ ์์ ๋ฌธ์๋ฅผ ํด์ ํ ๋ ๋ฐ์ํ๋ ์ด๋ฒคํธ์ด๋ค. ์ด ์ด๋ฒคํธ๋ฅผ ์ด์ฉํ๋ฉด ์ฌ์ฉ์๊ฐ ํ์ด์ง๋ฅผ ์ข
๋ฃํ๊ธฐ ์ ์ ํน์ ๋์์ ์คํํ ์ ์๋ค.
window.addEventListener('unload', (event) => {
navigator.sendBeacon('/api/log', 'unload!');
});
ํ์ง๋ง unload
์ด๋ฒคํธ๋ beforeunload
์ด๋ฒคํธ์ ๋ฌ๋ฆฌ ๊ธฐ๋ณธ ๋์์ ์ทจ์(event.preventDefault()
)ํ ์ ์์ด ์ด๋ฒคํธ๊ฐ ์์ ๋ฐ์ํ์ง ์๊ธฐ๋ ํ๋ค. W3C์ ํต๊ณ์ ๋ฐ๋ฅด๋ฉด unload
์ด๋ฒคํธ๊ฐ ์ ๋๋ก ๋ฐ์ํ๋ ๊ฒฝ์ฐ๊ฐ Chrome ๋ฐ์คํฌํ์์๋ 95%, ๋ชจ๋ฐ์ผ์์๋ 57% ~ 68% ์ ๋๋ก, ์ด๋ ๋ชจ๋ฐ์ผ ํ๊ฒฝ์ ํน์ฑ์ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ ๋ค๋ฅธ ์ฑ์ ๋ณด๋ค๊ฐ ๋ธ๋ผ์ฐ์ ์์ฒด๋ฅผ ์ข
๋ฃํ๋ ๊ฒฝ์ฐ๊ฐ ๋น๋ฒํ๊ธฐ ๋๋ฌธ์ด๋ค.
์ด ํญ๋ชฉ์ ์ ์ ์ค์ผ๋ก ์ ์ฉ ์ฌ๋ถ๋ ํ์คํ์ง ์์ผ๋, ๊ธฐ์กด์ unload
์ด๋ฒคํธ์ ์์กดํ๋ ์ฝ๋๊ฐ ์๋ค๋ฉด ๊ด์ฌ์ ๊ฐ์ง๊ณ ์ง์ผ๋ณผ ํ์๊ฐ ์๋ค.
์ด ํญ๋ชฉ์ ๋ํ ์ฃผ์ ๋ธ๋ผ์ฐ์ ๋ฐ ์น ๊ฐ๋ฐ์์ ์๊ฒฌ์ ๋ค์๊ณผ ๊ฐ๋ค.
๋ด๋ถ๋ง ์ ๊ทผ ๊ท์น(Local Network Access) ์ ์ฉ์ ์ผ๋ถ๋ก ํ์ ๋ฆฌ์์ค(.js
, .css
๋ฑ)๋ฅผ ์์ฒญํ ๋ ๋ด๋ถ๋ง(์ฌ์ค IP, localhost)์ ๋ํ ์ ๊ทผ ์ ํ์ ๊ฒํ ์ค์ด๋ค. ์ ์ ์ ์ฉ ์ผ์ ์ ๋ถํฌ๋ช
ํ๋, ๋ฏธ๋ฆฌ ๋ณด๊ธฐ๋ก ์ผ๋ถ ๊ธฐ๋ฅ์ ์ฒดํํ ์ ์๋ค.
๊ณต๊ฐ ์น ์ฌ์ดํธ(๊ณต๊ฐ IP๋ก ์ ๊ทผ ๊ฐ๋ฅํ ์ฌ์ดํธ)์์ ๋ด๋ถ๋ง์ ํ์ ๋ฆฌ์์ค(.js
, .css
๋ฑ) ์์ฒญ ์ ๋ฐ๋์ ๋ณด์ ์ปจํ
์คํธ(HTTPS)๋ฅผ ์ฌ์ฉํ๋๋ก ์ ํํ๋ค. ๋ด๋ถ๋ง์ ํ์ ๋ฆฌ์์ค์ ์ ๊ทผํ๋ ค๋ฉด ๋ณด์ ์ปจํ
์คํธ๋ฅผ ์ฌ์ฉํ๋๋ก ๋ณ๊ฒฝํด์ผ ํ๋ค.
Chrome 86 ์ด์์ chrome://flags
์์ ํด๋น ๊ธฐ๋ฅ์ ํ์ฑํํด ์ ๊ทผ ์ ํ์ ๋ฏธ๋ฆฌ ์ฒดํํ ์ ์๋ค.
๋ด๋ถ๋ง์ ํ์ ๋ฆฌ์์ค ์์ฒญ ์ ์ฌ์ ์์ฒญ์ ๋ณด๋ด ์ฐ๊ฒฐ ํ์ฉ ์ฌ๋ถ๋ฅผ ๋จผ์ ๋ฌป๋๋ค. ํ์ฌ๋ ์ฌ์ ์์ฒญ ์คํจ ์ ๊ฐ๋ฐ์ ์ฝ์์ ๊ฒฝ๊ณ ๋ง ๋ ธ์ถํ๋ค.