Less.js: ๋ณ€์ˆ˜์— ์„ ํƒ๊ธฐ ์ €์žฅ

์— ๋งŒ๋“  2017๋…„ 04์›” 20์ผ  ยท  50์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: less/less.js

๋‹ค์Œ๊ณผ ๊ฐ™์€ ์†”๋ฃจ์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

// LESS
.selector {
    <strong i="6">@r</strong>: ~'.selector';

    &--mode {
        @{r}__block {
            prop: value;
         }
    }
}

// CSS
.selector--mode .selector__block {
  prop: value;
}

๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. <strong i="9">@r</strong>: &; ๋Œ€์‹  <strong i="11">@r</strong>: ~".selector"; ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํ˜„์žฌ ์„ ํƒ๊ธฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ  ๋ณ€์ˆ˜์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ:

// LESS
.selector {
  <strong i="15">@r</strong>: &; // .selector
}

.selector {
  &__inner {
    <strong i="16">@r</strong>: &; // .selector__inner
  }
}

.selector {
  &--modification &__inner {
    <strong i="17">@r</strong>: &; // .selector--modification .selector__inner
  }
}
feature request medium priority needs decision research needed

๋ชจ๋“  50 ๋Œ“๊ธ€

ํฅ๋ฏธ๋กญ๊ฒŒ๋„ ๊ทธ๋Ÿฌํ•œ ์š”์ฒญ์ด ์ด๋ฏธ ์กด์žฌํ•œ๋‹ค๊ณ  ์ ˆ๋Œ€์ ์œผ๋กœ ํ™•์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
(๋ถ„๋ช…ํžˆ ์ด ์•„์ด๋””์–ด๋Š” #1174, https://github.com/less/less.js/issues/1075#issuecomment-16891103 ๋“ฑ์˜ ์ด์ „ ํ‹ฐ์ผ“์— ๋งŽ์ด ๋“ฑ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค.)
๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ์ถ”์ธกํ•˜์ž.


Btw., ๋งŒ์ผ์„ ๋Œ€๋น„ํ•˜์—ฌ(๊ทธ๋ฆฌ๊ณ  ๊ฐ€๋Šฅํ•œ impl./syntax ์ถฉ๋Œ์„ ์ƒ๊ฐํ•˜๊ธฐ ์œ„ํ•ด ์ผ๋ถ€ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ˆ˜์ง‘ํ•˜๊ธฐ ์œ„ํ•ด):
์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋งŽ์€ ๊ฒฝ์šฐ์— ๊ฒŒ์œผ๋ฅธ ํ‰๊ฐ€ ๋•Œ๋ฌธ์— ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ:

a {
    <strong i="11">@r</strong>: &;
    b {
        something: @r;
    }
}

๊ฒฐ๊ณผ:

a b {
    something: a b; // not a!
}

๋•Œ๋ฌธ์— @r ๊ฐ’์ด ์ •๋ง ๋‚ด๋ถ€ ํ‰๊ฐ€ a b (์ฆ‰, ๊ทธ๊ฒƒ์ด ์‚ฌ์šฉ๋˜๋Š” ๊ณณ -ํ•˜์ง€ ํฌ์ธํŠธ ๋‹น์‹ ์ด ๊ทธ๊ฒƒ์„ ์ •์˜์—์„œ).
(๋”ฐ๋ผ์„œ ํŠน์ • ์œ ์Šค ์ผ€์ด์Šค๋Š” ์‹ค์ œ๋กœ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์–ธ์–ด ๊ตฌ์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋‹ค๋ฅธ ๋งŽ์€ ๊ด€๋ จ ์œ ์Šค ์ผ€์ด์Šค๋Š” #1075์˜ ์ฃผ์ œ๋กœ ์ด์ „์— ๊ณ ๋ ค๋˜์—ˆ์Šต๋‹ˆ๋‹ค.)

๋งŽ์€ ๊ฒฝ์šฐ ๊ฒŒ์œผ๋ฅธ ํ‰๊ฐ€ ๋•Œ๋ฌธ์— ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋Š” ์‹ค์ œ๋กœ ๋ณ€์ˆ˜๊ฐ€ ์•„๋‹Œ ๋‹ค๋ฅธ ์–ธ์–ด ๊ตฌ์„ฑ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํ• ๋‹น๋œ ๋ณ€์ˆ˜์˜ ํ‰๊ฐ€์— ์˜ํ•ด ํ˜ธ์ถœ๋˜๋Š” ์ง€์ ์ด ์•„๋‹ˆ๋ผ ์ •์˜๋œ ์ง€์ ์—์„œ ์„ ํƒ๊ธฐ ์ปจํ…์ŠคํŠธ๋ฅผ ์บก์ฒ˜ํ•˜๋ ค๋ฉด ํŠน์ˆ˜ ์–ธ์–ด ๊ตฌ์„ฑ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ‰๊ฐ€๋Š” ์ •์˜ ์‚ฌ์ดํŠธ์—์„œ ์บก์ฒ˜๋œ ์ปจํ…์ŠคํŠธ๋ฅผ ๋‚ด๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํด๋กœ์ €๋กœ ๋ณ€์ˆ˜๋ฅผ ์ฐพ๋Š” ๊ฒƒ๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€๋Š” ์•Š์ง€๋งŒ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ํ•จ์ˆ˜๊ฐ€ ์•„๋‹Œ ํŠน๋ณ„ํ•œ ์–ธ์–ด ๊ตฌ์กฐ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@rjgotten

์˜ˆ, ์šฐ๋ฆฌ๋Š” ์ด์ „์— selector ์˜์‚ฌ ํ•จ์ˆ˜์— ๋Œ€ํ•ด ๋…ผ์˜ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(์ผ๋ฐ˜ ํ•จ์ˆ˜ ๊ตฌ๋ฌธ ๋ถ„์„์€ ์„ ํƒ๊ธฐ ํŠน์ • ๊ฒฐํ•ฉ์ž๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์˜์‚ฌ). ๊ทธ๋Ÿฐ ๋‹ค์Œ ์˜์‚ฌ(์˜ˆ: Url ์™€ ๊ฐ™์€ ์ „์šฉ ์œ ํ˜•)
๋”ฐ๋ผ์„œ <strong i="10">@foo</strong>: selector(&); ๊ฐ™์€ ๊ฒƒ์ด ํŠธ๋ฆญ์„ ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‹ค์Œ ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

a {
    <strong i="13">@var</strong>: selector(x, #y & .z);

    b {
        @{var} { // ? is it regular & or "saved-context-&" ?
            // ...
        }
    }
}

๋”ฐ๋ผ์„œ & ์—ฐ์‚ฐ์ž/ํ‚ค์›Œ๋“œ ์ด์™ธ์˜ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. (๋˜๋Š” current-selector() ์™€ ๊ฐ™์€ ์ „์šฉ ์˜์‚ฌ ํ•จ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ... ํ , ์ด์ œ ๋ชจ๋“  ์ž‘์€ ์ œํ’ˆ์˜ API๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๋„๋ก ์ผ๋ฐ˜ PseudoFunction ์œ ํ˜•์„ ์ฝ”๋”ฉํ•˜๋Š” ์•„์ด๋””์–ด๊ฐ€ ๋– ์˜ฌ๋ž์Šต๋‹ˆ๋‹ค. ์œผ์•…! :).

์–ธ์–ด์— ์ƒˆ๋กœ์šด ๊ฒƒ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์ผ๋ฐ˜์ ์œผ๋กœ ์ฃผ์ €๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์„ ํƒ์ž ์ง€์ •์ž๊ฐ€ ํŽธ๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CSS @namespace ์„ ํƒ๊ธฐ ๊ตฌ๋ฌธ์˜ ์ผ๋ถ€์ด์ง€๋งŒ | ์ข‹์•„ ํ•ฉ๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ | ๊ฐ€ ์„ ํƒ๊ธฐ๋ฅผ _start_ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์ง€ ์•Š์œผ๋ฏ€๋กœ ์ถฉ๋Œํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ชจํ˜ธํ•˜๊ฒŒ ์ ์ ˆํ•ด ๋ณด์ด๋Š” Math์˜ "์ ˆ๋Œ€๊ฐ’"์„ ์ƒ๊ฐ๋‚˜๊ฒŒ ํ•˜๊ณ  ๊ฐ„๋‹จํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€ํ™”์— ์˜๊ฐ์„ ์ฃผ๋Š” ์ƒ๊ฐ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

a {
  <strong i="10">@var</strong>: |x, #y & .z|; // starting w/ `|` means selector, in current context, ended w/ another `|`
  b {
    @{var} {
      //...
    }
  }
}

(์‚ฌ์‹ค, _any_ var๊ฐ€ ์ฆ‰์‹œ ์ฒ˜๋ฆฌ๋˜์–ด ์ €์žฅ๋˜์–ด์•ผ ํ•จ์„ ์ง€์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ _way_ ๋ฒ”์œ„๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค.)

์ผ๋ฐ˜ & ๋˜๋Š” saved-context-& ์ž…๋‹ˆ๊นŒ?

selector() ์˜์‚ฌ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋˜๋Š” ์‚ฌ์ดํŠธ์—์„œ ์„ ํƒ๊ธฐ ์ปจํ…์ŠคํŠธ๋ฅผ ์บก์ฒ˜ํ•ด์•ผ ํ•˜๊ณ  & ๊ฐ€ _that_ ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ํ‰๊ฐ€๋˜์–ด์•ผ ํ•˜๋ฉฐ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ์ด ์ƒˆ ์œ ํ˜•์— ํ• ๋‹น๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. Selector ํŠธ๋ฆฌ ๋…ธ๋“œ.

Selector ์œ ํ˜•์˜ ํŠธ๋ฆฌ ๋…ธ๋“œ๋ฅผ ๋ณด์œ ํ•˜๋Š” _any_ ๋ณ€์ˆ˜๊ฐ€ ์˜ˆ์—์„œ @{var} ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์ด ์„ ํƒ๊ธฐ๋กœ ๋ณด๊ฐ„๋˜๋ฉด ๊ฒฐ๊ณผ ์„ ํƒ๊ธฐ๊ฐ€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ๋นŒ๋“œ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. & ๋ณด๊ฐ„๊ธฐ๊ฐ€ ์„ ํƒ๊ธฐ์— ์žˆ์„ ๋•Œ์™€ ๊ฐ™์ด, ์ฆ‰ ; ํ•œ ๋‹จ๊ณ„ ์œ„์˜ ์„ ํƒ์ž์™€ ๊ฒฐํ•ฉํ•˜๊ณ  ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋งˆ์‹ญ์‹œ์˜ค.

๊ทธ ์ด์œ ๋Š” ๋‘˜ ๋‹ค ์บก์ฒ˜๋œ ์„ ํƒ๊ธฐ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. selector() ๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์บก์ฒ˜ํ•œ ๊ฒƒ์ด๊ณ  & ๋Š” ํ•ญ์ƒ ์กด์žฌํ•˜๊ณ  ์บก์ฒ˜๋œ '์ƒ์œ„' ์„ ํƒ๊ธฐ์ž…๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์šฉ์ž๊ฐ€ _current_ ์„ ํƒ๊ธฐ ์ปจํ…์ŠคํŠธ์™€ ํ•จ๊ป˜ ์บก์ฒ˜๋œ Selector ๋…ธ๋“œ์˜ ๋ณด๊ฐ„์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ ์ด์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ: & @{var} { ... }

๋‹ซ๋Š” ์ค‘

a {
    <strong i="24">@var</strong>: selector(x, #y & .z);

    b {
        @{var} { ... }
    }
}

์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค

x, #y a .z { ... }

๋ฐ˜๋ฉด

a {
    <strong i="31">@var</strong>: selector(x, #y & .z);

    b {
        & @{var} { ... }
    }
}

์ƒ์„ฑํ•ด์•ผ ํ•œ๋‹ค

a b x,
a b #y a .z { ... }

ํ , @{var} ๋Œ€ & @{var} ๋Š” ์ƒ๋‹นํžˆ ์ธ์œ„์ ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ Less์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค. ... { & div ... ๋ฐ ... { div ... ๋Š” ํ•ญ์ƒ ๋™์ผํ•œ ๋ช…๋ น๋ฌธ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด๊ฒƒ์„ ์„ธ์ง€ ์•Š๊ณ  x, #y * .z ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ •์˜๋œ a b x, #y a b .z ๊ฐ€ ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ์„ ํƒ์ž๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ์˜ ํŒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ƒ์†๋œ ์„ ํƒ์ž๋ฅผ ์ฐธ์กฐ, ์ˆ˜์ • ๋˜๋Š” ์ „์†ก(๋ณ€์ˆ˜์— ํ• ๋‹น ๋ฐ ์žฌ์‚ฌ์šฉ)ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์„ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด #1075(์ƒ์œ„ ์„ ํƒ์ž๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•จ)์˜ ๋ณ€ํ˜•์ด๊ฑฐ๋‚˜ https://github.com/less/less-meta/issues/16#issuecomment -292679320(ํ• ๋‹น ๋ณ€์ˆ˜์— ๋Œ€ํ•œ ๋‹จ์ผ ์„ ํƒ์ž)? ์•„๋‹ˆ๋ฉด ์ด๊ฒƒ์ด ๋‹จ์ผ ํ‰๊ฐ€๋œ ์„ ํƒ๊ธฐ(๋˜๋Š” ๋ฏน์Šค์ธ)๊ฐ€ ์•„๋‹Œ ์„ ํƒ๊ธฐ ๋ชฉ๋ก์ด๊ณ  ์ถœ๋ ฅ์ด ํ‰๊ฐ€๋œ ๊ทœ์น™ ์„ธํŠธ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ ํƒ๊ธฐ ๋ชฉ๋ก ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•จ๋ฆฌ์–ด์‹ฑ ๋ฏน์Šค์ธ๊ณผ ๋‹ค๋ฅธ๊ฐ€์š”? ์ด ๊ธฐ๋Šฅ์ด ๋‹ค๋ฅด๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์ด ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ด๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@matthew-dean
์‹ค์ œ๋กœ ํ‰๊ฐ€๋œ ๊ทœ์น™ ์ง‘ํ•ฉ์„ ์บก์ฒ˜ํ•˜๊ณ  ๋‚˜์ค‘์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด๋‹น ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์‹ค์ œ ์„ ํƒ๊ธฐ ๋ชฉ๋ก์„ ์บก์ฒ˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

extract(list,index) ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ด ์„ ํƒ๊ธฐ ๋ชฉ๋ก์—์„œ ์„ ํƒ๊ธฐ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ถ”์ถœํ•  ์ˆ˜ ์žˆ๋„๋ก ์—…๋ฐ์ดํŠธ๋˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ํฅ๋ฏธ๋กœ์šด ๋ฐฉ์‹์œผ๋กœ ์‰ฝ๊ฒŒ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ์„ ํƒ๊ธฐ๋กœ ์‰ฝ๊ฒŒ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ๋„๋ก ์œ ์‚ฌํ•œ ๊ฐœ์„  ์‚ฌํ•ญ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, BEM๊ณผ ๊ฐ™์€ ํŠน์ • ๋ช…๋ช… ์ฒด๊ณ„๋ฅผ ๋”ฐ๋ฅด๋Š” ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฒฝ์šฐ.

์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์–ด์ง„ ๋ฏน์Šค์ธ

.my-bem-component(<strong i="10">@a</strong>, @b) {
  // Component will only ever be constructed on the first selector in
  // a list, for simplicity.
  <strong i="11">@selectors</strong> : selector(&);
  <strong i="12">@selector</strong>  : extract(<strong i="13">@selectors</strong>, 1);

  // Generate a clean block name, cleared of modifiers.
  // Grabs e.g. "bar" from ".foo > .bar--baz"
  @block-name : replace(<strong i="14">@selector</strong>, "\.([^\.\s]+)--\S+$", "$1" );

  // Generate the modifier name and generate different CSS for
  // BEM classes that have one.
  // Grabs e.g. "baz" in ".foo > .bar--baz"
  @mod-name : replace(<strong i="15">@selector</strong>, "\.+--(\S+)$", "$1" );

  .generate-block();
  // When @mod-name matches <strong i="16">@selector</strong>, no replacement has
  // occured and we are infact in the situation where we have no
  // BEM modifier and generate the 'base' component.
  .generate-block() when (@mod-name = "@{selector}") {
    @{selector} {
      prop-a : @a;
    }
    @{selector}__element {
      prop-b : @b;
    }
  }

  .generate-block() when (default()) {
    @{selector} {
      prop-a : @a;
    }
    @{selector} > .@{block}__element {
      prop-b : @b;
    }
  }
}

๋‹ค์Œ ๋œ

.block {
  .my-bem-component(foo, bar);
}
.block--caps {
  .my-bem-component(FOO, BAR);
}

CSS ์ƒ์„ฑ

.block {
  prop-a : foo;
}
.block__element {
 prop-b : bar;
}
.block--caps {
  prop-a : FOO;
}
.block--caps > .block__element {
  prop-b : BAR;
}

Sass๋Š” ์˜ค๋žซ๋™์•ˆ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•ด ์™”์œผ๋ฉฐ ์ด ๊ธฐ์ˆ ์ด ๋งค์šฐ ์˜๋ฆฌํ•˜๊ฒŒ ์‚ฌ์šฉ๋˜๋Š” ๋งŽ์€ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์˜ˆ์™€ ๊ฐ™์€ ์ฝ”๋“œ ํŒฉํ† ๋ฆฌ์—์„œ ๋˜๋Š” ๋‹ค๋ฅธ ๋ชฉ์ ์œผ๋กœ.

์— ๊ด€ํ•ด์„œ:

less/less-meta#16(์ฃผ์„)๊ณผ์˜ ์ถฉ๋Œ ๊ฐ€๋Šฅ์„ฑ(๋ณ€์ˆ˜์— ๋‹จ์ผ ์„ ํƒ๊ธฐ ํ• ๋‹น)

๊ฐœ์ธ์ ์œผ๋กœ ๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํ–‰๋™์„ ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค.
"์‚ฌ์†Œํ•œ" ์„ ํƒ๊ธฐ ๊ฐ’(์˜ˆ: .mixin , .ns.mixin , #foo .bar , baz ๋“ฑ, ์šด ์ข‹๊ฒŒ๋„ ์ด๊ฒƒ์€ mixin/function์œผ๋กœ ์‚ฌ์šฉ/์ •์˜๋  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๊ฒƒ์„ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ) ๋ณ€์ˆ˜์— ์ง์ ‘ ํ• ๋‹น(๋˜๋Š” ํ•จ์ˆ˜์— ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ)

<strong i="15">@var</strong>: .ns.mixin; // OK, its just Anonymous value (representing an arbitrary identifier) 
function(.mixin); // error: TODO 

^ ์ด๊ฒƒ์€ (๋ณธ์งˆ์ ์œผ๋กœ) ์„ ํƒ์ž์™€ ์ „ํ˜€ ๊ด€๋ จ์ด ์—†์Šต๋‹ˆ๋‹ค - ์ด ๊ฐ’์€ @var(...) ๋˜๋Š” @var[...] ๋ช…์„ธ์„œ
(์ผ๋ฐ˜์ ์œผ๋กœ ๋…ผ๋ฆฌ์  ๊ทœ์น™์€ mixin ์‹๋ณ„์ž๊ฐ€ (๋‚ด๋ถ€์ ์œผ๋กœ๋Š”) ์„ ํƒ์ž๋กœ ํ‘œ์‹œ๋œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์žŠ์–ด๋ฒ„๋ฆฌ์ง€๋งŒ ํ•ญ์ƒ ์  ๋˜๋Š” # ์ ‘๋‘์‚ฌ๊ฐ€ ์žˆ๋Š” ์‹๋ณ„์ž๋กœ ์ƒ๊ฐํ•˜๊ณ  .ns > .mixin ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๊ฒฐ๊ตญ ์ค‘๋ณต๋˜๊ณ  ์“ธ๋ชจ์—†๋Š” ๊ฒƒ์œผ๋กœ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค. :)

๋ณต์žกํ•œ ๋˜๋Š” "์‹ค์ œ" ์„ ํƒ๊ธฐ ์—๋Š” ๊ตฌ๋ฌธ/ํŒŒ์„œ์˜ ๋ชจํ˜ธ์„ฑ ๋•Œ๋ฌธ์— selector ์˜์‚ฌ ํ•จ์ˆ˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰:

  • <strong i="29">@var</strong>:foo>bar <- ์„ ํƒ๊ธฐ ๋ฐ (์ž ์žฌ์ ์œผ๋กœ) ๋…ผ๋ฆฌ ํ‘œํ˜„์‹
  • <strong i="32">@var</strong>:.1+.2; <- ์‚ฐ์ˆ  ํ‘œํ˜„์‹ ๋ฐ ์œ ํšจํ•œ Less ์„ ํƒ๊ธฐ
    (๋“ฑ. ๋ชจ๋“  ํŠน์ • ์„ ํƒ๊ธฐ ๊ธฐํ˜ธ๋ฅผ ์ž˜ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค. ๊ฑฐ์˜ ๋ชจ๋“  ๊ฐ’ ๊ตฌ๋ฌธ ๋ถ„์„ ์ปจํ…์ŠคํŠธ์—์„œ ๋ฌด์–ธ๊ฐ€์™€ ์ถฉ๋Œํ•˜๋ฉฐ ์œ„์˜ ๊ฐ’์ด ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ํ•จ์ˆ˜/๋ฏน์Šค์ธ์— ์ž ์žฌ์ ์œผ๋กœ ์ „๋‹ฌ๋  ๋•Œ ํ›จ์”ฌ ๋” ๊ทน์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ์€ ๋ถˆ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. selector() :
    less: some-function(abc, selector(#foo .is :not(> bar)[baz="qux"], abc), selector(bla), 42); // ^ remove `selector()` and try to parse

๋‚˜๋Š” ์„ ํƒ์ž๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ์˜ ํŒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์š”์•ฝํ•˜๋ฉด selector ์˜์‚ฌ ํ•จ์ˆ˜๋Š” ํ˜„์žฌ ๋ฐ ์ž ์žฌ์ ์ธ ๊ตฌ๋ฌธ ๋ฐ ์˜๋ฏธ ์ฒด๊ณ„ ์ถฉ๋Œ์„ ํ•œ ๋ฒˆ์— ์˜์›ํžˆ ์ œ๊ฑฐํ•˜๋Š” ๋ฐ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์—ฌ๊ธฐ์— ์˜ต์…˜์ด ๋„ˆ๋ฌด ๋งŽ์€์ง€ ์˜์‹ฌ์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค(๊ฐ’ ๋ฐ ์„ ํƒ๊ธฐ ๊ตฌ๋ฌธ ๋ถ„์„ ์ปจํ…์ŠคํŠธ๋Š” ์–ด๋–ป๊ฒŒ๋“  ๋ถ„๋ฆฌํ•ด์•ผ ํ•จ).


(๋ชจ๋“  ์œ„์˜ ๊ฐ’์— ์˜ํ•ด ๋ฐ˜ํ™˜ ๋œํ•˜์ง€ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ selector() ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ๊ฐœ์ฒด๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค ์˜ˆ๋ฅผ ๋“ค์–ด @var() , ์•„๋งˆ ์ˆ˜๋„ -ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์œผ๋กœ ๊ฑฐ์˜ ๊ฐ€์น˜๊ฐ€ ๊ทธ๋ž˜์„œ, ๊ทธ๋ƒฅ ํ•„์š” / ์“ธ๋ชจ์—†๋Š” ๊ฒƒ ์‹ ๊ฒฝ ์“ฐ๋‹ค).

@rjgotten

extract(list,index) ์™€ ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ์„ ํƒ์ž๋ฅผ ์ถ”์ถœํ•  ์ˆ˜๋„ ์žˆ๋„๋ก ์—…๋ฐ์ดํŠธ๋˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๊ทธ๋Ÿฌํ•œ ๋ฌธ์ž์—ด์ด ์ผ๋ถ€ ์„ ํƒ๊ธฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋ฌธ์ž์—ด๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ํ•จ์ˆ˜๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋Š” extract ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ชจ๋“  ๊ทธ๋Ÿฌํ•œ ํ•จ์ˆ˜๊ฐ€ ์—…๋ฐ์ดํŠธ/์กฐ์ •/์ˆ˜์ •๋˜์–ด์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€์˜ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋” ํšจ์œจ์ ์ด๊ณ  ๋ถ€๋‹ด์ด ๋œํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ „์šฉ selector-string->values ๋ณ€ํ™˜ ํ•จ์ˆ˜์ด๊ฑฐ๋‚˜ selector ์˜ํ•ด ์ง์ ‘ ๋…ธ๋“œ์˜ ์ ์ ˆํ•œ ๊ตฌ์กฐ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์–ด๋Š ๊ฒฝ์šฐ๋“  ๊ฐ€์žฅ ๊นŒ๋‹ค๋กœ์šด ๋ถ€๋ถ„์€ ์‚ฌ์šฉํ•  ๋•Œ๋งˆ๋‹ค ์„ ํƒ๊ธฐ ๊ฒฐํ•ฉ๊ธฐ๋ฅผ ํฌ์žฅ/ํ’€๊ธฐํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค) -์ผ€์ด์Šค๋Š” ๋‹ค๋ฅธ ํ‘œํ˜„์„ ์„ ํ˜ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค).

(์„ ํƒ๊ธฐ ๋ณด๊ฐ„ ๊ธฐ๋Šฅ ์ž์ฒด๋Š” ์—ฌ์ „ํžˆ @{var} ๋ฅผ ๊ฒฐ๊ตญ ์ ์ ˆํ•œ ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•˜๋ฏ€๋กœ ํ•ด๋‹น var์˜ ๊ฐ’์ด ์–ด๋–ค ํ˜•์‹์œผ๋กœ ์ž…๋ ฅ๋˜๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฌธ์ž์—ด์ด๋“  ์ต๋ช…์ด๋“  ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ ๊ตฌ์กฐ - ๋Œ€๋ถ€๋ถ„์˜ ๋ณ€ํ™˜ ์†์ž„์ˆ˜๋Š” ๊ทธ๋Œ€๋กœ ์œ ์ง€๋จ).

@block-name : replace(<strong i="17">@selector</strong>, "\.([^\.\s]+)--\S+$", "$1" );

์†”์งํžˆ ๋งํ•ด์„œ, ์ด๊ฒƒ์€ "์ธ๋ผ์ธ JavaScript ๋ฐ LessHat๊ณผ ๊ฐ™์€ ํ•ด์ปค"์˜ ํ™˜์ƒ์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ ๊ธˆ์ง€ํ•  ์ˆ˜๋Š” ์—†์ง€๋งŒ ๊ณต๊ฒฉ์ ์œผ๋กœ ๊ด‘๊ณ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
(์˜ˆ๊ฐ€ ๊ฝค ๋ถˆํ–‰ ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊ณ„์‚ฐํ•˜์ง€ ์•Š๊ณ  <- ์ค„์„ ์„ธ์‹ญ์‹œ์˜ค) ์ฐจ๋ผ๋ฆฌ less-plugin-bem-selectors ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค(์—ฌ๊ธฐ์„œ ๋‹จ์ˆœํžˆ get-block-name ๊ธฐ๋Šฅ์„ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. & ๊ธฐ๋Šฅ)๊ณผ ๊ฐ™์€ ์ถ”์•…ํ•œ ์ •๊ทœ์‹ ๋Œ€์‹ ("CSS ์ „์ฒ˜๋ฆฌ๊ธฐ๋ฅผ ์ž„์˜์˜ ํ…์ŠคํŠธ ํ”„๋กœ์„ธ์„œ๋กœ ์‚ฌ์šฉ" ์ ‘๊ทผ ๋ฐฉ์‹์€ ๊ฒฐ๊ตญ PostCSS์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์œผ๋กœ ์‹ฌํ•˜๊ฒŒ ๋Š์Šจํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

& ๋Œ€ context-saving-& ๋Œ์•„๊ฐ€์„œ ์ง€๊ธˆ๊นŒ์ง€๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ „์šฉ ํ”Œ๋ž˜๊ทธ(์˜ˆ: selector(..., lazy or not) ๋˜๋Š” ๋‘ ๊ฐœ)๋ณด๋‹ค ๋” ๋‚˜์€ ์•„์ด๋””์–ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋ณ„๋„์˜ ๊ธฐ๋Šฅ. ๋˜๋Š” other-than-&-keyword (์˜ˆ: โ‚ธ )๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ‰๊ฐ€ ์‹œ์  ๋ชจํ˜ธ์„ฑ์„ ์ž๋™์œผ๋กœ ํ•ด๊ฒฐํ•˜๋Š” ์•ˆ์ „ํ•œ ๋ฐฉ๋ฒ•์ด ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

less-plugin-bem-selectors ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ „์ ์œผ๋กœ. ์ •๊ทœ์‹ ๊ธฐ๋ฐ˜ ์ถ”์ถœ์€ ์‚ฌ์šฉ์ž ์ง€์ • ํ•จ์ˆ˜๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š” ์˜ˆ์ œ๋ฅผ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ;)

๋‚˜๋Š” ์„ ํƒ์ž๋ฅผ ์œ„ํ•œ ํ•จ์ˆ˜์™€ ๊ฐ™์€ ๊ตฌ์กฐ์˜ ํŒฌ์ด ์•„๋‹™๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ชจ์–‘ ๋งŒ ์˜๋ฏธํ•œ๋‹ค๋ฉด ... ๋ฌผ๋ก  โž#foo:not(.bar)โž ์™€ ๊ฐ™์ด ๋‹ค๋ฅธ ๊ตฌ์„ฑ์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ด๋ฏธ ๋ฌด๋ฃŒ ๊ธฐํ˜ธ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์˜์‚ฌ ํ•จ์ˆ˜ ๊ตฌ๋ฌธ์€ ์ด๋ฏธ url ์™€ ๊ฐ™์€ ๊ฐœ๋…์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ œ์•ˆ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด ๊ฐœ๋…์ด ๊นจ์งˆ ์ˆ˜ ์žˆ๊ฑฐ๋‚˜ ๊นจ์งˆ ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†์Œ).

์ด์ œ ์žฌ๋ฏธ์žˆ๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” current-selector ํ•จ์ˆ˜์˜ ๋น ๋ฅด๊ณ  ๋”๋Ÿฌ์šด ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ตฌํ˜„ ์„ ๋งŒ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค(๋‹จ์ง€ ๊ทธ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ๋ถ€ํ’€๋ ค์งˆ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ณด๊ธฐ ์œ„ํ•ด, ๋ฌผ๋ก  var lazy-evaluation ๋•Œ๋ฌธ์— ๋งค์šฐ ์œ ์šฉํ•  ์ˆ˜๋Š” ์—†์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค). ๊ทธ๋ฆฌ๊ณ  ๋ฌด์—‡์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ๊ธฐ๋ณธ ์˜ˆ:

div {
    <strong i="9">@x</strong>: current-selector();
    span {
        r: @x; // -> div
    }
}

๊ฒฐ๊ณผ๋Š” r: div :)
์ปดํŒŒ์ผ๋Ÿฌ ์ฝ”๋“œ์˜ ์–ด๋–ค ๋ถ€๋ถ„์ด ์ด ํŠน์ • ๋™์ž‘์„ ์ฒ˜๋ฆฌํ•˜๋Š”์ง€ ์ •ํ™•ํžˆ ๋ชจ๋ฅด์ง€๋งŒ ๋‹ค์Œ์€ ๋งˆ๋ฒ•์„ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•œ ๊ณ ๊ธ‰ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค.

div {
    <strong i="15">@x</strong>: current-selector();     // [1]
    <strong i="16">@y</strong>: current-selector() @v;  // [2]
    <strong i="17">@z</strong>: current-selector(@v);   // [3]
    <strong i="18">@v</strong>: whatever;
    span {
        1: @x; // div
        2: @y; // div span
        3: @z; // div span
        4: current-selector();  // [4] div span
    }
}

[2] ๋ฐ [3] ๋ฌธ๋งŒ ๋‘ ๋ฒˆ ํ˜ธ์ถœ๋˜๋Š” ๋ฐ˜๋ฉด(์ฆ‰, ์‹ค์ œ๋กœ ์ง€์—ฐ ํ‰๊ฐ€๋จ) [1] ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๊ฐ’์— ๋ณ€์ˆ˜๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ถ„๋ช…ํžˆ ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ์˜๋„์ ์ธ ๊ฒƒ์ธ์ง€ ์•„๋‹ˆ๋ฉด ์ผ๋ถ€ ์บ์‹ฑ์˜ ๋ถ€์ž‘์šฉ์ธ์ง€, ์•„๋‹ˆ๋ฉด ๋‚ด ์ฝ”๋“œ์˜ ์šด์ด ์ข‹์€ ๋ฒ„๊ทธ์ผ ์ˆ˜ ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด ์ค„ ์ด ์ด ์บ์‹ฑ์— ๋Œ€ํ•ด ์ด๋Ÿฌํ•œ ๋ถ€์ž‘์šฉ์„ ์œ ๋ฐœํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๋ณ€์ˆ˜์˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š” ์ด์œ  - ๋” ๋งŽ์€ ์—ฐ๊ตฌ๊ฐ€ ํ•„์š”ํ•จ).


์ฆ‰, context-saving-& ์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ธฐ๋ฐ˜ ๋ฒ„์ „์ด ๊ฐ€๋Šฅํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค(๋ฌผ๋ก  <strong i="29">@var</strong>: & ๋Œ€์‹  <strong i="31">@var</strong>: current-selector() ๊ฐ™์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ์ ์€ ์ œ์™ธ). ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์—†์œผ๋ฉด ์ง€์—ฐ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค(๋ณ€์ˆ˜๊ฐ€ ์ „๋‹ฌ๋œ ๊ฒฝ์šฐ). ์ฒ˜์Œ์— 4๊ฐœ๋กœ ๊ณ„ํšํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ ์Šฌํ”ˆ ์ผ์ž…๋‹ˆ๋‹ค.
์ƒ๋‹นํžˆ ์•…์˜์ ์ด์ง€๋งŒ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•/ํด๋ฆฌํ•„๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณด๋‹ค ์‹ค์ œ์ ์ธ ์˜ˆ๋„ ์›ํ•˜๋Š” ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

div#zoo {
    <strong i="35">@x</strong>: current-selector();
    span {
        <strong i="36">@y</strong>: replace(<strong i="37">@x</strong>, div, body);
        r: @y; // OK, body#zoo
        @{y} { 
        // ^ not very useful this way (except maybe bem stuff) since you can't remove div
            color: red;
        }
    }
}

์ฆ‰, ํ›„์† ๋ณ€์ˆ˜ ํ• ๋‹น/ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์ดˆ๊ธฐ ๋ณ€์ˆ˜์˜ ํ‰๊ฐ€ ์ง€์ ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@seven-phases-max
์‚ฌ๋ž‘ํ•ด.

๋งค๊ฐœ๋ณ€์ˆ˜ ์ธ์ˆ˜๊ฐ€ ์žˆ์„ ๋•Œ ์ง€์—ฐ ํ‰๊ฐ€๊ฐ€ ํ˜„์žฌ ์ž‘์—…์—์„œ ์ŠคํŒจ๋„ˆ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค ํ•˜๋”๋ผ๋„ _that_์€ ์•„๋งˆ๋„ '์‹ค์ œ' ๊ตฌํ˜„์„ ์œ„ํ•ด ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ, ๊ทธ๊ฒƒ์ด ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์˜๋ฏธํ•œ๋‹ค๋ฉด... ๋ฌผ๋ก  โž# foo:not (.bar)โž๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ตฌ์„ฑ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๋ฏธ ๋ฌด๋ฃŒ ๊ธฐํ˜ธ๊ฐ€ ๋ถ€์กฑํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿด ์ˆ˜ ์žˆ์ง€. ๋‚˜๋Š” ์‚ฌ์šฉ๋ฒ•๊ณผ ๊ด€๋ จํ•˜์—ฌ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋‚ด ๋จธ๋ฆฌ๋ฅผ ๊ฐ์‹ธ์ง€ ์•Š์•˜์œผ๋ฉฐ ๋” ๋‚˜์€ ์•„์ด๋””์–ด๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ๋ญ”๊ฐ€ ํŠน๋ณ„ํ•œ ๊ฒƒ์ด ์žˆ์—ˆ๋˜ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. $() ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ์žˆ์—ˆ๋˜ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ๊ฒฐ๊ตญ $ . BTW, ๊ทธ๊ฒƒ์€๋˜์ง€ ์•Š์„ ๊ฒƒ selectors() ํ•˜์ง€ selector() ? & ์™€ ๊ฐ™์ด ์„ ํƒ๊ธฐ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐœ ํฌํ•จํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๊นŒ?

๊ทธ๋ฆฌ๊ณ  selector(&) ๊ฐ€ current-selector() ๋ณด๋‹ค ๋” ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฆ‰, " & ์ด๋“  ๋ฌธ์ž์—ด์ด๋“  X ๊ฐœ์ฒด์—์„œ ์„ ํƒ๊ธฐ ๋ชฉ๋ก์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค." ์ตœ์ข… ๊ตฌ๋ฌธ์ด ๋ฌด์—‡์ด๋“  & ๋ฅผ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  selector(&) ๊ฐ€ current-selector() ๋ณด๋‹ค ๋” ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ๋“ค์€ ๋‹ค๋ฅธ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค. current-selector ๋Š” & ์˜ ํ•จ์ˆ˜ ๋ณ€ํ˜•์ผ ๋ฟ์ž…๋‹ˆ๋‹ค(ํ›„์ž๋Š” ํŒŒ์„œ์—์„œ ์ง€์›ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์—). selector(...) ๋Š” ํŒŒ์„œ๊ฐ€ ์ž„์˜์˜ ์„ ํƒ๊ธฐ๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•œ ํŒจ์น˜์ž…๋‹ˆ๋‹ค( & ).


selectors - ๊ธ€์Ž„์š”. ๊ทธ๋Ÿฌ๋‚˜ ๋‹จ์ผ ์„ ํƒ๊ธฐ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ 99%์ด๋ฏ€๋กœ ๋ณต์ˆ˜ํ˜•์€ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ์ž์—๊ฒŒ ๋œ ๋ถ„๋ช…ํ•˜๊ฒŒ ๋“ค๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์ผ๋ฐ˜์ ์œผ๋กœ h1, h2, h3 {} ์„ ์„ ํƒ๊ธฐ๋กœ ์ œ๋ชฉ์„ ์ง€์ •ํ•˜๊ณ  Less ์ƒ์œ„ ์„ ํƒ๊ธฐ(์‹ฌ์ง€์–ด ์„ ํƒ๊ธฐ s ์ธ ๊ฒฝ์šฐ :) ๊ทธ๋ž˜์„œ ์™œ ๊ท€์ฐฎ๊ฒŒํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋ž˜.

@matthew-dean
๋ณต์ˆ˜ํ˜•๊ณผ ๋‹จ์ˆ˜ํ˜•์€ CSS ์‚ฌ์–‘ ์ž‘์„ฑ์ž๋ฅผ ์ œ์™ธํ•œ ๋ˆ„๊ตฌ์—๊ฒŒ๋‚˜ ๊ฑฐ์˜ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค, ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ•˜์‹ญ์‹œ์˜ค. ์‚ฌ์–‘ ์ž‘์„ฑ์ž๋ฅผ ํฌํ•จํ•œ ๋ชจ๋“  ์‚ฌ๋žŒ

๊ฝค ์›ƒ๊ธฐ๊ฒŒ; ๋ณต์ˆ˜ํ˜• ์šฉ์–ด '์„ ํƒ์ž'๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ์ง‘ํ•ฉ์„ ์ง€์ •ํ•˜๋Š” ๊ณต์‹์ ์ธ ๋ฐฉ๋ฒ•๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๋ณต์ˆ˜ํ˜•์— ๋Œ€ํ•œ ์—„๊ฒฉํ•˜๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ์šฉ์–ด๋Š” _selector list_๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด ๋ชจํ˜ธํ•œ ์ฐธ์กฐ๊ฐ€ ์‹ค์ œ๋กœ ์–ผ๋งˆ๋‚˜ ๊นŠ์ด ๋ฟŒ๋ฆฌ๋ฅผ ๋‘๊ณ  ์žˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณต์ˆ˜ํ˜•์— ๋Œ€ํ•œ ์—„๊ฒฉํ•˜๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ์šฉ์–ด๋Š” ์„ ํƒ์ž ๋ชฉ๋ก์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์–ด์ œ w3c๋„ ๊ฒ€์ƒ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. "์„ ํƒ์ž ๊ทธ๋ฃน", "์„ ํƒ์ž ๋ชฉ๋ก" ๋“ฑ์ž…๋‹ˆ๋‹ค. "์„ ํƒ์ž๋Š” ๊ฒฐํ•ฉ์ž๋กœ ๋ถ„๋ฆฌ๋œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋‹จ์ˆœ ์„ ํƒ์ž ์‹œํ€€์Šค์˜ ์ฒด์ธ์ž…๋‹ˆ๋‹ค." ์žˆ์Šต๋‹ˆ๋‹ค :) ๊ทธ๋ƒฅ "์„ ํƒ์ž" ํ˜•์‹์€ "์„ ํƒ์ž ์œ ํ˜•"์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

"์„ ํƒ์ž๋Š” ๊ฒฐํ•ฉ์ž๋กœ ๋ถ„๋ฆฌ๋œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋‹จ์ˆœ ์„ ํƒ์ž ์‹œํ€€์Šค์˜ ์ฒด์ธ์ž…๋‹ˆ๋‹ค."

๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก์„ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์‚ฌ๋žŒ์„ ์œ„ํ•ด: ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ์ธ์šฉ๋ฌธ์˜ ์ „์ฒด ํ˜•์‹์€ ๋‹ค์Œ๊ณผ ๊ฐ™์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. "_๋ณต์žกํ•œ_ ์„ ํƒ์ž๋Š” ๊ฒฐํ•ฉ์ž๋กœ ๋ถ„๋ฆฌ๋œ ํ•˜๋‚˜ ์ด์ƒ์˜ ๋‹จ์ˆœ ์„ ํƒ์ž ์‹œํ€€์Šค์˜ ์ฒด์ธ์ž…๋‹ˆ๋‹ค."

CSS ์‚ฌ์–‘์—๋Š” "์„ ํƒ์ž"์˜ ์ผ๋ฐ˜ํ™”๋œ ํ˜•์‹์ด ์‚ฌ์–‘์—์„œ ๊ณต์‹์ ์œผ๋กœ _๋ณต์žกํ•œ ์„ ํƒ์ž_๋ผ๊ณ  ๋ถ€๋ฅด๋Š” ๊ฒƒ์„ ์ฐธ์กฐํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ์„ ํƒ์ž๋Š” ๋‹จ์ˆœ ์„ ํƒ์ž์ž…๋‹ˆ๋‹ค. ์˜ˆ: tag ; #id ; .class ; [attr] ; ๋“ฑ , ๊ฒฐํ•ฉ์ž๋ฅผ ํ†ตํ•ด ์—ฐ๊ฒฐ๋จ, ์˜ˆ: > ; + ; ~ ๋“ฑ

ul > li ์™€ ๊ฐ™์€ ๊ฒƒ์„ ๋ณตํ•ฉ ์„ ํƒ๊ธฐ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.


๊ฒฝ๊ณ  ๋‹ค์Œ์€ ์•ฝ๊ฐ„์˜ ๋‚œ๋ฆฌ์ž…๋‹ˆ๋‹ค.

CSS ์‚ฌ์–‘์€ ์Šฌํ”„๊ฒŒ๋„ ์ผ๊ด€์„ฑ์ด ์—†๊ณ  ์ด๋ฆ„์ด ์ž˜๋ชป๋œ ์šฉ์–ด์˜ ์ˆ˜๋ ์ž…๋‹ˆ๋‹ค. ๋’ค๋กœ ๊ฐˆ์ˆ˜๋ก ์ ์  ๋” ๋‚˜๋น ์ง‘๋‹ˆ๋‹ค. CSS3 ๋ชจ๋“ˆ์˜ ๋กœ๋“œ๊ฐ€ ๊ณ„์† CSS 2.1 ๋ชจ๋“ˆ์„ ๋‹ค์‹œ ์ฐธ์กฐํ•˜๊ฑฐ๋‚˜ ์ƒˆ CSS3 ๋ชจ๋“ˆ์ด ์ด์ „ CSS 2.1 ๋ฌธ์„œ๋ฅผ ๊ทธ๋Œ€๋กœ ๋ณต์‚ฌํ•˜์—ฌ ์ง€์ •๋˜์—ˆ๋‹ค๋Š” ๊ฒƒ์€ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์„ ํƒ๊ธฐ์˜ ์‚ฌ์–‘๊ณผ ์‹œ๊ฐ์  ํ˜•์‹ ์ง€์ • ๋ชจ๋ธ์€ ์ตœ์•…์˜ ๊ฒฝ์šฐ์ž…๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋ชจํ˜ธํ•˜๊ฑฐ๋‚˜ ๋น„์Šทํ•˜๊ฒŒ ๋“ค๋ฆฌ๊ฑฐ๋‚˜ ์ด๋ฆ„์ด ์ข‹์ง€ ์•Š์€ ์šฉ์–ด.

์˜ˆ๋ฅผ ๋“ค์–ด [*|attr^="value" i] ์™€ ๊ฐ™์ด ul > li ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ์‚ฌ์†Œํ•œ ๊ฒƒ์„ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ›„์ž๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ ๋‹จ์ˆœ ์„ ํƒ๊ธฐ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค. (๋„ค ์ง„์งœ๋กœ ์š”.)

๋‚˜๋Š” ๋ช‡ ๋…„ ์ „ ์–ด๋Š ์‹œ์ ์— ๋””์ž์ธ ์ง€ํ–ฅ์ ์ธ ๋™๋ฃŒ ์ค‘ ํ•œ ๋ช…์—๊ฒŒ ํ›„์ž์˜ ์‹œ๊ฐ์  ์„œ์‹ ์ง€์ • ๋ชจ๋ธ ์‚ฌ์–‘์˜ ์ผ๋ถ€๋ฅผ ์„ค๋ช…ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ์„ค๋ช…ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ๋ผ์ธ ๋ฐ•์Šค์˜ ๊ฐœ๋…์„ ๋‹ค๋ฃจ๋Š” ๊ตฌ์ ˆ์„ ์‚ดํŽด๋ณด๋Š” ๋™์•ˆ ์šฐ๋ฆฌ์˜ ๋‘๋‡Œ _๋‘˜ ๋‹ค_์—์„œ ์‹ค์ œ๋กœ ๋ช‡ ๊ฐœ์˜ ํ“จ์ฆˆ๊ฐ€ ๋Š์–ด์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (์ œ์ •์‹ ์— ๋Œ€ํ•œ ๊ฐ€์น˜๊ฐ€ ๊ฑฐ์˜ ์—†๋‹ค๋ฉด ํ…Œ์ด๋ธ” ํ˜•์‹ํ™” ๋ชจ๋ธ์ธ ๋งˆ๋ฒ•์˜ la-la-land๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์‹ญ์‹œ์˜ค.)

์˜คํ”ˆ ์†Œ์Šค ํ”„๋กœ์ ํŠธ ๋ฌธ์„œ์˜ ๋‹ค์–‘ํ•œ ์ฆ๊ฑฐ์›€...

์˜ˆ๋ฅผ ๋“ค์–ด [*|attr^="value" i] ์™€ ๊ฐ™์ด ul > li ๋ณด๋‹ค ํ›จ์”ฌ ๋œ ์‚ฌ์†Œํ•œ ๊ฒƒ์„ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ›„์ž๋Š” ๊ธฐ์ˆ ์ ์œผ๋กœ ๋‹จ์ˆœ ์„ ํƒ๊ธฐ๋กœ ๋ถ„๋ฅ˜๋ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๊ฒฐํ•ฉ์ž๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๋‚˜์—๊ฒŒ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ •์˜๋ฅผ ์ •ํ™•ํžˆ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค. ๋งŽ์€ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋” "๋ณต์žกํ•œ" ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ul > li ๋Š” ๋‘ ๊ฐœ์˜ ์ฟผ๋ฆฌ ์„ธํŠธ, ์ฆ‰ li ์™€ ์ผ์น˜ํ•˜๋Š” ๋ชจ๋“  ์š”์†Œ๋ฅผ โ€‹โ€‹์ฟผ๋ฆฌํ•œ ๋‹ค์Œ ul ํฌํ•จ๋œ ์š”์†Œ๋ฅผ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ๊ฐ์˜ ํŠธ๋ฆฌ๋ฅผ ํƒ์ƒ‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. ํ›„์ž๋Š” ๊ฐœ๋ณ„ ์š”์†Œ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ํ…Œ์ŠคํŠธํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜์˜ ์ฟผ๋ฆฌ์ด๋ฏ€๋กœ ๊ฐ„๋‹จํ•œ ์„ ํƒ๊ธฐ์ž…๋‹ˆ๋‹ค.

๋ณต์ˆ˜ํ˜• ์šฉ์–ด '์„ ํƒ์ž'๋Š” ์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ์ง‘ํ•ฉ์„ ์ง€์ •ํ•˜๋Š” ๊ณต์‹์ ์ธ ๋ฐฉ๋ฒ•๋„ ์•„๋‹™๋‹ˆ๋‹ค. ๋ณต์ˆ˜ํ˜•์— ๋Œ€ํ•œ ์—„๊ฒฉํ•˜๊ฒŒ ์˜ฌ๋ฐ”๋ฅธ ์šฉ์–ด๋Š” ์„ ํƒ์ž ๋ชฉ๋ก์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งž์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ๋งž์Šต๋‹ˆ๋‹ค. "์„ ํƒ๊ธฐ"๋Š” ์‹ค์ œ๋กœ ์š”์†Œ๋ฅผ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •์˜๋œ ๋น„ํŠธ์ด์ง€๋งŒ ul > li > .title ๋Š” "์„ ํƒ๊ธฐ" ๋‹จ์ˆ˜์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €๋Š” selector() ๊ฐ€ ์‚ฌ์‹ค ์˜๋ฏธ์ƒ ๋” ๊ฐ€๊น๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@seven-phases-max

quick-n-dirty ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ธฐ๋Šฅ๊ณผ ๊ด€๋ จ๋œ ๋˜ ๋‹ค๋ฅธ ์‚ฌ์†Œํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ฏน์Šค์ธ์˜ ์•ก์„ธ์Šค๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฒ˜๋ฆฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋Š” ์ผ๋ฐ˜ Ruleset ์œ ํ˜• ํ”„๋ ˆ์ž„์ด๋ฏ€๋กœ ํ•ด๋‹น ์ด๋ฆ„์ด ์„ ํƒ๊ธฐ์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค.

์‹ค์ œ ๊ตฌํ˜„์€ ์•„๋งˆ๋„ ๊ทธ ๊ฒฝ์šฐ๋„ ๋‹ค๋ฃจ์–ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


[ํŽธ์ง‘ํ•˜๋‹ค]
์ž‘๋™ํ•˜๊ฒŒ ํ•˜๋Š” ๋น„๊ฒฐ์€ ํ•จ์ˆ˜ ์ปจํ…์ŠคํŠธ์˜ ์Šคํƒ์— ์žˆ๋Š” ํ”„๋ ˆ์ž„ ์ค‘ ํ•˜๋‚˜๊ฐ€ MixinDefinition ์ธ์ง€ ํ™•์ธํ•˜๊ณ  _is_์ด๋ฉด ํ•ด๋‹น ์Šคํƒ์˜ ๋‹ค์Œ x ํ”„๋ ˆ์ž„์„ ๊ฑด๋„ˆ๋›ฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ x ๋Š” MixinDefinition ์Šคํƒ์˜ ํ”„๋ ˆ์ž„ ์ˆ˜์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

(๊ธฐ๋ณธ์ ์œผ๋กœ MixinCall ๊ฐ€ MixinDefinition ์‹คํ–‰ํ•  ๋•Œ ์Šคํƒ์— ์ถ”๊ฐ€๋˜๋Š” 'ํด๋กœ์ €' ํ”„๋ ˆ์ž„์„ ๊ฑด๋„ˆ๋œ๋‹ˆ๋‹ค.)

"๋ถ€์‹ค" ๋ผ๋ฒจ์„ ์ œ๊ฑฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹ํƒ๊ตฌํ•ด์•ผ ํ•  ์ข‹์€ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.

์•„๋งˆ๋„ current-selector() ๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ๋‚˜์˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ๋งํ•˜์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” current-selectors() ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ทธ๊ฒƒ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹์žฅํ™ฉํ•ฉ๋‹ˆ๋‹ค. ๋” ๊ฐ„๊ฒฐํ•œ "capturing &"์— ๋Œ€ํ•œ ํ•จ์ˆ˜ ์ด๋ฆ„์„ ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ์ฐฌ์„ฑํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋” ๊ฐ„๊ฒฐํ•œ "์บก์ฒ˜ &"์˜ ํ•จ์ˆ˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.

์ด๋ฆ„์„ &() ๋ฉ๋‹ˆ๋‹ค. ๊ฐœ๋…์ ์œผ๋กœ & ์— ์žˆ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ getter์— ์ง€๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
์˜ˆ

.rule {
  <strong i="11">@selectors</strong> : &();
}

๐Ÿค”
๋„ค, ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ์ด์˜๊ฐ€ ์žˆ์œผ์‹ ๊ฐ€์š”?

์ œ์•ˆ๋œ ๊ธฐ๋Šฅ์„ ์ดํ•ดํ•˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์š”์•ฝํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

์ƒˆ ํ•จ์ˆ˜ &() ๋Š” ํ˜„์žฌ ์ปจํ…์ŠคํŠธ์—์„œ & ๊ฐ€ ์ถœ๋ ฅํ•  ๋‚ด์šฉ์„ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ด๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค.

.component { // I only write "component" once!  Much concise, such DRY!
  <strong i="9">@this</strong>: &();

  /* base styles */

  &_child {
    /* styles for the child */
  }

  &-variant { // component-variant styles all together, and inside the `.component` block
    /* nothing too schmancy so far */
    @{this}_child {
      /* IT'S MAGIC! */
    }
  }
}

๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ๊ฒƒ์ด ์ด๊ฒƒ์„ ์ถœ๋ ฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

.component {
  /* base styles */
}
.component_child {
  /* styles for the child */
}
.component-variant {
  /* nothing too schmancy so far */
}
.component-variant .component_child {
  /* IT'S MAGIC! */
}

๋†€๋ž๊ณ  ์‚ฌ๋ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•ด ๋” ์ƒ๊ฐํ•ด๋ณด๋ฉด, (์ฒซ ๋ฒˆ์งธ ํ†ต๊ณผ ํ›„, ๋„ˆ๋ฌด ๋ฏธ์ณ๋ฒ„๋ฆฌ๋ฉด ๊ทธ๋งŒ) ํ‘œ์ค€ํ™”๋œ ๊ตฌ์„ฑ ์š”์†Œ "๋ธ”๋ก"(๊ทœ์น™ ์ง‘ํ•ฉ) ์Šคํƒ€์ผ์„ ๊ฐ€์งˆ ๊ฐ€๋Šฅ์„ฑ์ด ๊ฐ€์žฅ ๋งค๋ ฅ์ ์ด๋ผ๊ณ  โ€‹โ€‹์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ๊ฐ„๋‹จํ•œ ์„ ํƒ๊ธฐ ๋ฌธ์ž์—ด ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋Œ€์‹  ํ•จ์ˆ˜๊ฐ€ _" & ๋งคํ•‘๋˜๊ธฐ๋ฅผ ๊ฑฐ์˜ ํฌ๋งํ•˜์ง€๋งŒ ๋ฒ”์œ„์—์„œ ๋ณ€์ˆ˜๊ฐ€ "_์— ์ •์˜๋˜์–ด ์ด ์ž‘์„ฑ ์Šคํƒ€์ผ์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ตฌ์„ฑ ์š”์†Œ์˜ ๊ฒฝ์šฐ(์ด๋ฅผ ๋™์ž‘ A ๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค):

.component{ <strong i="8">@this</strong>:&();
  /* default styles */
  @{this}_child {
  // โ†‘ The crucial difference: `@{this}` here behaves _like `&`_, **NOT** like `.component`
    /* child default styles */
  }
}

๊ทธ๋Ÿฐ ๋‹ค์Œ " & ๋Œ€์‹  @this ์‚ฌ์šฉ"์ด๋ผ๊ณ  ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์œ ์ผํ•œ ๊ด€์‹ฌ์‚ฌ๋Š” ํ”Œ๋ฆฝ ์ผ€์ด์Šค(๋‚˜๋Š” ํ–‰๋™ B ๋ผ๊ณ  ๋ถ€๋ฅผ ๊ฒƒ์ด๋‹ค)์ด์ง€๋งŒ, ๋‚˜๋Š” ๊ทธ ํ–‰๋™์„ ์›ํ•  ์„ค๋“๋ ฅ ์žˆ๋Š” ์ผ€์ด์Šค๋ฅผ ์ƒ๊ฐํ•  ์ˆ˜ ์—†๋‹ค. ๊ทธ๊ฒƒ์€ ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ์™œ ์ด๊ฒƒ์„ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

.foo { <strong i="16">@and</strong>: &();
  @{and} {
    /*stuff meant to live under selector `.foo.foo` */
  }
}

์ด๋ฅผ ๋‹ฌ์„ฑํ•˜๋Š” ํ˜„์žฌ ๋ฐฉ๋ฒ•์ด ํ›จ์”ฌ ๋” ๊ฐ„๊ฒฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  & ๊ฐ€ ์–ดํœ˜์— ๋ช…ํ™•ํ•˜๋ฉด ์ฝ๊ธฐ๋„ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค).

.foo {
  && {
    /*stuff meant to live under selector `.foo.foo` */
  }
}

ํ–‰๋™ A๋ณด๋‹ค ํ–‰๋™ B์— ๋Œ€ํ•œ ์„ค๋“๋ ฅ ์žˆ๋Š” ์‚ฌ๋ก€(๊ตฌํ˜„ ์–ด๋ ค์›€ ์ œ์™ธ)๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ด๊ฒƒ์€ ์ž‘์—…์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋Œ€๋‹ตํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์งˆ๋ฌธ ์ค‘ ํ•˜๋‚˜์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.


TL;DR: ๋‚ด ํˆฌํ‘œ๋Š” &() ๊ฐ€ ๋™์ ์ด๊ธฐ๋ฅผ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ๋ณธ์งˆ์ ์œผ๋กœ _" & ์ด์ง€๋งŒ ์ •์  ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋” ๊นŠ์€"_ ๋Œ€์‹  ์—ฌ๊ธฐ์— ์ค‘์ฒฉ๋œ ๊ฒƒ์ฒ˜๋Ÿผ & ์ž…๋‹ˆ๋‹ค."_

@calvinjuarez ์˜ˆ์ƒ ์ถœ๋ ฅ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ œ๊ฐ€ ๋‹ค์†Œ ํ˜ผ๋ž€์Šค๋Ÿฝ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ก ์ ์ธ ์˜์—ญ์—์„œ ๋‹ค์†Œ ๋ณด์ด์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

.component{
  <strong i="7">@this</strong>: &();  // <strong i="8">@this</strong> is now assigned the value of `.component`
  @{this}_child { a: b; } // this variable, when evaluated, forms the selector .component_child
}
// therefore this output is:
.component .component_child {
  a: b;
}

๋ณธ์งˆ์ ์œผ๋กœ "&, ๊ทธ๋Ÿฌ๋‚˜ ๋” ๊นŠ์€ ๋Œ€์‹  ์—ฌ๊ธฐ์— ์ค‘์ฒฉ๋œ ๊ฒƒ์ฒ˜๋Ÿผ"์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ •์  "ํ˜„์žฌ & ๊ฐ’"์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒŒ ๋ฌด์Šจ ๋œป์ธ์ง€ ์ •๋ง ์ดํ•ด๊ฐ€ ์•ˆ๋ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•. ์ด๊ฒƒ:

.component {
  <strong i="6">@this</strong>: &()
}

์ž‘์„ฑํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•ฉ๋‹ˆ๋‹ค.

.component {
  <strong i="10">@this</strong>: .component;
}

@matthew-dean

์˜ˆ. ๊ทธ๋Ÿฌ๋‚˜ &() ๋ฏน์Šค์ธ ํ˜ธ์ถœ์ž์˜ ์„ ํƒ๊ธฐ ์ปจํ…์ŠคํŠธ๋ฅผ ์žก๋Š” ๋ฏน์Šค์ธ์˜ ๋ Œ์ฆˆ๋ฅผ ํ†ตํ•ด ์ƒ๊ฐํ•ด ๋ณด์‹ญ์‹œ์˜ค.

์ž‘์„ฑ์ž ์Šค์Šค๋กœ๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํด๋ž˜์Šค ์ด๋ฆ„์˜ ๋ฃจํŠธ๋ฅผ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฏน์Šค์ธ ๊ธฐ๋ฐ˜ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด

.my-button {
  #buttons.base();
  #buttons.size( ... );
  #buttons.inset-icon-support( left right );
}

.my-button--wide {
  #buttons.size( ... )
}

.my-button--condensed {
  #buttons.size( ... )
}

๊ฑฐ๊ธฐ์— ์‚ฌ์šฉ๋œ ๋ฏน์Šค์ธ์€ &() ๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค๋ฅผ ์ฝ๊ณ  ์ ์ ˆํ•˜๊ฒŒ ์ถœ๋ ฅ์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‘ ๋ฒˆ์งธ ๋ฐ ์„ธ ๋ฒˆ์งธ ๊ทœ์น™์— ๋Œ€ํ•ด ์บก์ฒ˜๋œ ์„ ํƒ๊ธฐ๋Š” BEM ๊ตฌ๋ฌธ์„ ๋ถ„ํ•ดํ•˜์—ฌ ๊ธฐ๋ณธ ๋ธ”๋ก ํด๋ž˜์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ค‘์ฒฉ ์š”์†Œ ์„ ํƒ๊ธฐ์— ๋Œ€ํ•œ ์žฌ์ •์˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฑด; ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์„ ํƒ๊ธฐ ์ด๋ฆ„์„ ์ „๋‹ฌํ•  ํ•„์š” ์—†์ด .my-button--wide > .my-button__text ์™€ ๊ฐ™์€ ์„ ํƒ๊ธฐ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜์‹ ์ž ์„ ํƒ๊ธฐ ์ปจํ…์ŠคํŠธ์—์„œ๋งŒ.


์ด์™€ ๊ฐ™์€ ๋ฏน์Šค์ธ ๊ธฐ๋ฐ˜ _์ปดํฌ๋„ŒํŠธ ํŒฉํ† ๋ฆฌ_๋Š” ์Šคํƒ€์ผ๋ง ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ชจ๋“  ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ๋“ฑ๋กํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ ํ†ตํ•ฉํ•˜๋ ค๋Š” ๊ตฌ์„ฑ ์š”์†Œ์™€ ์ด๋ฆ„์„ ์„ธ๋ถ€์ ์œผ๋กœ ์„ ํƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@rjgotten

๊ฑฐ๊ธฐ์— ์‚ฌ์šฉ๋œ ๋ฏน์Šค์ธ์€ &()๋ฅผ ํ†ตํ•ด ํด๋ž˜์Šค๋ฅผ ์ฝ๊ณ  ์ ์ ˆํ•˜๊ฒŒ ์ถœ๋ ฅ์œผ๋กœ ์ž‘์—…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‘ ๋ฒˆ์งธ ๋ฐ ์„ธ ๋ฒˆ์งธ ๊ทœ์น™์— ๋Œ€ํ•ด ์บก์ฒ˜๋œ ์„ ํƒ๊ธฐ๋Š” BEM ๊ตฌ๋ฌธ์„ ๋ถ„ํ•ดํ•˜์—ฌ ๊ธฐ๋ณธ ๋ธ”๋ก ํด๋ž˜์Šค๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์ค‘์ฒฉ ์š”์†Œ ์„ ํƒ๊ธฐ์— ๋Œ€ํ•œ ์žฌ์ •์˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋„ค, ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๋ฏน์Šค์ธ์—์„œ ๊ฐ€์žฅ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ง์ ‘ ์„ ํƒ๊ธฐ ์ด๋ฆ„์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค &() ์˜ ์œ ํ‹ธ๋ฆฌํ‹ฐ๋ฅผ ํ™•์‹คํžˆ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์š”์ ์€ ์ฃผ์–ด์ง„ ์˜ˆ์ œ์—์„œ &() ์˜ ๊ฐ’์„ ๋ช…ํ™•ํžˆ ํ•˜๋ ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋” ๋‚˜์•„๊ฐ€์„œ, ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์ข‹์€ ๊ตฌ๋ฌธ์  ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ , ๋ˆ„๊ตฐ๊ฐ€๊ฐ€ ๊ทธ๊ฒƒ์„ ๋ฐ›์•„๋“ค์ด๊ณ  ์‹ถ์–ดํ•œ๋‹ค๋ฉด &() ๊ตฌํ˜„์œผ๋กœ ์•ž์œผ๋กœ ๋‚˜์•„๊ฐ€๋Š” ๋ฐ ๊ฐœ์ธ์ ์œผ๋กœ ๐Ÿ‘ ๋ฅผ ์ฃผ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@matthew-dean

์˜ˆ์ƒ ์ถœ๋ ฅ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์˜ˆ์ œ๊ฐ€ ๋‹ค์†Œ ํ˜ผ๋ž€์Šค๋Ÿฝ์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ œ๋Œ€๋กœ ๋‹ค์‹œ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. Less here๊ฐ€ ์•„๋ž˜ CSS๋กœ ์ปดํŒŒ์ผ๋˜๋ฉด &() ๊ฐ€ ๋” ๊ฐ•๋ ฅํ•œ ๊ธฐ๋Šฅ์ด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

.component { <strong i="10">@this</strong>:&();
  /* default styles */
  @{this}_child {
  // โ†‘ The crucial difference: `@{this}` here behaves _like `&`_, **NOT** like `.component`
  // (since it's in the same rule block and scope level).
    /* child default styles */
  }
}
.component {
  /* default styles */
}
.component_child {
  /* child default styles */
}

๊ฒฝ์šฐ <strong i="15">@this</strong>:&(); ๋‹จ์ง€ ๊ฐ™์€ ๋™์ž‘ํ•ฉ๋‹ˆ๋‹ค <strong i="17">@this</strong>:.component; ์ด ๊ฒฝ์šฐ, ์šฐ๋ฆฌ๋Š” ์œ ์ง€ mixin ๋‚ด๋ถ€ ์œ ํ‹ธ๋ฆฌํ‹ฐ _only_์ด ๊ธฐ๋Šฅ์„ ์ด๊ด€ํ•˜๊ณ  ์žˆ์ง€๋งŒ ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ์ด ๋” ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๋ณธ์งˆ์ ์œผ๋กœ "&, ๊ทธ๋Ÿฌ๋‚˜ ๋” ๊นŠ์€ ๋Œ€์‹  ์—ฌ๊ธฐ์— ์ค‘์ฒฉ๋œ ๊ฒƒ์ฒ˜๋Ÿผ"์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ •์  "ํ˜„์žฌ & ๊ฐ’"์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ด๊ฒŒ ๋ฌด์Šจ ๋œป์ธ์ง€ ์ •๋ง ์ดํ•ด๊ฐ€ ์•ˆ๋ฉ๋‹ˆ๋‹ค.

.thing{ & {} } ์™€ .thing{ <strong i="11">@amp</strong>:&(); @{amp} {} } ๊ฐ€ ๊ฐ™์€ ์ถœ๋ ฅ์„ ๋‚ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ๋ณด๋‹ค ์‹ค์งˆ์ ์œผ๋กœ ์‰ฌ์šด BEM์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด mixin์„ ์ž‘์„ฑํ•  ํ•„์š”๊ฐ€ ์—†์ง€๋งŒ ์ธ๋ผ์ธ์œผ๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „ ์˜ˆ ์ค‘ ํ•˜๋‚˜๋กœ ๋Œ์•„๊ฐ€์„œ:

_component.less_

.component { // I only write "component" once!  Much concise, such DRY!
  <strong i="16">@this</strong>: &();

  /* base styles */

  @{this}_child {
    /* styles for the child */
  }

  @{this}-variant { // component-variant styles all together, and inside the `.component` block
    /* nothing too schmancy so far */
    @{this}_child {
      /* IT'S MAGIC! */
    }
  }
}

โ†“โ†“โ†“

_component.css_

.component {
  /* base styles */
}
.component_child {
  /* styles for the child */
}
.component-variant {
  /* nothing too schmancy so far */
}
.component-variant .component_child {
  /* IT'S MAGIC! */
}

์ด์ : & ๋˜๋Š” @{this} ๋ฅผ ์˜๋ฏธํ•˜๋Š”์ง€ ํŒ€์— ๋ฌผ์–ด๋ณผ ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. "์–ด๋””์„œ๋‚˜ @{this} ํ•˜์„ธ์š”."๋ผ๊ณ  ๋งํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์‹ค์ œ๋กœ ์ปดํฌ๋„ŒํŠธ ํŒฉํ† ๋ฆฌ ๋ฏน์Šค์ธ ์ •์˜๋ฅผ ๋‚ด๋ถ€์ ์œผ๋กœ๋„ ์ผ๊ด€์„ฑ ์žˆ๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.

_hypothetical-button-mixin.less_

#button () {
  .size(large) { <strong i="7">@button</strong>: &();
    @{button} { // same scope, so it behaves _exactly_ like `&`.
      font-size: 1.8rem;
    }
    @{button}-primary { // same scope, so it behaves _exactly_ like `&`.
      border-width: 5px;
      @{button}_icon { // nested scope, behaves like the parent selector at the mixin call (.btn).
        height: 1.8rem;
        width:  1.8rem;
      }
    }
  }
}
// ...

_๊ฐ€์ƒ ์Šคํƒ€์ผ.less_

.btn {
  #button.size(large);
}

_hypothetical-styles.css_

.btn {
  font-size: 1.8rem;
}
.btn-primary {
  border-width: 5px;
}
.btn-primary .btn_icon {
  height: 1.8rem;
  width:  1.8rem;
}

.thing{ & {} } ๋ฐ .thing{ @amp :&(); @{amp} {} }๋Š” ๋™์ผํ•œ ์ถœ๋ ฅ์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, ์šฐ๋ฆฌ๊ฐ€ ๊ฐ™์€ ๊ฒƒ์„ ๋งํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด ์˜ˆ๋ฅผ ํ†ตํ•ด ํ™•์ธํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์ด ๊ธฐ๋Šฅ๊ณผ ์ œ์ž๋ฆฌ & ์ž…๋‹ˆ๋‹ค.

.mixin() {
  <strong i="10">@this</strong>: &();
  .a {
    .b @{this} { c: d; }
  }
}
.component {
  .mixin();
}

// outputs:
.component .a .b .component {
  c: d;
}

๋ฐ˜๋ฉด:

.mixin() {
  .a {
    .b & { c: d; }
  }
}

์ƒ์‚ฐํ•  ๊ฒƒ:

.b .component .a {
  c: d;
}

@calvinjuarez ๋‚˜๋Š” ์•„๋ฌด๋„ ๋‹น์‹ ์˜ ์˜ˆ์™€ ๋‹ค๋ฅธ ๊ฒƒ์„ ์ œ์•ˆํ•˜์ง€ ์•Š์•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ผ๋ž€ ์Šค๋Ÿฌ์› ์Šต๋‹ˆ๋‹ค. &() ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•ด๋‹น ์œ„์น˜์—์„œ this.selectors.toCSS() ๋˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค( ์‹ค์ œ๋กœ๋Š” ์•„๋‹ˆ์ง€๋งŒ ์„ค๋ช…์„ ์œ„ํ•ด .... ์‹ค์ œ๋กœ ๊ฐ€์žฅ ๋น ๋ฅธ ๋ฐฉ๋ฒ•์ผ ์ˆ˜ ์žˆ์Œ). ๊ทธ๋Ÿฐ ๋‹ค์Œ ์„ ํƒ๊ธฐ๋กœ ๋‹ค์‹œ ํ‰๊ฐ€ํ•  ๋‹ค๋ฅธ ์œ„์น˜์— ํ•ด๋‹น ๋ฌธ์ž์—ด์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค.

@matthew-dean
๋ชจ๋“  ๋ชฉ๋ก ๊ตฌ์„ฑ์›์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ ํƒ๊ธฐ๋ฅผ ํ™•์žฅํ•˜๊ธฐ ์œ„ํ•œ ํŠน๋ณ„ํ•œ ๋™์ž‘์„ ํฌํ•จํ•˜์—ฌ ์„ ํƒ๊ธฐ ๋ชฉ๋ก์„ ์‹ค์ œ ์„ ํƒ๊ธฐ ๋ชฉ๋ก์œผ๋กœ ๋…ธ์ถœํ•˜๋ฉด ์‹ค์ œ๋กœ _๋”_๋”_ ๊ต‰์žฅํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด

.a, .b {
  <strong i="8">@this</strong> : &();

  @{this} {
    c : d;  
  }
}

์‚ฐ์ถœ

.a .a,
.a .b,
.b. .a,
.a .b {
  c : d
}

๋„ค์ดํ‹ฐ๋ธŒ & ์ฒ˜๋Ÿผ.

๋„ค, ์ •ํ™•ํžˆ ๊ทธ๋ ‡๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 3.5์—์„œ ์„ ํƒ๊ธฐ์—์„œ ํ‰๊ฐ€๋œ ๋ชจ๋“  ๋ณ€์ˆ˜๋กœ ์ธํ•ด ์ „์ฒด ์„ ํƒ๊ธฐ ๋ชฉ๋ก์ด ์ƒˆ ์„ ํƒ๊ธฐ ๋ชฉ๋ก์œผ๋กœ ๋‹ค์‹œ ๊ตฌ๋ฌธ ๋ถ„์„๋ฉ๋‹ˆ๋‹ค. ์˜ˆ, ์˜ˆ์ƒ๋Œ€๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ๋‚ด๊ฐ€ ํ•œ ๋ช‡ ๊ฐ€์ง€ PR ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

2018๋…„ 7์›” 7์ผ ์˜ค์ „ 10์‹œ 34๋ถ„์— rjgotten [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

@matthew-dean
๋ชจ๋“  ๋ชฉ๋ก ๊ตฌ์„ฑ์›์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์„ ํƒ๊ธฐ๋ฅผ ํ™•์žฅํ•˜๋Š” ํŠน์ˆ˜ ๋™์ž‘์„ ํฌํ•จํ•˜์—ฌ ์„ ํƒ๊ธฐ ๋ชฉ๋ก์„ ์‹ค์ œ ์„ ํƒ๊ธฐ ๋ชฉ๋ก์œผ๋กœ ๋…ธ์ถœํ•˜๋ฉด ์‹ค์ œ๋กœ ํ›จ์”ฌ ๋” ๋ฉ‹์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด

.a, .b {
@์ด : &();

@{์ด๊ฒƒ} {
CD;
}
}
์‚ฐ์ถœ

.a .a,
.a.b,
.๋น„. .ใ…,
.a .b {
CD
}
๋„ค์ดํ‹ฐ๋ธŒ & will์ฒ˜๋Ÿผ.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์„ธ์š”.

.component{
 <strong i="6">@this</strong>: &();  // <strong i="7">@this</strong> is now assigned the value of `.component`
 @{this}_child { a: b; } // this variable, when evaluated, forms the selector .component_child
}
// therefore this output is:
.component .component_child {
 a: b;
}

์ถ”๊ฐ€ .component ๋Š” ๋‚ด๊ฐ€ ๋ฐ˜๋Œ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

less .component{ <strong i="12">@this</strong>: &(); // <strong i="13">@this</strong> is now assigned the value of `.component < &` @{this}_child { a: b; } // this variable evaluates like `&_child` } // therefore this output is: .component_child { // < Note: `.component_child` !== `.component .component_child` a: b; }

ํ•˜์ง€๋งŒ ๊ธฐ๋Šฅ์ด ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ƒฅ ๋‚ด ์ž…์žฅ์„ ๋ฐํžˆ๊ณ  ์‹ถ์—ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘๋™ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ฆ‰, ์ผ๋ฐ˜ _string_ ๋Œ€์‹  _selector list_์ธ ์„ ํƒ๊ธฐ์— ๋Œ€์ฒด ํ† ํฐ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋Œ€์ฒด ํ† ํฐ์€ & ๊ฐ€ ์ง€์ •๋˜๊ณ  ์ค‘์ฒฉ์œผ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•˜๋Š” ์ผ๋ฐ˜ ์„ ํƒ๊ธฐ ์—ฐ๊ฒฐ์„ _๋น„ํ™œ์„ฑํ™”_ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

&() ๊ฐ€ ์‹ค์ œ ์„ ํƒ์ž ๋ชฉ๋ก์œผ๋กœ ์‹๋ณ„ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๋…ธ๋“œ ์œ ํ˜•์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ํ•ด๋‹น ๋™์ž‘์€ ๋น„๊ต์  ์‰ฝ๊ฒŒ ๋‹ฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์‹ค, ์ „์šฉ ๋…ธ๋“œ ์œ ํ˜•์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒฝ์šฐ ๋‚˜์ค‘์— ์บก์ฒ˜๋œ ์„ ํƒ๊ธฐ ๋ชฉ๋ก์„ _์กฐ์ž‘_ํ•˜๊ธฐ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ ๊ธฐ๋Šฅ ์ƒ์„ฑ์„ ์ง€์›ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ๊ทธ๊ฒƒ์€ &()๊ฐ€ ํ•œ ๋ฒˆ์— ๋„ˆ๋ฌด ๋งŽ์€ ์ผ์„ ํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค. ์„ ํƒ์ž๋ฅผ ๋ณ€์ˆ˜์— ์ €์žฅํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฉด ํ•œ ๊ฐ€์ง€์ด์ง€๋งŒ _content_ ๋•Œ๋ฌธ์— ํ•ด๋‹น ๋ณ€์ˆ˜๊ฐ€ ์„ ํƒ๊ธฐ ์—ฐ๊ฒฐ์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์€ ๊ตฌ๋ฌธ์—์„œ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ณ€์ˆ˜๋Š” ์–ด๋””์—์„œ๋‚˜ ์˜ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ(์˜ˆ: mixin์—์„œ ์ „๋‹ฌ) ์„ ํƒ๊ธฐ ๋ชฉ๋ก์€ ๊ฐ„๋‹จํ•œ ๋ณ€์ˆ˜ ํ• ๋‹น์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ณ€์ˆ˜ ์‚ฌ์šฉ์—์„œ ๋ณ€์ˆ˜์˜ ๋‚ด์šฉ์— ๋”ฐ๋ผ ๋‹ค๋ฅธ ์—ฐ๊ฒฐ ๋™์ž‘์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฒด์ด๋‹์„ ๋น„ํ™œ์„ฑํ™”ํ•˜๋ ค๋ฉด ์•”์‹œ์  &๋ฅผ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ๋„๋ก ์ง€์ •ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

.์š”์†Œ {
@var : &();
&(@var)_child {} // ๋˜๋Š” "&์˜ ๋Œ€์ฒด" ๊ตฌ๋ฌธ๊ณผ ๊ฐ™์€ ์ผ๋ถ€
}

๊ทธ๋ž˜์„œ ๊ฒฐ๊ณผ๊ฐ€ ๋ฐ”๋žŒ์งํ•œ ์ด์œ ๋ฅผ ์•Œ์ง€๋งŒ IMO์—์„œ๋Š” ์„ ํƒ๊ธฐ ๋ชฉ๋ก์˜ ์ถœ์ฒ˜๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ๋ณ€์ˆ˜ ๋ณ‘ํ•ฉ ๋™์ž‘์„ "๋งค์ง ์Šค์œ„์น˜"ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

์˜ค... ๋‚œ ์‚ฌ์‹ค &(...) ์ข‹์•„ํ•ด...

ํ•˜, ์ •๋ง? &() (&์—์„œ ์„ ํƒ๊ธฐ ์บก์ฒ˜) ๋ฐ &(@arg) ( &๋ฅผ ์„ ํƒ๊ธฐ๋กœ ๋Œ€์ฒด)์˜ ์˜๋ฏธ์ƒ ํ˜ผ๋™์ด ์žˆ์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

๋ˆ„๊ตฐ๊ฐ€๊ฐ€ & ๋ฅผ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฒ„๋ฆฌ๊ธฐ ์œ„ํ•ด ๋นˆ ์„ ํƒ๊ธฐ๋กœ ๋Œ€์ฒดํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํ˜ผํ•ฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. (๋ฃจํŠธ์— ์ž์‹์„ ๋ฐฐ์น˜ํ•˜๊ธฐ ์œ„ํ•ด.) ์•„๋งˆ๋„ &(โ€œโ€) .child๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ?

์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•ฝ๊ฐ„์˜ ์ƒ๊ฐ/๊ณ ๋ ค๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ "์ƒ์œ„ ์„ ํƒ์ž๋Š” ๋Œ€์ƒ์ด ์žˆ์–ด์•ผ ํ•จ" ์Šค๋ ˆ๋“œ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์ƒ์†๋œ ์„ ํƒ์ž์˜ ํŠน์ • ๋ถ€๋ถ„(๋˜๋Š” ์ „์ฒด)์„ ๋Œ€์ฒดํ•˜๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ด๋ฅผ ์ƒ๊ฐํ•˜๋ฉด ๋‘ ๊ฐ€์ง€ ๊ฐœ๋ณ„ ๋ฌธ์ œ๋กœ ์ถ”์ ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์บก์ฒ˜ ๋ฐ

์ด ์›์„ ๋‹ซ๊ธฐ ์œ„ํ•ด ์—ฌ๊ธฐ์—์„œ ํ•จ์ˆ˜์™€ ์œ ์‚ฌํ•œ ๊ตฌ์กฐ๋กœ & ๋ฅผ ์ œ์ž๋ฆฌ์—์„œ ๋ณ€๊ฒฝํ•˜๋Š” ๊ฒƒ์„ ์–ธ๊ธ‰ํ–ˆ์Šต๋‹ˆ๋‹ค. - https://github.com/less/less.js/issues/1075#issuecomment -397697714

๋”ฐ๋ผ์„œ " & ์ƒ์†์„ ๋ณ€๊ฒฝํ•˜๋Š” ๋ฐฉ๋ฒ•/์—ฌ๋ถ€"์— ๋Œ€ํ•œ ํ† ๋ก ์ด ์ƒ์œ„ ์„ ํƒ์ž ์Šค๋ ˆ๋“œ์— ๋‚จ์•„ ์žˆ๊ณ  ์ด ์Šค๋ ˆ๋“œ๋Š” <strong i="9">@var</strong>: &() ๊ฐ€ - & ์„ ํƒ๊ธฐ๋ฅผ ๋ณ€์ˆ˜์— ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์—๋Š” ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์—ฌ์ „ํžˆ ๊ดœ์ฐฎ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๊ฐ€ ์žˆ๋Š”์ง€ ์—†๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์ด๊ฒƒ์„ ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๋‹ค

.html, .css, .js, .php, .mysql, .jquery, .txt, .java {
    <strong i="6">@html</strong>: '\f2d0';
    <strong i="7">@css</strong>: '\f034';
    <strong i="8">@js</strong>: '\f121';
    <strong i="9">@php</strong>: '\f120';
    <strong i="10">@mysql</strong>: '\f1c0';
    <strong i="11">@jquery</strong>: '\f78c';
    <strong i="12">@java</strong>: '\f11b';
    <strong i="13">@txt</strong>: '\f15c';
    &:before {
        content+_: @&;
    }
}

ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€๋Š” ์ž‘๋™ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰