Style Sheet/CSS

🎨 CSS λ³€μˆ˜(--variable) μ‚¬μš©λ²• & μ‘μš© 정리

인파_ 2021. 10. 19. 16:35

css-variable

CSS λ³€μˆ˜ κΈ°λŠ₯

λ³΅μž‘ν•œ μ›Ήμ‚¬μ΄νŠΈ 같은 경우 μ—„μ²­λ‚œ μ–‘μ˜ CSSλ₯Ό 가지고 μžˆλŠ”λ°, μœ μ§€λ³΄μˆ˜λ₯Ό ν•˜λ‹€ 보면 μ—¬λŸ¬ κ³³μ—μ„œ μ‚¬μš©ν•œ μž„μ˜μ˜ 값을 ν•œκΊΌλ²ˆμ— λ°”κΏ”μ•Ό ν•  λ•Œκ°€ μžˆλ‹€. κ·Έ 값듀을 ν•˜λ‚˜μ”© μ°Ύμ•„μ„œ 일일이 λ°”κΎΈλ €λ©΄ μƒλ‹Ήνžˆ ν”Όκ³€ν•  것이고, λ•Œμ— 따라 μ‹€μˆ˜λ„ λ§Žμ„ 것이닀.

κ·Έλž˜μ„œ 여타 ν”„λ‘œκ·Έλž˜λ° μ–Έμ–΄μ²˜λŸΌ λ³€μˆ˜λ₯Ό μ΄μš©ν•˜λ©΄, μš”μ†Œ μ „λ°˜μ— 걸쳐 μ‚¬μš©λ˜λŠ” μž„μ˜μ˜ 값을 λ³€μˆ˜μ— μ €μž₯ν•˜κ³  ν˜ΈμΆœν•˜λ©΄ 보닀 효율적인 ν”„λ‘œκ·Έλž˜λ°μ΄ κ°€λŠ₯해진닀.

css-variable


CSS λ³€μˆ˜ μ„ μ–Έ 및 호좜

CSSμ—μ„œ λ³€μˆ˜μ˜ 이름을 지정할 λ•ŒλŠ” λ³€μˆ˜ 맨 μ•žμ— -- λ₯Ό λΆ™μ—¬μ£Όμ–΄μ•Ό ν•œλ‹€. 그리고 λ³€μˆ˜λ₯Ό ν˜ΈμΆœν•΄ μ‚¬μš©ν•  λ•ŒλŠ” var(λ³€μˆ˜λͺ…)ν˜•μ‹μ„ μ‚¬μš©ν•œλ‹€.

:root {
	--main-font-color: #000f22;  /* CSS μ „μ—­ λ³€μˆ˜ μ„ μ–Έ */
}

div {
	color: var(--main-font-color);   /* CSS λ³€μˆ˜ μ‚¬μš© */
}

CSS λ³€μˆ˜ μ„ μ–Έ μŠ€μ½”ν”„

 

μ „μ—­ λ³€μˆ˜ μŠ€μ½”ν”„

CSS의 :root μ˜μ‚¬ν΄λž˜μŠ€λŠ” λ¬Έμ„œ 트리의 루트 μš”μ†Œλ₯Ό μ„ νƒν•œλ‹€. μ¦‰, HTML λ¬Έμ„œμ˜ 루트 μš”μ†ŒλŠ” <html> μš”μ†Œμ΄λ―€λ‘œ, :root와 html은 κ°™λ‹€κ³  보면 λœλ‹€.

보톡 이 μ˜μ—­μ— css λ³€μˆ˜λ₯Ό μ„ μ–Έν•΄ μ‚¬μš©ν•œλ‹€κ³  λ³΄λ©΄λœλ‹€. μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ 따지면 μΌμ’…μ˜ μ „μ—­ λ³€μˆ˜ μ˜μ—­μ΄λΌκ³  μ΄ν•΄ν•˜λ©΄ λœλ‹€. :rootμ—μ„œ CSS λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜μ—¬ HTML λ¬Έμ„œ μ–΄λ””μ—μ„œλ‚˜ ν•΄λ‹Ή λ³€μˆ˜μ— μ ‘κ·Όν•  수 μžˆλ„λ‘ κ΅¬μ„±ν•˜λŠ” 것은 ν”ν•œ νŒ¨ν„΄μ΄λ‹€.

css-variable

 

지역 λ³€μˆ˜ μŠ€μ½”ν”„

μš”μ†Œ ν•˜λ‚˜ν•˜λ‚˜ λ§ˆλ‹€ 지역 λ³€μˆ˜λ‘œμ„œ ν™œμš©ν•  수 μžˆλ‹€. μ§€μ—­λ³€μˆ˜λ‘œ μ„ μ–Έλœ CSS λ³€μˆ˜λŠ” λ³€μˆ˜λͺ…이 같은지라도 전체 μš”μ†Œμ— κ³΅μœ λ˜μ§€ μ•Šκ³  μ˜€λ‘œμ§€ κ·Έ μš”μ†Œμ—μ„œλ§Œ 적용되게 λœλ‹€.

div {
	--font-color: #000f22;  /* CSS 지역 λ³€μˆ˜ μ„ μ–Έ */
    color: var(--font-color);   /* CSS λ³€μˆ˜ μ‚¬μš© */
}

p {
	--font-color: #000fff;  /* CSS 지역 λ³€μˆ˜ μ„ μ–Έ */
    color: var(--font-color);   /* CSS λ³€μˆ˜ μ‚¬μš© */	
}

CSS λ³€μˆ˜μ˜ 상속

CSS λ³€μˆ˜ μ—­μ‹œ μƒμ†λ˜λŠ” νŠΉμ„±μ„ μ§€λ‹ˆκ³  μžˆλ‹€. 보톡 HTMLμ—μ„œ μžμ‹ μ—˜λ¦¬λ¨ΌνŠΈμ— 값이 μ§€μ •λ˜μ§€ μ•Šμ€ 경우 λΆ€λͺ¨ μ—˜λ¦¬λ¨ΌνŠΈμ˜ 값을 μƒμ†λ°›λŠ”λ°, CSS λ³€μˆ˜λ‘œ μ„ μ–Έλœ 값이라도 μ˜ˆμ™Έ 없이 μƒμ†λœλ‹€.

  • div.one의 font-size : 10px
  • div.two의 font-size : 2rem
  • div.three의 font-size : 10px (.oneμ—μ„œ λ³€μˆ˜λ₯Ό 상속 λ°›μŒ)
<div class='one'>
  <div class='two'></div>
  <div class='three'></div>
</div>
.one {
	--test: 10px;
    font-size: var(--test);
}
.two {
	--test: 2rem;
    font-size: var(--test); /* 2rem */
}

.three {
	font-size: var(--test); /* 10px */ /* .oneμ—μ„œ λ³€μˆ˜λ₯Ό 상속 λ°›μŒ */
}

CSS λ³€μˆ˜ λŒ€μ²΄κ°’ μ„€μ •

만일 CSS λ³€μˆ˜μ˜ μˆ˜κ°€ λ„ˆλ¬΄ λ§Žμ•„, νŠΉμ • λ³€μˆ˜κ°€ μ •μ˜ λ¬λŠ”μ§€ μ•ˆλ¬λŠ”μ§€ λͺ¨λ₯Όλ–„, λ³€μˆ˜κ°’μ΄ μ—†λ‹€λ©΄, var() λ₯Ό μ€‘μ²©ν•¨μœΌλ‘œμ¨ μ—¬λŸ¬ 개의 λŒ€μ²΄ λ³€μˆ˜λ₯Ό μ •μ˜ν•  수 μžˆλ‹€.

.newCustomer {
    /* --new-font-colorκ°€ μ—†μœΌλ©΄ orangeλ₯Ό μ‚¬μš© */
    color: var(--new-font-color, orange);  
}

.oldCustomer {
    /* --old-font-colorκ°€ μ—†μœΌλ©΄ var(--normal-font-color, blue)λ₯Ό μ‚¬μš©ν•œλ‹€ */
    /* 그런데 또 --normal-font-colorκ°€ μ—†μœΌλ©΄ blueλ₯Ό μ‚¬μš©ν•œλ‹€ */
    color: var(--old-font-color, var(--normal-font-color, blue)); 
}

CSS λ³€μˆ˜ μ‚¬μš© μ£Όμ˜μ‚¬ν•­

 

μœ νš¨ν•˜μ§€ μ•Šμ€ CSS λ³€μˆ˜κ°’μ΄ μ„€μ • 될 경우

λΈŒλΌμš°μ €κ°€ μœ νš¨ν•˜μ§€ μ•Šμ€ var()λ₯Ό λ§Œλ‚˜λ©΄ κ·Έ μ†μ„±μ˜ μ΄ˆκΈ°κ°’μ΄λ‚˜ μƒμ†λœ 값을 μ‚¬μš©ν•œλ‹€.

예λ₯Όλ“€μ–΄ μ•„λž˜ .chicken μ„ νƒμžμ— λ³€μˆ˜κ°’μ΄ 16px둜 μœ νš¨ν•˜μ§€ μ•Šμ€ color κ°’이 λ“€μ–΄κ°„ μ…ˆμ΄λ‹€. 이 경우, v.chicken의 λΆ€λͺ¨ μ—˜λ¦¬λ¨ΌνŠΈμ˜ color μ†μ„±κ°’을 μƒμ†λ°›κ²Œ λœλ‹€. 그런데 λ§ŒμΌ .chicken의 λΆ€λͺ¨ μ—˜λ¦¬λ¨ΌνŠΈκ°€ μ—†μ„κ²½μš° λΈŒλΌμš°μ €μ˜ κΈ°λ³Έ 값이 λ“€μ–΄κ°„λ‹€.

:root {
	--chicken-color: 16px;  
}
.chicken {
	color: blue;
}
.chicken2 {
	color: var(--chicken-color);  /* color: 16px은 μœ νš¨ν•˜μ§€ μ•ŠμŒ */
}

 

λ³€μˆ˜λ‘œ λ‹¨μœ„κ°’ μ‚¬μš© μ£Όμ˜μ‚¬ν•­

만일 μ†μ„±μ˜ λ‹¨μœ„ 값을 λ³€μˆ˜λ‘œ μ²˜λ¦¬ν•΄μ•Ό ν• λ•Œ 보톡 μ•„λž˜μ™€ 같이 μ„€μ •ν•˜λ©΄ λœλ‹€κ³  μƒκ°ν• ν…ŒμΈλ°, μ‹€μ œ λΈŒλΌμš°μ €λŠ” μˆ«μžμ™€ λ‹¨μœ„ μ‚¬μœ„μ˜ λ¬΄μ˜λ―Έν•œ 곡백이 λ°œμƒν•˜λ©΄μ„œ λ‘κ°œμ˜ ν† ν°μœΌλ‘œ μΈμ‹ν•˜λŠ” 문제점이 λ°œμƒν•œλ‹€.

.block {
   --p: 33;
   width: var(--p)vw;
   height: var(--p)vh;
}

/*
.block {
   width: 33 vw; 띄어쓰기가 μ μš©λ˜μ–΄ μ—λŸ¬λ₯Ό λ°œμƒμ‹œν‚¨λ‹€
   height: 33 vh;
}
*/

λ”°λΌμ„œ 이 경우 calc() ν•¨μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό μ›ν•˜λŠ” μ˜λ„λ₯Ό 이행할 수 μžˆλ‹€.

.block {
   --p: 33;
   width: calc(var(--p) * 1vw);
   height: calc(var(--p) * 1vh);
}

CSS λ³€μˆ˜ ν™œμš© 예제

 

color의 rgbλ₯Ό λ³€μˆ˜ν™”

λ‹¨μˆœνžˆ 16μ§„μˆ˜ 색상 μ½”λ“œ(#fff)λ₯Ό λ³€μˆ˜μ— μ €μž₯ν•˜λŠ” 것을 λ„˜μ–΄μ„œ, rgb 및 alpha(투λͺ…도)λ₯Ό λ³€μˆ˜λ‘œ μ„Έλ°€ν•˜κ²Œ μ‘°μ • ν•  μˆ˜λ„ μžˆλ‹€.

:root {
    --color: 240, 240, 240;
    --alpha: 0.8;
}

div {
	background-color: rgba(var(--color), var(--alpha)); /* rgba(240, 240, 240, 80%) */
}

 

background-image의 url을 λ³€μˆ˜ν™”

μš”μ†Œμ˜ λ°°κ²½ 이미지 경둜λ₯Ό λ³€μˆ˜λ‘œ μ²˜λ¦¬ν•˜μ—¬μ•Ό ν• λ•Œ μ£Όμ˜ν•΄μ•Όν•  점이 μžˆλ‹€. 

예λ₯Όλ“€μ–΄ μ•„λž˜μ™€ 같이 이미지 κ²½λ‘œλ§Œμ„ λ³€μˆ˜μ— μ„€μ •ν•˜κ³  속성 λΆ€λΆ„μ—μ„œ url(var(--img)) μ‹μœΌλ‘œ ν˜ΈμΆœν•˜λŠ” 방법은 λ¬Έλ²•μ μœΌλ‘œ μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€.

:root {
	--img: "img/sample.jpg";
}

div {
    background: url(var(--img)); /* ERROR - λ™μž‘λ˜μ§€ μ•ŠμŒ */
}

λ”°λΌμ„œ url(μ΄λ―Έμ§€κ²½λ‘œ) 자체λ₯Ό λ³€μˆ˜ν™”ν•˜μ—¬ μ‚¬μš©ν•˜λ©΄ λœλ‹€.

:root {
	--img: url("img/sample.jpg");
}

div {
    background: var(--img);
}

JavaScriptμ—μ„œ CSS λ³€μˆ˜ μ‘°μž‘ν•˜κΈ°

μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ 여타 μŠ€νƒ€μΌ 속성을 λ³€ν™” μ‹œμΌœ 동적인 μ•Œλ‘λ‹¬λ‘ν•œ ν™ˆνŽ˜μ΄μ§€λ₯Ό κ΅¬μ„±ν–ˆλ“―μ΄ CSS λ³€μˆ˜λ„ μ‘°μž‘μ΄ κ°€λŠ₯ν•˜λ‹€.

 

μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ CSS λ³€μˆ˜κ°’ μ–»κΈ°

예λ₯Ό λ“€μ–΄ μ•žμ˜ μ˜ˆμ—μ„œ 루트 가상 클래슀(:root)에 μ„ μ–Έν•œ νŠΉμ • λ³€μˆ˜μ˜ 값을 κ°€μ Έμ˜€λŠ” 슀크립트 μ½”λ“œλŠ” λ‹€μŒκ³Ό κ°™λ‹€.

:root {
	--hover: red;
}
// 가상 클래슀 μš”μ†Œ μ–»κΈ°
let root = document.querySelector(':root'); 

// window.getComputedStyle λ©”μ„œλ“œλ₯Ό μ΄μš©ν•˜λ©΄, ν•΄λ‹Ή μš”μ†Œμ— μ „μ—­μ μœΌλ‘œ 적용된 λͺ¨λ“  ν˜•νƒœμ˜ style을 λ°˜ν™˜ν•œλ‹€
let variables = getComputedStyle(root); 

// λ³€μˆ˜ κ°’ μ–»κΈ°
variables.getPropertyValue('--hover');

 

μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ CSS λ³€μˆ˜κ°’ λ³€κ²½ν•˜κΈ°

κ·ΈλŸ¬λ‚˜ μ—¬κΈ°μ„œ μ£Όμ˜ν•  점은 getComputedStyle() λ©”μ„œλ“œλ‘œ μŠ€νƒ€μΌ 속성을 κ°€μ Έμ˜¬μˆœ μžˆμ§€λ§Œ, 이 속성을 λ°”λ‘œ λ³€κ²½ν•  수 μ—†λ‹€λŠ” 점이닀. κ·Έλž˜μ„œ 만일 μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ λ³€μˆ˜μ˜ 값을 λ™μ μœΌλ‘œ μ‘°μž‘ν•˜κ³  μ‹Άλ‹€λ©΄, λ‹€λ₯Έ μŠ€νƒ€μΌ 속성 μ ‘κ·Όν•˜λ“―μ΄ 인라인 μŠ€νƒ€μΌλ‘œ μ‘°μž‘ν•˜λŠ” 수 밖에 μ—†λ‹€.

 

λ‹€μŒμ€ CSS λ³€μˆ˜μ— λ°°κ²½ 이미지 값을 μ„€μ •ν•˜κ³ , λ²„νŠΌμ„ λˆ„λ₯΄λ©΄ 이 CSS λ³€μˆ˜κ°’μ„ λ³€κ²½ν•¨μœΌλ‘œμ¨ μš”μ†Œμ˜ λ°°κ²½ 이미지λ₯Ό λ³€ν™” μ‹œν‚€λŠ” μ˜ˆμ œμ΄λ‹€. λ¨Όμ € μ•„λž˜μ™€ 같이 html 인라인 μŠ€νƒ€μΌμ— λ°°κ²½ μ΄λ―Έμ§€μ˜ CSS λ³€μˆ˜λ₯Ό μ •μ˜ν•΄ λ†“λŠ”λ‹€.

<div style="--bg-img: url(https://p4.wallpaperbetter.com/wallpaper/757/701/315/beach-high-definition-1920x1080-nature-beaches-hd-art-wallpaper-preview.jpg)"></div>

<button>λ°°κ²½ 이미지 λ°”κΎΈκΈ°</button>
div {
    background: var(--bg-img);
    background-size: cover;
    width: 500px;
    height: 300px;
}

그리고 μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ μš”μ†Œμ— μ ‘κ·Όν•˜κ³  style.setProperty('cssλ³€μˆ˜', 'κ°’') λ©”μ„œλ“œλ‘œ λ³€μˆ˜λ₯Ό μž¬μ„€μ •ν•΄μ£Όλ©΄ λœλ‹€.

document.querySelector('button').addEventListener('click', (e) => {
    const $div = document.querySelector('div');
    $div.style.setProperty('--bg-img', 'url(https://cdn.imweb.me/upload/S201903225c9441f9db892/219f92a94fb2a.jpg)');
})

See the Pen cssλ³€μˆ˜ μžλ°”μŠ€ν¬λ¦½νŠΈ μ‘°μž‘ by barzz12 (@inpaSkyrim) on CodePen.

 

μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ CSS λ³€μˆ˜ λ‹€λ£°λ•Œ 주의점

 

1. CSS λ³€μˆ˜κ°€ 쀑볡될 경우 μš°μ„ μˆœμœ„

μ΄λŸ°μ‹μœΌλ‘œ css λ³€μˆ˜λ₯Ό ν™œμš©ν• λ•Œ μ£Όμ˜ν• μ μ€ μžλ°”μŠ€ν¬λ¦½νŠΈλ‘œ λ³€μˆ˜ 값을 λ³€κ²½ν•˜λŠ” 경우 인라인으둜 CSSκ°€ μ„ μ–Έλ˜κΈ° λ•Œλ¬Έμ—, λ³„λ„μ˜ css νŒŒμΌμ— μ •μ˜ν•œ λ³€μˆ˜λ³΄λ‹€ 속성 적용 μš°μ„  μˆœμœ„κ°€ λ†’μ•„ 만일 λ³€μˆ˜λ₯Ό 쀑볡 μ„ μ–Έλœ 게 μžˆμ„ 경우 주의λ₯Ό μš”ν•˜μ—¬μ•Ό ν•œλ‹€.

 

2. μ „μ—­μœΌλ‘œ CSS λ³€μˆ˜λ₯Ό μ‚¬μš©ν•΄μ•Ό ν•œλ‹€λ©΄ μƒμœ„ μš”μ†Œμ— μ„ μ–Έ

λ˜ν•œ νŠΉμ • html νƒœκ·Έ μš”μ†Œμ— 인라인으둜 css λ³€μˆ˜λ₯Ό μ„ μ–Έν•œλ‹€λ©΄, κ·Έ λ³€μˆ˜λŠ” ν•΄λ‹Ή μš”μ†Œμ—λ§Œ λ“€μ–΄μžˆλŠ” μ§€μ—­λ³€μˆ˜λ‘œμ„œ μ·¨κΈ‰ 되기 λ•Œλ¬Έμ— λ‹€λ₯Έ μš”μ†Œμ—μ„œ κ°€μ Έλ‹€ 쓰지 λͺ»ν•œλ‹€. μ΄λ•ŒλŠ” <html> μ΄λ‚˜ <body> νƒœκ·Έμ™€ 같은 μƒμœ„ μš”μ†Œμ— 인라인 μŠ€νƒ€μΌλ‘œ css λ³€μˆ˜λ₯Ό μ €μž₯ν•˜λŠ” μ‹μœΌλ‘œ, μœ„μ—μ„œ λ°°μ› λ˜ css λ³€μˆ˜ 상속 κΈ°λŠ₯을 μ‘μš©ν•˜λ©΄ λœλ‹€.