[โฌ๏ธclick ํ๋ฉด]
[โฌ๏ธmouseover ํ๋ฉด]
<div class="star-container">
<label class="star-label">
<input value="1" class="star-radio" type="radio" />
<span class="star-icon"></span>
</label>
<label class="star-label">
<input value="2" class="star-radio" type="radio" />
<span class="star-icon"></span>
</label>
<label class="star-label">
<input value="3" class="star-radio" type="radio" />
<span class="star-icon"></span>
</label>
<label class="star-label">
<input value="4" class="star-radio" type="radio" />
<span class="star-icon"></span>
</label>
<label class="star-label">
<input value="5" class="star-radio" type="radio" />
<span class="star-icon"></span>
</label>
</div>
star-container
์์label
ํ๊ทธ 5๊ฐ๋ฅผ ๋ฃ๋๋ค.- ๊ฐ
label
ํ๊ทธ ์์input
ํ๊ทธ์span
๋ฅผ ๋ฃ๋๋ค.input
์ ๋ผ๋์ค ํ์ ์ผ๋ก css์display : none;
์ผ๋ก ์จ๊ธด๋ค.- ๊ทธ ์์
span
์ผ๋ก ๋น ๋ณ ์ด๋ฏธ์ง๋ฅผ ๋ฃ๋๋ค.input
์ value์๋ ๊ฐ 1~5์ ๊ฐ์ ๋ฃ๋๋ค. (๊ทธ ๊ฐ์ ํด๋ฆญํ์ ๋ ๊ฐ์ ์๊ธฐ์ํด.)
/** ๋ณ ์ฑ์ฐ๊ณ ์ง์ฐ๊ธฐ ํจ์ */
//๋ณ์ ์ฑ์ฐ๊ธฐ
const fillStar = (value) => {
for (let i = 0; i < value; i++) {
starsList[i].classList.add("fill");
}
};
//๋ณ์ ์ง์ฐ๊ธฐ
const removeFill = () => {
for (let i = 0; i < 5; i++) {
starsList[i].classList.replace("fill", "star-icon");
}
};
fillStar
๋ ํด๋ฆญ/ํธ๋ฒ ํ ๋ถ๋ถ์ value๋ฅผ ๋ฐ์ ์ธ๋ฑ์ค 0๋ถํฐ value๊ฐ๊น์ง์ class ์ด๋ฆ์fill
๋ก ๋ฐ๊พธ์ด์ฃผ๋ ํจ์๋ค.
-> css์์ fill์ ์ฑ์์ง ๋ณ ์ด๋ฏธ์ง๋ก ์ค์ ํ๋ค.removeFill
์ 0๋ถํฐ 4๊น์ง(5๋ฒ) ๋ณ์ ๋ค ๋น ๋ณ๋ก ์ด๊ธฐํ ์ํค๋ ํจ์์ด๋ค.
const starsWrap = document.querySelector(".star-container");
//ํด๋ฆญํ ๊ณณ ์ ์ฅํด์ฃผ๋ ๋ณ์
export let Checked = 0;
/**๋ณ ๋ง์ฐ์ค ํด๋ฆญ */
//ํด๋ฆญ ์ด๋ฒคํธ ์ ํด๋ฆญํ ๋ณ๊น์ง ์ฑ์์ง
starsWrap.addEventListener("click", (e) => {
removeFill();
fillStar(e.target.value);
Checked = e.target.value;
});
star-container
๋ฅผ ํด๋ฆญ ํ ๋, ํด๋ฆญ ํ ๊ณณ์ target value ๋งํผ ๋ณ์ด ์ฑ์์ง๊ฒ ํ๋ค.- ์ด๋, checkํ ๊ณณ์ด ์ด๋์ง ์ ์ฅํ๊ฒ ํ๋ Checked ๋ณ์์ target์ value๋ฅผ ์ ์ฅํ๋ค.(ํ์ ๋ฆฌ๋ทฐ๋ฅผ ์ ์ฅํ ๋ ๋ณ์ ์ ์ผ๋ง๋ ์คฌ๋์ง ํ์ธํ๊ธฐ ์ํด)
let starsList = document.querySelectorAll(".star-icon");
/** ๋ณ ๋ง์ฐ์ค ํธ๋ฒ */
//๋ง์ฐ์ค ํธ๋ฒ ์ ๋ณ์ ์ฑ์ฐ๊ธฐ
starsWrap.addEventListener("mouseover", () => {
starsList.forEach((star, idx) => {
star.addEventListener("mouseenter", (e) => {
removeFill();
fillStar(idx + 1);
});
});
});
//๋ง์ฐ์ค ํธ๋ฒ๋ฅผ ์ํ ๋, ์ ์ ํด๋ฆญํ ๊ณณ๊น์ง
starsWrap.addEventListener("mouseout", () => {
if (Checked !== 0) {
removeFill();
fillStar(Checked);
} else {
removeFill();
}
});
- ๋ง์ฐฌ๊ฐ์ง๋ก
star-container
๋ฅผmouseover
ํ ๋, ๋น ๋ณ ์ด๋ฏธ์ง๋ฅผ ๋ด๊ณ ์๋star-icon
์ 5๊ฐ ๋ค ๋ถ๋ฌ์์ starList๋ก ์ ์ธํ๊ณ ๋ฐ๋ณต๋ฌธ์ ๋๋ ค์ ๊ฐ ์์ดํ ์mouseenter
ํ ๋,removeFill()
๋ก ์ด๊ธฐํ ํ ๋ค,fillStar(idx+1)
๋ก ํธ๋ฒํ ์ธ๋ฑ์ค๋งํผ ์ฑ์ด๋ค.
-> ์ด๋, idx+1์ธ ์ด์ ๋ ๋ณ์ 0๋ฒ์งธ value๊ฐ 1๋ก ์์ํ๊ธฐ ๋๋ฌธ.- ๋ mouse๊ฐ ๋ฒ์ด๋๊ฒ ๋๋ฉด, ์ด์ ์
Checked
์ ์ ์ฅํ ๊ฐ๋งํผ ์ฑ์์ค๋ค.
์ด๋ฏธ์ง๋ ์์๋ก ์๋ ์ฃผ์์ velog์ ๋ณ์ ๊ฐ์ ธ๋ค ์ผ๋ค. ํ์์ด ์์ด์ฝ ์์ ์ ๋ง์น๋ฉด ์ง์ง๋ก ์์ฑ!