๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Dev/+@

HTML, CSS๋กœ ํ† ๊ธ€ ๋ฒ„ํŠผ ๋งŒ๋“ค๊ธฐ

by vellahw 2023. 6. 9.

 

 

๐Ÿคฉ ์™„์„ฑ๋ณธ ๋จผ์ € ๋ณด๊ธฐ

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;
}

 

CSS ์ ์šฉ

 

ํ† ๊ธ€์˜ ์˜จ/์˜คํ”„๋Š” ์ฒดํฌ๋ฐ•์Šค ์ฒดํฌ ์œ ๋ฌด๋กœ ํŒ๋ณ„๋œ๋‹ค.

์ฒดํฌ๋ฐ•์Šค์— ์•„์ด๋””๋กœ ์ ‘๊ทผํ•˜์—ฌ 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;
}

 

CSS ์ ์šฉ

 

์› ๋„ํ˜•์€ ::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)์„ ๋บ€ ๋งŒํผ์ด ๊ณ„์‚ฐ๋˜์–ด ์ด๋™ํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

์—ฌ๊ธฐ๊นŒ์ง€ ํ•˜๋ฉด ์™„์„ฑ!

์‰ฝ๊ณ  ๊ฐ„๋‹จํ•˜๊ณ  ์žฌ๋ฏธ์žˆ๊ฒŒ ํ† ๊ธ€ ๋ฒ„ํŠผ์„ ๋งŒ๋“ค์–ด๋ณด์•˜๋‹ค ๐Ÿ˜€๐Ÿฅณ

 

 


 

๋Œ“๊ธ€