๐ Less๊ฐ ๋ญ๊ฐ์?
Less๋ Ant Design, Bootstrap, Cardinal, Semantic UI ๋ฑ์์ ์ฌ์ฉํ๊ณ ์๋ CSS ์ ์ฒ๋ฆฌ๊ธฐ์ด๋ค.
Less๋ Leaner Style Sheets์ ์ฝ์์ด์, '๋ ์ ์'์ด๋ผ๋ ์๋ฏธ์ด๊ธฐ๋ ํ๋ค. CSS๋ฅผ ๋ ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ฒ ์์ฑํ ์ ์์์ ์ดํํ๋ ์ด๋ฆ์ธ ๋ฏ ํ๋ค.
It's CSS, with just a little more.
- Less ์ฌ๋ก๊ฑด
ํ์ฌ(2022. 01์) ๊ธฐ์ค Less์ ์ต์ ๋ฒ์ ์ 4.1.2์ด๋ค.
Less ์ธ์ด์์ ์ง์ํ๋ ํธ๋ฆฌํ ๋ฌธ๋ฒ๋ค์ ํ๋์ฉ ์ตํ๋ณด์.
๐ ๋ณ์ (Variables)
๋ณ์๋ช ์์ ์ณ ์ฌ์ธ(@)๋ฅผ ๋ถ์ด๊ณ , ์ฝ๋ก (:)๋ค์ ํ ๋นํ ๊ฐ์ ์ ์ด์ฃผ๋ฉด ๋๋ค.
@width: 10px;
@height: @width + 10px;
#header {
width: @width;
height: @height;
}
์๋ฐ์คํฌ๋ฆฝํธ์ ์ค์ฝํ์ฒด์ด๋๊ณผ ๋น์ทํ๊ฒ ๋์ํด์, ๋ ๊ฐ๊น์ด ์ค์ฝํ ๋ด์ ๊ฐ์ ๋ฐ๋ผ๊ฐ๋ค. ๋, ํธ์ด์คํ ์ด ์ผ์ด๋์ ๊ผญ ์ ๋ผ์ธ์์ ๋ณ์๋ฅผ ์ ์ํ ํ์๊ฐ ์๋ค.
@var: red;
#page {
#header {
color: @var; // white
}
@var: white;
}
๋น์ทํ ๋ณ์๋ฅผ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด ๊ฐ์ฒด์ฒ๋ผ ์ฌ์ฉํ๊ณ ์ถ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์ ์๋ค.
๐ ๋ฏน์ค์ธ (Mixins)
์ค๋ณต๋ ์คํ์ผ์ ์ฌํ์ฉํ๊ณ ์ถ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๋ฏน์ค์ธ์ ๋ง๋ค์ด ์ฌ์ฉํ ์ ์๋ค.
.bordered {
border-top: dotted 1px black;
border-bottom: solid 2px black;
}
#menu a {
color: #111;
.bordered();
}
.post a {
color: red;
.bordered();
}
๐ ์ค์ฒฉ (Nesting)
์์ CSS ์ฒ๋ผ ์บ์ค์ผ์ด๋ฉ์ ์ผ์ผ์ด ๋์ดํ์ง ์๊ณ ์ค์ฒฉํด์ ๋ ๊ฐ๊ฒฐํ๊ฒ ํํํ ์ ์๋ค. pseudo ์ ๋ ํฐ๋ ์ฐํผ์๋(&)๋ก ์ฐ๊ฒฐํด์ ํธ๋ฆฌํ๊ฒ ์ฌ์ฉํ ์ ์๋ค.
#header {
color: black;
.logo {
width: 300px;
&::after {
content: " ";
display: block;
font-size: 0;
height: 0;
clear: both;
visibility: hidden;
}
}
}
๐ ์ฐ์ฐ (Operations)
๋ํ๊ธฐ(+), ๋นผ๊ธฐ(-), ๊ณฑํ๊ธฐ(*), ๋๋๊ธฐ(/) ์ ๊ฐ์ ์ฐ์ฐ์ ์ง์ํ๋ค.
์ซ์ ๋ฟ๋ง ์๋๋ผ ์์, ๋ณ์๋ฅผ ๋์์ผ๋ก ์ฐ์ฐํ ์ ์๋ค. ๋ง์ฝ ๋จ์๊ฐ ์๋ก ๋ค๋ฅผ ๊ฒฝ์ฐ ๊ฐ์ฅ ๋จผ์ ๋ฑ์ฅํ ๋จ์๋ก ๋ณํ๋๋ค.
// ๋จ์๋ฅผ ๊ณ ๋ คํด์ ๊ณ์ฐํ๋ค. ๊ฐ์ฅ ๋จผ์ ๋ฑ์ฅํ ๋จ์๋ก ๋ง์ถฐ์ค๋ค.
@conversion-1: 5cm + 10mm; // 6cm
@conversion-2: 2 - 3cm - 5mm; // -1.5cm
@base: 2cm * 3mm; // 6cm
@color: #224488 / 2; //#112244
background-color: #112244 + #111; // #223355
// ๋จ์ ํ์ฐ์๋ ์คํจํ์ง๋ง, ๊ทธ๋ฅ ์ซ์๋ผ๋ฆฌ๋ผ๋ ๊ณ์ฐํ๊ณ ๋จผ์ ๋ฑ์ฅํ ๋จ์๋ก ๋ง์ถฐ์ค๋ค.
@incompatible-units: 2 + 5px - 3cm; // 4px
// ๋ณ์๋ ์ฐ์ฐ์ ๋์์ด ๋๋ค.
@base: 5%;
@filler: @base * 2; // 10%
@other: @base + @filler; // 15%
๐ ํจ์ (Functions)
Less๋ ์ ์ฉํ ํจ์๋ฅผ ๋ง์ด ์ง์ํ๋ค.
๋ค์๊ณผ ๊ฐ์ด ๊ธฐ๋ณธ์ ์ธ ์ํ ํจ์๋ฅผ ์ ๊ณตํ๋ค.
ceil(2.4) // 3
floor(2.6) // 2
percentage(0.5) // 50%
round(1.67) // 2
round(1.67, 1) // 1.7
sqrt(25cm) // 5cm
abs(-18.6%) // 18.6%
pi() // 3.141592...
pow(25, 0.5) // 5
mod(11cm, 6px); // 5cm
min(3px, 42px, 1px, 16px); // 1px
max(3%, 42%, 1%, 16%); // 42%
์๋ฐ์คํฌ๋ฆฝํธ์ ์ผํญ์ฐ์ฐ์์ ๋น์ทํ if ๋ ผ๋ฆฌ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
/* if(condition, value1, value2) */
/* boolean(condition) */
@some: foo;
@someIsBool: iscolor(@some);
div {
margin: if((2 > 1), 0, 3px); // 0
color: if((someIsBool), @some, black);
}
true/false ๊ฐ์ ๋ฐํํด์ฃผ๋ ์ ์ฉํ ํ๋ณํจ์๋ ์๋ค.
isnumber(1234); // true
isnumber(56px); // true
isstring("string"); // true
iscolor(#ff0); // true
iscolor(blue); // true
ispixel(56px); // true
isem(7.8em); // true
ispercentage(7.8%); // true
isunit(11px, px); // true
isunit(2.2%, px); // false
@foo: 1;
isdefined(@foo); // true
isdefined(@bar); // false
list ์ each ๋ฅผ ๊ฒฐํฉํ ์ด์ฉํ ์คํ์ผ๋ง๋ ๊ฐ๋ฅํ๋ค. each ๋ด์์ @{key}, @{value}, @{index} ๋ก ๊ฐ๊ฐ ํค, ๊ฐ, ์ธ๋ฑ์ค๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
/* each(list, rule) */
@set: {
one: blue;
two: green;
three: red;
}
.set {
each(@set, {
@{key}-@{index}: @value;
});
}
/* ์ปดํ์ผ ๊ฒฐ๊ณผ */
.set {
one-1: blue;
two-2: green;
three-3: red;
}
์ด๋ฐ์๋ ์์ ์ฐ์ฐ์ ์ง์ํ๋ ํจ์์ screen์ด๋ overlay๋ ์ ์ฉํด๋ณด์ธ๋ค. ๊ทธ ์ธ ์ ์ฉํ ํจ์ ๊ฐ ๋ง์ด ์ง์๋๋ค.
๐ ๊ฐ์ ธ์ค๊ธฐ (Imports)
less ํ์ผ์ ์์ฑํ๊ณ ๋ค์๊ณผ ๊ฐ์ด ๊ฐ์ ธ์ ์ฌ์ฉํ ์ ์๋ค.
@import "library"; // library.less
์ฐธ๊ณ ์๋ฃ
'FrontEnd+' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
nestjs ๋ค์คํธ ์๋ฒ ๊ธฐ์ด ํ๋ฃจ ๋ง์ ๋๋ด๊ธฐ (1) | 2022.04.13 |
---|---|
Recoil ์ ๋ฌธ - ๊ธฐ์ด API ์์๋ณด๊ธฐ (2) | 2022.01.13 |
์น ์ฑ ๋งค๋ํ์คํธ manifest.json ๋ฅผ ์์ฑํด๋ณด์. (2) | 2021.10.27 |
[๋ฒ์ญ] ๋ฆฌ์กํธ์ ์ค์ผ์ค๋ง (Pull ๋ฐฉ์ vs Push ๋ฐฉ์) (0) | 2021.10.22 |
์๊ฐ ํค์๋ - 2021๋ 10์ (0) | 2021.10.08 |