์๋์ indecator ์์๋ฅผ ๋ฃ์ด ํ๋ ์ ํ์ ์ํ๊ฐ์ด ๋ฐ๋๊ฒ ํ๋ค.
์์๋ก ๋นจ๊ฐ๊ฒ ์์ด ๋ฐ๋๊ฒ ์ ์ฉ
๊ธฐ๋ณธ html ์ฝ๋๋ฅผ ์ ์ด์คํ
<ul class="slide_pagination">
<li></li>
<li></li>
<li></li>
</ul>
scss๋ก ์๋ฆฌ์ก์์ฃผ๊ธฐ
&.active ๋ก ์์๊ฐ์ ๋ณ๊ฒฝํ๊ณ ์๋ฐ์คํฌ๋ฆฝํธ๋ก css ์์์ ์ ๊ทผํ๋ค
.slide_pagination {
@include flex-row();
gap: 15px;
position: absolute;
left: 50%;
bottom: 50px;
transform: translateX(-50%);
li {
width: 7px;
height: 7px;
border-radius: 50%;
background-color: #fff;
&.active {
background-color: red;
}
}
}
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์ ์ ํ
//์ธ๋์ผ์ดํฐ ์์ ์ ํ
const indicatorItems = document.querySelectorAll('.slide_pagination li');
console.log('indicatorItems: ', indicatorItems);
querySelectorAll ๋ก document ์ ์ ๊ทผํด .slide_pagination ์ด๋ฆ์ li ์ ํ๊ทธ์ ๋ชจ๋ ์ ๊ทผํ๋ค.
๋ณ์๋ก ๋ง๋ indicatoritems ์์ li์ ๋ฐฐ์ด 3๊ฐ ํ์ธ
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฉ๋ฒ 1 (active ์ ์ฒด ์ง์ฐ๊ณ ํ๊ฐ๋ง ์ ์ฉ)
active ์ํ๋ฅผ ๋ชจ๋์๊ฒ ์ ์ฉํ ํ ํด๋ฆญ์ ๋๋จธ์ง li ์ ์ ์ฉ๋ active ์์๋ฅผ ์ญ์ ํ๋ค.
//forEach๋ฌธ์ for๋ฌธ๊ณผ ๋ฌ๋ฆฌ ๋น๋๊ธฐ ๋ฐฉ์์ผ๋ก ์๋ฌ๊ฐ ๋๋ ๋ฉ์ถ์ง์๊ณ ๋์
forEach ๋ฌธ ์์ ๋ forEach ๋ฌธ์ผ๋ก ํจ์๋ฅผ ๋ง๋ค์ด active ์ํ๋ฅผ ์ ๊ฑฐ ํด์ค๋ค.
// 1. ์ธ๋์ผ์ดํฐ ์ ํ ๋ฐฉ๋ฒ - active ์ํ์ ๊ฑฐ
indicatorItems.forEach(function (indicator) {
indicator.addEventListener('click', function () {
// indicator li ๋ค์ active๋ฅผ ๋ชจ๋ ์ ๊ฑฐ
indicatorItems.forEach(function (indicatorRemove) {
indicatorRemove.classList.remove('active');
});
// ์ ํ๋ li๋ง active ์ถ๊ฐ
indicator.classList.add('active');
});
});
์๋ฐ์คํฌ๋ฆฝํธ ๋ฐฉ๋ฒ2 (์ํ๊ฐ์ ํจ์์ ๋ด์ true.false ์ผ๋ active ์ ์ฉ)
active ์ํ add or remove
// 2. ์ธ๋์ผ์ดํฐ ์ ํ ๋ฐฉ๋ฒ - (์ ํธ)
let beforeSelected;
//์ฝ๋ฐฑํจ์๋ฅผ if ์กฐ๊ฑด์ ๊ฑธ์ด ๋ฐํํ๋ค.
indicatorItems.forEach(function (indicator) {
indicator.addEventListener('click', function () {
//ํด๋์ค ์ถ๊ฐ ์ ์ธ๋ํ์ธ
console.log('before beforeSelected: ', beforeSelected);
// ๋ ์ ํ์ด ๋๋ฉด ํด๋ฆญ ํ์ฑํ ์ ์ผ๋ก ๋๋ฆฌ๊ธฐ
// true ์ด๋ฉด (๊ฐ์ด ์์ผ๋ฉด) ์ฝ๋์คํ
if (beforeSelected) {
beforeSelected.classList.remove('active');
console.log('ifbeforeSelected: ', beforeSelected);
}
//ํด๋ฆญ์ด ๋๋ค๋ฉด li ์ ์ํฐ๋ธ์์ ์ถ๊ฐ
indicator.classList.add('active');
//์ ํ์ ์ํ ๋ณ์์ liํด๋ฆญ์ ์์๋ณํ ๋ด๊ธฐ๋ฉด true
beforeSelected = indicator;
console.log('after beforeSelected: ', beforeSelected);
});
});
ํจ์ beforeSelected ๋ฅผ ์ ์ธํด ์คํ, ์ ํ๋๊ธฐ ์ ๊ฐ์ ๋ฃ๊ณ
forEach ์์์ ์ฌ์ ํ์ด ๋์ด ๊ฐ์ด ์๋ (์ฆ true )๊ฐ ๋์ด์์๋ active ๋ฅผ remove ์์ผ ๋ฐฑ์ง์ํ๊ฐ์ผ๋ก ๋๋ ค์ค๋ค.
์ฒ์ li ๋ฅผ ํด๋ฆญํ์๋
beforeSelected ๋ undefined ์ง๋ง
๋ค๋ฅธ li ๋ฅผ ํด๋ฆญํ๋ค๋ฉด ์ด๋ฏธ ๋ค๋ฅธ li ๊ฐ ์ ํ๋์ด ๊ฐ์ด ๋ค์ด์๊ธฐ ๋๋ฌธ์
beforeSelected ๊ฐ true ๋ก li ๊ฐ ์ ํ์ด ๋์ด์๋ค๊ณ ๋์จ๋ค.
๊ทธ๋ฌ๋ ๋ค๋ฅธ active ๋ฅผ ์ง์์ฃผ๊ณ ๋ค์ ๋ถ์ฌํ๋ค
๋ค์์ผ๋ก ์ธ๋์ผ์ดํฐ ์์ ์ ํ์ ์ฌ๋ผ์ด๋ ๋์ด ๊ฐ๊ฒ ๋ง๋ค๊ธฐ
'javascript๐ช > ์๋ฐ์คํฌ๋ฆฝํธ ๊ณต๋ถ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋๋กญ๋ค์ด ์นดํ ๊ณ ๋ฆฌ ์ ํ์ ํ์์นดํ ๊ณ ๋ฆฌ (์ต๊ทค๋ฌ) (1) | 2023.11.22 |
---|---|
Animate.css ํ์ฉ fadeInํจ๊ณผ ๊ฑธ๊ธฐ (0) | 2023.10.23 |
์๋ฐ์คํฌ๋ฆฝํธ๋ก ์๋ ์ฌ๋ผ์ด๋ ๊ตฌํํ๊ธฐ (querySelector / setInterval) (1) | 2023.10.18 |
function ์ด๋? (0) | 2023.09.05 |
์๋ฐ์คํฌ๋ฆฝํธ ํท๊ฐ๋ฆฌ๋ ๋ ผ๋ฆฌ์ฐ์ฐ์ : || (or) $$ (and) !(not) (0) | 2023.08.30 |
๋๊ธ