๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

FrontEnd+

Less ์ž…๋ฌธ - ๊ธฐ์ดˆ ๋ฌธ๋ฒ• ์•Œ์•„๋ณด๊ธฐ

 

 

๐Ÿ‘€ 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

 

 

 

์ฐธ๊ณ ์ž๋ฃŒ

Less ๊ณต์‹ ํ™ˆํŽ˜์ด์ง€