์ฅ์
๋จ์
#line {
stroke-dasharray: 100 20;
}
stroke-dasharray
์ ํจ๊ป ์ฌ์ฉ#line {
/* ์ ์ฒด ๊ธธ์ด 2856px๋ก 2856px ๋งํผ ๋ณด์ด๊ณ ๊ณต๋ฐฑ์ด๊ฒ ์ค์ */
stroke-dasharray: 2856 2856;
stroke-dashoffset: 300;
}
#line {
stroke-dasharray: 2856 2856;
stroke-dashoffset: 2856;
}
#line {
stroke-dasharray: 2856 2856;
stroke-dashoffset: 0;
}
getTotalLength()
๋ฅผ ์ฌ์ฉํด SVG์ ๊ธธ์ด ๊ฐ์ ธ์์ stroke-dasharray
, stroke-dashoffset
์์ฑ ์ค์ const line = document.querySelector('#line');
const lineLength = line.getTotalLength();
line.style.strokeDasharray = lineLength + ' ' + lineLength;
line.style.strokeDashoffset = lineLength;
stroke-dashoffset
์์ฑ๊ฐ์ ๋ฐ๊ฟ์ฃผ๋ฉด์ ๊ตฌํwindow.addEventListener('scroll', scrollHandler)
function scrollHandler() {
// ํ์ฌ ์คํฌ๋กค๋ ์์น ๊น์ง์ ๋์ด๊ฐ
const scrollTop = document.documentElement.scrollTop;
// ์คํฌ๋กค๋ ์ ์๋ ์ ์ฒด ๋์ด๊ฐ
const scrollHeight = document.documentElement.scrollHeight;
// ํ๋ฉด(๋ทฐํฌํธ)์ ๋์ด๊ฐ
const clientHeight = document.documentElement.clientHeight;
// % ๊ตฌํ๊ธฐ
// ์ ์ฒด๊ฐ scrollHeight - clientHeight์ธ ์ด์
// ์คํฌ๋กคํ ์ ์๋ ์ ์ฒด ๋์ด๊ฐ์์ ํ์ฌ ํ๋ฉด๋์ด๋งํผ ๋นผ ์ค์ผ์ง ๊ฐ์ฅ ๋ฐ์ ์คํฌ๋กค๊น์ง ๊ฐ์ ๋ 100%๊ฐ ๋จ
const scrollPercentage = scrollTop / (scrollHeight - clientHeight)
// ์คํฌ๋กค ์์น์ ๋ฐ๋ฅธ ๊ธธ์ด ๊ตฌํด์ค
const drawLength = lineLength * scrollPercentage
// stroke-dashoffset ์์ฑ๊ฐ์ ๋ฐ๊ฟ์ฃผ๋ฉด์ ๊ตฌํ
// ์คํฌ๋กค ๊ฐ์ฅ ์์ผ ๋ : ์๋๊ธธ์ด - 0 (์๋ฌด๊ฒ๋ ์๋ณด์)
// ์คํฌ๋กค ๊ฐ์ฅ ์๋์ผ ๋ : ์๋๊ธธ์ด - ์๋๊ธธ์ด (์ ์ฒด ๋ณด์)
line.style.strokeDashoffset = lineLength - drawLength
}
๋ช ํ