-
[JS30] ์๋ฐ์คํฌ๋ฆฝํธ๋ก CSS ๋ณ์(์ฌ์ฉ์ ์ ์ ์์ฑ) ์กฐ์ ํ๊ธฐ
2019. 1. 7.
320x100๐ฅJavascript 30 - Day 03๐ฅ
1. ๋งํฌ์ /์คํ์ผ๋ง
์ด๋ฒ์๋ CSS๋ฅผ JS๋ก ์ ์ดํด ๋ด ์๋ค! ์ฐ์ ์ ๋นํ ๋งํฌ์ ํ๊ณ ์ ๋นํ ์คํ์ผ๋ง ํฉ๋๋ค
(์ฐธ ์ฝ์ฃ ?).
์์ธํ html, css์ฝ๋๋ Codepen ๊ฒฐ๊ณผ๋ฌผ ์ ์์ด์! >
์ ์ด ๊ฐ๋ฅํ ์ต์ ์ 'ํฐํธ ์ฌ์ด์ฆ/๋ฉ์ธ ์ปฌ๋ฌ/์ด๋ฏธ์ง ๋ธ๋ฌ์ฒ๋ฆฌ' ์๋ ๊ฒ 3๊ฐ์ง์ ๋๋ค.<!-- HTML --> <div class="wrap"> <h1>Update CSS Variables With <em>JS</em></h1> <div class="option"> <strong>Option</strong> <div class="block"> <label for="textSize" class="opt-title">Font size</label> <input type="range" name="textSize" min="11" max="18" value="14" data-sizing="px" /> </div> <div class="block"> <label for="mainColor" class="opt-title">Main Color</label> <input type="color" name="mainColor" value="#ffc600"> </div> <div class="block"> <label for="blur" class="opt-title">Background Blur</label> <input type="range" name="blur" min="0" max="10" value="0" data-sizing="px" /> </div> </div> <div class="content"> <article class="article-1"> <img src="http://unsplash.it/960?image=183" alt="image" class="img"> <div class="txt">{ํ ์คํธ}</div> </article> <article class="article-2"> <img src="http://unsplash.it/960?image=179" alt="image" class="img"> <div class="txt">{ํ ์คํธ}</div> </article> <article class="article-3"> <img src="http://unsplash.it/960?image=228" alt="image" class="img"> <div class="txt">{ํ ์คํธ}</div> </article> </div> </div>
2. :root ์์ฑ ์์ฑํ๊ธฐ
๊ทธ ๋ค์, ์๋์ ๊ฐ์ด CSS๋ฅผ ์ถ๊ฐ ์์ฑํด ์ค๋๋ค.
:root { /*์ฝ๋ ์์ฑ*/ }
์ ๊น!!! ๋๋์ฒด
:root
๊ฐ ๋ญ์ง?! ์ถ์ ์ฌ๋(๋ฐ๋ก ์ ๋๋ค)์ ์ํด ์ง๊ณ ๋์ด๊ฐ์ฃ !:root
์ ํ์๋ ๋ฌธ์์ ์ต์์ ์์๋ฅผ ๊ฐ๋ฆฌํต๋๋ค. HTML ๋ฌธ์์์ ์ต์์ ์์๋ผ ํจ์ ๋น์ฐํ <html/>์ ๋งํ๊ฒ ์ฃ !
์๋ ๊ทธ๋ผ,:root{}
๋html{}
์ด๋ ๊ฐ์ ๊ฑฐ ์๋๊ฐ ์ถ์๋ฐ์.:root
๋ ๊ฐ์ ์ ํ์์ด๊ธฐ ๋๋ฌธ์, html ์ ๋ ํฐ๋ณด๋ค๋ ์ฐ์ ์์๊ฐ ๋์ต๋๋ค. ๊ทธ๋์ :root์ html์ ๋ํ ์คํ์ผ์ ๋์์ ์ ์ธํ๋ฉด, :root์ ๋ํ ์คํ์ผ์ด ์ฐ์ ๋ฉ๋๋ค.ํ ... ๊ทธ๋ผ, ์ด
:root
๋ ์ด๋์๋ค ์จ๋จน์ ์ ์์๊น์? ๋ฐ๋ก ์ ์ญ ์ค์ฝํ์ CSS ๋ณ์๋ฅผ ์ ์ธํ ๋ ์ฌ์ฉํฉ๋๋ค.
CSS ๋ณ์๋ผ๊ณ ํ๋๊น SASS์์ ์ฌ์ฉํ๋$var = red;
๊ฐ ๋ ์ค๋ฅด๋๋ฐ, ์ด๊ฑฐ๋์ ๋ค๋ฆ ๋๋ค. SASS๊ฐ ์๋๋ผ CSS๊ฑฐ๋ ์!! (CSS๋ ๋ณ์๋ฅผ ์ธ ์ ์๋ค๋ ์ถฉ๊ฒฉ....)CSS ๋ณ์(์ ํํ๋ '์ฌ์ฉ์ ์ ์ CSS ์์ฑ'์ด๋ผ๊ณ ํฉ๋๋ค)๋ ์๋์ฒ๋ผ,
--
๋ก ์์ํฉ๋๋ค.:root { --textSize: 14px; }
์ด๋ ๊ฒ ์ ์ธํ ์ฌ์ฉ์ ์ ์ ์์ฑ์
var()
๋ฅผ ํตํด ์ ๊ทผํ ์ ์์ต๋๋ค.p { font-size: var(--textSize); }
์ด์ --textSize์ ๊ฐ์ ๋ฐ๊พธ๋ฉด ๊ทธ์ ๋ฐ๋ผ ํฐํธ ํฌ๊ธฐ๊ฐ ๋ฌ๋ผ์ง๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.
์ด์ด์ :root์ ๋ค๋ฅธ ๋ณ์๋ค๋ ์์ฑํด ์ค๋๋ค.
:root { --textSize: 14px; --mainColor: #ffc600; --blur: 0px; }
3. JS ์์ฑํ๊ธฐ
์ด์ ๋ณธ๊ฒฉ์ ์ผ๋ก ์คํฌ๋ฆฝํธ ๋ถ๋ถ์ ์์ฑํฉ๋๋ค. ์ฐ์ ๊ฐ ์ต์ (input)๋ค์ ์ ๋ ํ ํฉ๋๋ค.
const inputs = document.querySelectorAll(".option input"); console.log(inputs);
์ฝ์์
[input, input, input]
๊ณผ ๊ฐ์ด ์ฐํ๋์ค๋ค์.
์ผํ ๋ด์๋ ๋ฐฐ์ด๊ฐ์ ๋ณด์ด๋ค์. [] ์์ ๋ค์ด์๊ณ , ์ธ๋ฑ์ค์ length๋ ๊ฐ๊ณ ์์ผ๋๊น์. ๊ทธ๋ฌ๋....
๋๋ฅ. ์ฌ์ค ์๋NodeList
์ ํด๋นํฉ๋๋ค. (๋ฐฐ์ด๊ณผ๋ ๋ค๋ฅด๋ค, ๋ฐฐ์ด๊ณผ๋!) (*์ฐธ๊ณ )์๋ฌด ๋ฐฐ์ด์ด๋ ๋ง๋ ๋ค์ ์ฝ์์ ์ฐ์ด ๋น๊ตํด๋ณด๋ฉด ์ ์ ์์ต๋๋ค. __proto__๋ก ์ฐ๊ฒฐ๋ ํ๋กํ ํ์ ์ค๋ธ์ ํธ๊ฐ ๊ฐ๊ฐ NodeList, Array๋ก ์๋ก ๋ค๋ฆ ๋๋ค. ๋ฐฐ์ด์ ๋ฐฐ์ด ๊ด๋ จ ๋ฉ์๋๋ฅผ ์์๋ฐ์ ์ธ ์๊ฐ ์์ด์(map, push, pop, filter, jon ๋ฑ๋ฑ!)
ํ์ง๋ง NodeList๋ ๊ฐ๊ณ ์๋ ๋ฉ์๋๊ฐ ๋ช ๊ฐ ์๊ณ ๊ฐ๋ํฉ๋๋ค(fotEach ์ ๋...ใ ใ )
๊ทธ๋์ ํ์ ์์๋ ์ด NodeList๋ฅผ ๋ฐฐ์ด๋ก ๋ณํํด์ ์ฐ๊ธฐ๋ ํ์ง๋ง, ์ฌ๊ธฐ์๋ ๊ทธ๋ฅ forEach๋ฅผ ์ธ ๊ฑฐ๋๊น ํจ์คํ๊ฒ ์ต๋๋ค. forEach๋ IE 9๋ถํฐ ์ง์ํฉ๋๋ค! (*์ฐธ๊ณ )inputs.forEach(input => { console.log(input); });
์... ๊ทธ๋ผ ํฐํธ ์ฌ์ด์ฆ๋ฅผ ๋ฐ๊พธ๋ ค๋ฉด <input/>์ ๋ฌ๋ฆฐ ํ๋กํผํฐ ์ค์ value ๊ฐ์ ๋ณ๊ฒฝํ๋ฉด ๋๊ฒ ๋ค์. ๋ฉ์ธ ์ปฌ๋ฌ๊ฐ์ด๋ blur๊ฐ๋ ๋ง์ฐฌ๊ฐ์ง๋ก value์์ ๊ฐ์ ธ์ค๋ฉด ๋ ๊ฑฐ ๊ฐ๊ณ ์. ๊ทธ๋ผ ์ด์ input์ ๊ฐ์ ๋ฐ๊พธ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ผ๊ฒ ๋ค์. ์ฐ์ ์ handleUpdate()๋ผ๋ ๋น ํจ์๋ฅผ ๋ง๋ค๊ณ ์ฐ๊ฒฐ์์ผ์ค๋๋ค.
const handleUpdate = function() { console.log(this.value); } inputs.forEach(input => { input.addEventListener("change", handleUpdate); input.addEventListener("mousemove", handleUpdate); });
์ฌ๊ธฐ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ change์ mousemove์ผ ๋ ๋ฌ์์ค ์ด์ ๋, change๋ ๋ง์ฐ์ค ์์ง์์ด ๋๋ ์๊ฐ๋ง ํฌ์ฐฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ range input์ ๋๋๊ทธํ๋ '๋์ค'์๋ ๊ทธ ๊ฐ์ ์ ์ ์๊ธฐ ๋๋ฌธ์ mousemove๋ ํจ๊ป ๋ฃ์ด์คฌ์ต๋๋ค :)
์๋ฌดํผ ์ฝ์์ ์ดํด๋ณด๋ฉด input์ ์กฐ์ํ ๋๋ง๋ค value๊ฐ ์ฐํ๋์ค๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค. ๊ทผ๋ฐ ๊ทธ ๊ฐ์ด ๊ทธ๋ฅ num(์ซ์)๋ค์. CSS๋ก ๋ฃ์ผ๋ ค๋ฉด px ๋ฑ์ ๋จ์๊ฐ ํ์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ data-sizing์ผ๋ก px์ด๋ ๊ฐ์ ๋ฏธ๋ฆฌ ๋ฃ์ด์ค ์ด์ ์ฃ ! ๋จ์๋ฅผ ๋ฐ์์ฌ ๋ณ์๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
const handleUpdate = function() { const suffix = this.dataset.sizing || ''; }
์ฌ๊ธฐ์
||
๊ฐ ๋ค์ด๊ฐ๋ ์ด์ ๋, ์ปฌ๋ฌ๊ฐ ๊ฐ์ ๊ฒฝ์ฐ์ data-sizing๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๋์ undefined๊ฐ ๋ฐ ๊ฑฐ๊ณ , ๊ฒฐ๊ตญ#f1f1f1undefined
๊ฐ์ด ์ด์ํ๊ฒ ๋์ค๊ฒ ์ฃ . ๊ทธ๋์ ๊ฐ์ด ์๋ ๊ฒฝ์ฐ์ ๊ณต๋ฐฑ์ด ๋๋๋ก ์ฒ๋ฆฌํ์ต๋๋ค.์, ๊ทธ๋ผ ์ด์ ์ด ์ ๋์ ์ธ ๊ฐ์ --textSize์๊ฒ ๋ฐ์์์ผ ๋ณผ ์ฐจ๋ก์ ๋๋ค.
const handleUpdate = function() { const suffix = this.dataset.sizing || ''; document.documentElement.style.setProperty('--textSize', this.value + suffix); }
์๋ฌด length input์ ์์ง์ด๋ฉด ๊ทธ ๊ฐ์ ๋ฐ๋ผ ํฐํธ ์ฌ์ด์ฆ๊ฐ ์กฐ์ ๋๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค (์ฐ์์์)
์ฌ๊ธฐ์document.documentElement
๋ document์ ๋ฃจํธ ์์์ธ Element๋ฅผ ๋ฆฌํดํฉ๋๋ค. ๋ญ, ์ฝ๊ฒ ๋งํ์๋ฉด<html>
์ธ๋ฐ์,:root
์ ํ์๋ก ๋ฃจํธ ์์์๋ค CSS๋ฅผ ์์ฑํ๊ธฐ ๋๋ฌธ์ ์ด๋ ๊ฒ ๋ฃจํธ์์๋ฅผ ์ ๋ ํ ํ ๊ฑฐ์ฃ . (*์ฐธ๊ณ )๊ทธ ๋ค์ ๋์ค๋
style.setProperty()
๋ CSS์์ฑ์ ์ฌํ ๋น์ํค๋ ๋ฐ ์ฐ์ ๋๋ค. (IE9+ ์ง์์ด๋ฉฐ IE8 ์ดํ๋ setAttribute๋ฅผ ์จ์ผํฉ๋๋ค) (*์ฐธ๊ณ )
์, ์๋์ ๋ ์ฝ๋๊ฐ ์์ต๋๋ค!button.style.setProperty ("background-color", "green");
button.style.backgroundColor = "green";
๋ญ๊ฐ ๋ค๋ฅผ๊น์? ์ฌ์ค, ์ ๋ ์ฝ๋๋ ๋๊ฐ์ด ๋์ํฉ๋๋ค. ์ฐจ์ด๊ฐ ์๋ค๋ฉด ์์๋ KEBAB-CASE๊ณ , ์๋๋ CAMEL-CASE๋ผ๋ ์ ์ด๊ฒ ๋ค์. ์ ๋ JS๋ก ์คํ์ผ์ ๋ฐ๊พธ๋ ค๋ฉด ์ ๋ ๊ฒ ์นด๋ฉ์ผ์ด์ค๋ก ์จ์ผํ๋ค~๊ณ ๋ฐฐ์ ์ง๋ง ๊ทธ ์ด์ ๋ ๋ชฐ๋์ต๋๋ค@.@
๊ทธ๋ฐ๋ฐ ์ ๋ ๊ฒ ์นด๋ฉ์ผ์ด์ค๋ก ์จ์ ์คํ์ผ์ ์ ์ดํ ์ ์๋ ์ด์ ๋, style ๊ฐ์ฒด ๋๋ถ์ด๋๋ผ๊ตฌ์! style๊ฐ์ฒด๊ฐ backgroundColor๋, color, borderBottom ๋ฑ์ ์์ฑ์ ๊ฐ๊ณ ์๊ธฐ ๋๋ฌธ์ ์ ๊ทผํด์ ์ธ ์ ์๋ ๊ฑฐ์ฃ .ํ๋ฐ ์ฐ๋ฆฌ๊ฐ ์ฐ๋ ค๋ --textSize๋ผ๋ ์์ฑ์ ๊ทธ๋ฅ ์ฐ๋ฆฌ๊ฐ ๋ฐฉ๊ธ ์ฆ์์์ ๋ฟ ๋ง๋ ์์ฑ์ ๋๋ค. ๋ฐ๋ผ์ style ๊ฐ์ฒด์๊ฒ ์ด๋ฐ ์์ฑ์ ๋ฌผ์ด๋ด๋ "๋จธ๋ญ" ์ด๋ ๋๋ต๋ง ๋์์ค๊ฒ ์ฃ ใ ใ ใ ใ ๊ทธ๋์ ๋์ setProperty() ๋ฉ์๋๋ฅผ ์จ์ ์ ๊ทผํด์ผ ํฉ๋๋ค. ์ด ๋ฉ์๋๋ 3๊ฐ์ ํ๋ผ๋ฏธํฐ๋ฅผ ๊ฐ๋๋ฐ, ๊ทธ๋ฅ
("{์คํ์ผ ์ด๋ฆ}", "{์คํ์ผ ๋ด์ฉ}")
๊ณผ ๊ฐ์ด ๋ ๊ฐ ์ฐ๋ฉด ์ ์ฉ๋๋ค~!! ๋ผ๊ณ ๋ง ์ฐ์ ์์๋ก์๋ค.
๊ทธ๋ผ ์๊น ์ฝ๋๋ฅผ ๋ค๋ฅธ ์ฌ์ฉ์ ์ ์ ์์ฑ์๋ ๋ฐ์ํ๊ฒ๋ ๋ฐ๊ฟ๊ฒ์.const handleUpdate = function() { const suffix = this.dataset.sizing || ''; document.documentElement.style.setProperty(`${this.name}`, this.value + suffix); }
์ง๋ผ์ง - ์ ์ ์ฉ๋๋ ๊ฑธ ๋ณผ ์ ์์ต๋๋ค :D
Codepen ๊ฒฐ๊ณผ๋ฌผSee the Pen Update CSS Variables With JS by NY KIM (@nykim_) on CodePen.
728x90'Blog > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[JS30] Dev Tools Tricks (0) 2019.02.17 [JS30] HTML Canvas (0) 2019.02.15 [JS30] Array ๋ฉ์๋(2) (0) 2019.02.11 [JS30] Ajax Type Ahead (Ajax ํ์ดํ) (1) 2019.02.06 [JS30] Array ๋ฉ์๋ (1) (1) 2019.01.07 ๋๊ธ