ํฐ์คํ ๋ฆฌ ๋ทฐ
์บ๋ฌ์ (Carousel)์ ์์ ๊ฐ์ด ์ปจํ ์ธ ๋ฅผ ์ฌ๋ผ์ด๋ ํํ๋ก ์ํํ๋ฉฐ ํ์ํ๋ UI๋ฅผ ๋งํ๋ค.
์ด๋ ๋ฌดํ ๋ฃจํ ๊ธฐ๋ฅ์ด ๊ฐ๋ฅํ๊ธฐ ์ํด์๋ ์ฒ์์ ์ด๋ฏธ์ง ์ฌ๋ผ์ด๋์์ ์ด์ ๋ฒํผ์ ํด๋ฆญํ ์ ๋ง์ง๋ง ์ฌ๋ผ์ด๋๋ก ์ด๋์ ํ๊ณ
๋ฐ๋๋ก ๋ง์ง๋ง ์ฌ๋ผ์ด๋์์ ๋ค์ ๋ฒํผ์ ํด๋ฆญํ ์ ์ฒ์ ์ฌ๋ผ์ด๋๋ก ์ด๋์ ํด์ผ ํ๋ค.
์ด๋ฅผ ์ํด ๋ณธ๋ ์ค๋น๋ ์ด 4์ฅ์ ์ด๋ฏธ์ง ์ด์ธ์ ์ฒ์ ๋์ค๋ ์ด๋ฏธ์ง์ ๋ง์ง๋ง์ ๋์ค๋ ์ด๋ฏธ์ง๋ฅผ ๊ฐ๊ฐ ๋ณต์ฌํ์ฌ ์๋ฃ๊ตฌ์กฐ์ ์ ๋์
์์น์ํจ๋ค.
๊ฒฐ๊ณผ์ ์ผ๋ก ์ฌ๋ผ์ด๋ ์ด๋ฏธ์ง์ ์ ๋ณด๋ฅผ ๋ด๊ณ ์๋ ์๋ฃ๊ตฌ์กฐ์ ๋งจ ์ฒ์ ์ด๋ฏธ์ง๋ ๋ง์ง๋ง ์ฌ๋ผ์ด๋ ์ด๋ฏธ์ง์ด๊ณ ๋ง์ง๋ง ์ด๋ฏธ์ง๋ ์ฒ์
์ฌ๋ผ์ด๋ ์ด๋ฏธ์ง๊ฐ ์ ์ฌ๋๋ค.
$container.addEventListener('click', e => {
if(!e.target.classList.contains('carousel-control')) return;
if(e.target.classList.contains('next')) { //๋ค์ ๋ฒํผ์ ๋๋ ์ ๊ฒฝ์ฐ
slides.style.setProperty('--currentSlide', ++currentSceneNum); //ํ์ฌ ์ฌ์ ๋ง๊ฒ ์ด๋
slides.style.setProperty('--duration', 500);
if(currentSceneNum > 5) { //ํ์ฌ ์ฌ ์ธ๋ฑ์ค๊ฐ ๋ง์ง๋ง์ผ ๊ฒฝ์ฐ
slides.style.setProperty('--currentSlide', 1);
slides.style.setProperty('--duration', 0);
currentSceneNum = 1; // ํ์ฌ ์ฌ ์ธ๋ฑ์ค๋ฅผ ๋ค์ ์ฒ์ ์ฌ์ ๋์ํ๋ ์ธ๋ฑ์ค๋ก ์ด๊ธฐํ
}
} else { //์ด์ ๋ฒํผ์ ๋๋ ์ ๊ฒฝ์ฐ
slides.style.setProperty('--currentSlide', (--currentSceneNum));
slides.style.setProperty('--duration', 500);
if(currentSceneNum < 0) { //ํ์ฌ ์ฌ ์ธ๋ฑ์ค๊ฐ ์ฒ์์ผ ๊ฒฝ์ฐ
slides.style.setProperty('--currentSlide', 4); //๋ง์ง๋ง ์ฌ์ ๋์ํ๋ ์ธ๋ฑ์ค๋ก ์ด๊ธฐํ
slides.style.setProperty('--duration', 0);
currentSceneNum = 4;
}
}
})
์ด๋ ์ผ๋ฐ์ ์ผ๋ก ์๋ค๋ก ์์ง์ด๋ ์ํฉ์ด ์๋ ๋งจ ์ฒ์์ด๋ ๋งจ ๋ง์ง๋ง์์ ์ด๋ํ ๊ฒฝ์ฐ์๋ transition์ duration ๊ฐ์ 0์ผ๋ก ์ค์ผ์ง
์ฌ์ฉ์ ์์ ์์๋ ์ฌ๋ผ์ด๋๊ฐ ์ด๋์ด ๋์๋์ง ๊ฐ์์ ์ผ๋ก ์ธ์ง ๋ชปํ๊ฒ ํ ์ ์๋ค.
transitionend Event
๋ฌดํ ๋ฃจํ ๊ธฐ๋ฅ์ ๊ตฌํํ๊ธฐ ์ํด์ Click ์ด๋ฒคํธ ๋ด์์ ์ฒ๋ฆฌํด์ผ ๋ ์กฐ๊ฑด ์ฐ์ฐ๋ค์ด ๋๋ฌด ๋ง์์ ธ์ ์ฝ๋์ ํจ์จ์ฑ๋ ๋ถ์กฑํ๊ณ ๊ฐ๋ ์ฑ๋ ๋จ์ด์ก๋ค. ์์ ์ฝ๋๋ฅผ ๋์ ์ transitionend ์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ๋ค.
transitionend๋ ์ ํ ์ํ๋ฅผ ์ ํ ์๋ฃ๋ก, ๊ธฐ๋ณธ ๋๋ ๋น ์ ํ ์ํ๋ก ์์ ํ ๋๋์ ๊ฐ๋ค - ์ด๋ฒคํธ๊ฐ ์๋ฐฉํฅ์ผ๋ก ๋ฐ์ํฉ๋๋ค.
$container.ontransitionend = () => {
isMoving = false;
// currentSlide === 0, ์ฆ ์ ๋์ ์ถ๊ฐํ ํด๋ก ์ฌ๋ผ์ด๋๋ฉด currentSlide += images.length๋ก image์ ๋ง์ง๋ง(images.length)์ผ๋ก ์ด๋
// currentSlide === images.length + 1, ์ฆ ๋ง์๋ง์ ์ถ๊ฐํ ํด๋ก ์ฌ๋ผ์ด๋๋ฉด currentSlide -= images.length๋ก image์ ์ ๋(1)๋ก ์ด๋
// ํด๋ก ์ฌ๋ผ์ด๋๊ฐ ์๋๋ฉด currentSlide += 0์ผ๋ก ์ด๋ํ์ง ์บ๋๋ค.
const delta = currentSlide === 0 ? 1 : currentSlide === images.length + 1 ? -1 : 0;
// ํด๋ก ์ฌ๋ผ์ด๋๊ฐ ์๋๋ฉด(delta === 0) ์ด๋ํ์ง ์๋๋ค.
if (!delta) return;
currentSlide += images.length * delta;
move(currentSlide);
};
};
'JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
getBoundingClientRect_์์ ์์น ์ก๊ธฐ (0) | 2021.07.14 |
---|---|
insertAdjacentElement๋ก ์์ ์ถ๊ฐ (0) | 2021.07.13 |
Image ์ฌ์ด์ฆ ๊ฐ์ ธ์ค๊ธฐ_JS ํ์ฑ๊ณผ ์คํ ๋์ ์์ (0) | 2021.07.10 |
JS ์์์ HTML ๋์ ์์ฑ (0) | 2021.07.07 |
createDocumentFragment()๋ฅผ ํตํ ์์ ์์ฑ (0) | 2021.07.05 |