๐คฉ ์์ฑ๋ณธ ๋จผ์ ๋ณด๊ธฐ
CSS ์์ ์ ๋ค์ผ๋ฉฐ transition ์์ฑ์ ๊ฐ์ง๊ณ ์ฌ๋ฌ ์์ฉ ์ค์ต์ ํด๋ดค๋๋ฐ ๊ทธ์ค ํ ๊ธ ๋ฒํผ์ ๋ฐ๋ก ๊ธฐ๋กํ๊ณ ์ ํ๋ค! ํ๋ก์ ํธ ํ ๋ ํ์ ์ธ๋๊ฐ ํ ๊ธ๋ฒํผ ๋ง๋ค์์ด์ ๋๋ ๋ง๋ค์ด ๋ณด๊ณ ์ถ์๋ค ใ ใ HTML๊ณผ CSS๋ง์ผ๋ก ์ ์ ์ผ๋ก ๋ง๋ ๋ฒํผ์ด๋ผ ์ค์ ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด๋ ค๋ฉด ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ ๋ค์ด๊ฐ๊ณ ๋ค์ ๋ณต์กํด์ง๊ฒ ์ง๋ง ๊ถ๊ธํ๋ ๋ฒํผ ๊ตฌํ ํ๋ ํด๋ดค๋ค๋ ๊ฒ์ ์์๋ฅผ.. ๐ช๐ป
1. HTML ์์ฑ
<input type="checkbox" id ="toggle-slider">
<label for="toggle-slider">on/off</label>
์๋ฌด๋ฐ ์คํ์ผ์ด ์ ํ์ง์ง ์์ ํ๋ฉด์ ์์ ๊ฐ์ด ์ฒดํฌ๋ฐ์ค์ ๋ผ๋ฒจ ํ๊ทธ ๋ฟ์ด๋ค. CSS๋ก ๋ชจ์์ ์ก์์ฃผ๋ ๊ฒ!
2. CSS ์์ฑ
/* ์ฒดํฌ๋ฐ์ค */
#toggle-slider {
display: none;
}
label {
text-indent: -999em;
cursor: pointer;
width: 100px;
height: 50px;
background-color: #e0e0e0;
border-radius: 25px;
position:relative;
transition: 0.5s ease-out;
}
ํ ๊ธ์ ์จ/์คํ๋ ์ฒดํฌ๋ฐ์ค ์ฒดํฌ ์ ๋ฌด๋ก ํ๋ณ๋๋ค.
์ฒดํฌ๋ฐ์ค์ ์์ด๋๋ก ์ ๊ทผํ์ฌ display: none์ ์ฃผ์ด ํ๋ฉด์์ ๋ณด์ฌ์ง์ง ์๊ฒ ์ฒ๋ฆฌํ๋ค.
HTML์ ์์ฑํ ๋ ๋ผ๋ฒจ ํ๊ทธ๋ก ์๋งจํฑํ๊ฒ(?) on/off ๋ผ๋ ๊ธ์๋ฅผ ์จ์คฌ๋๋ฐ ๊ธ์๋ฅผ ๊ฐ๋ฆฌ๊ธฐ ์ํด text-indent ์์ฑ์ ์ฌ์ฉํ๋ค.
text-indent๋ ๋ค์ฌ์ฐ๊ธฐ ์์ฑ์ด์ง๋ง ํ๋ฉด์์ ์ ๋ณด์ด๋๋ก ๊ธ์๋ฅผ ๋ฉ~~~๋ฆฌ ๋ณด๋ด๋ฒ๋ฆด ๋ ์ฌ์ฉํ๊ธฐ๋ ํ๋ค.
ํ ๊ธ ๋์์ธ์ ํ์ํ์ ๋ฐํ ์์ ์ ๋ํ์ด ์ฌ๋ผ๊ฐ ํํ์ด๊ธฐ ๋๋ฌธ์ ์ํํ ์กฐ์์ ์ํด position์ relative๋ก ์ค์ ํ๋ค.
๐ ๋ฐํ ์์ ์ ์ฌ๋ฆฌ๊ธฐ
label::after {
content: '';
width: 40px;
height: 40px;
background-color: #fff;
position: absolute;
border-radius: 50%;
top: 5px;
left: 5px;
transition: 0.5s ease-out;
}
์ ๋ํ์ ::after ์ ํ์๋ฅผ ์ฌ์ฉํด ๋ง๋ค์๋ค.
::after๋ ์ ํํ ์์ ๋ค์ ํ ์คํธ ์์๋ฅผ ์ฝ์ ํ๋ ์ญํ ์ ํ๋ค. content ์์ฑ์ ์ฝ์ ํ ๋ด์ฉ์ ์ ๋ ฅํด์ผ ํ๋๋ฐ ์ฌ๊ธฐ์ ํ ์คํธ๋ ํ์์๊ธฐ ๋๋ฌธ์ ๊ณต๋ฐฑ์ผ๋ก ๋จ๊ฒจ๋๋ค.
width์ height๋ก ์์์ ํฌ๊ธฐ๋ฅผ ์ค์ ํ๊ณ border-radius๋ฅผ 50%๋ฅผ ์ค ์ํ์ผ๋ก ๋ง๋ค์๋ค.
๋ฐํ์ธ ๋ผ๋ฒจ ํ๊ทธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์์น๊ฐ ์ด๋๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์ position์ absolute๋ก ์ค์ ํ๊ณ top ์์ฑ๊ณผ left ์์ฑ์ ์ฌ์ฉํด ์์น๋ฅผ ์ง์ ํด์คฌ๋ค.
transition: 0.5s ease-out ์ ๋ถ์ํ์๋ฉด 0.5์ด์ ๊ฑธ์ณ ๋๋ฆฌ๊ฒ ๋๋๋๋ก ์ ํํจ๊ณผ๋ฅผ ์ง์ ํ ๊ฒ์ด๋ค.
๐ ์ ํ ์คํ์ผ ์ ํ๊ธฐ
#toggle-slider:checked + label {
background-color: #20d51a;
}
#toggle-slider:checked + label::after {
left:calc(100% - 45px);
background-color: #fff;
}
์ฒดํฌ๋ฐ์ค์ ์์ด๋๋ก ์ ๊ทผํ์ฌ '+' ์ ํ์๋ฅผ ์ฌ์ฉํด ์ฒดํฌ๋ฐ์ค๊ฐ ์ฒดํฌ๋์ด์ผ๋ง ๋ฐํ(label)๊ณผ ์ํ(label::after)์ ์ ํ๋ ์คํ์ผ์ ๊ฐ๊ฐ ์ค์ ํด์คฌ๋ค.
์ฒดํฌ๋ฐ์ค๊ฐ ์ฒดํฌ๋๋ฉด ๋ฐํ์์ ๊ทธ๋ฆฐ ์ปฌ๋ฌ๋ก ๋ฐ๋๋ค.
์ ๋ํ์ ํฐ์์ผ๋ก ๋ฐ๋๊ณ calc() ํจ์๋ก ์ข์ธก์์๋ถํฐ ์ด๋๋ ์์น๊ฐ ๊ณ์ฐ๋ผ ์ง์ ๋๋ค.
calc() ํจ์๋ ์์ญ์ 100%(๋ฐํ)์์ 45px(์์ ํฌ๊ธฐ 40px + ๋ง์ง ์์ญ 5px)์ ๋บ ๋งํผ์ด ๊ณ์ฐ๋์ด ์ด๋ํ๊ฒ ๋๋ค.
์ฌ๊ธฐ๊น์ง ํ๋ฉด ์์ฑ!
์ฝ๊ณ ๊ฐ๋จํ๊ณ ์ฌ๋ฏธ์๊ฒ ํ ๊ธ ๋ฒํผ์ ๋ง๋ค์ด๋ณด์๋ค ๐๐ฅณ
'Dev > +@' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
์ฌ์ฉ์ ๊ด์ ์ UI ๊ตฌ์ฑํ๊ธฐ (0) | 2023.09.05 |
---|---|
์๋ฆฌ๋ํฐ string memory (๋ฐ์ดํฐ ์ ์ฅ ์์ญ) (0) | 2023.06.01 |
๋๊ธ