๋ค์๊ณผ ๊ฐ์ ์๋ฃจ์ ์ด ์์ต๋๋ค.
// 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
}
}
ํฅ๋ฏธ๋กญ๊ฒ๋ ๊ทธ๋ฌํ ์์ฒญ์ด ์ด๋ฏธ ์กด์ฌํ๋ค๊ณ ์ ๋์ ์ผ๋ก ํ์ ํ์ต๋๋ค. ๋ถ๋ช
ํ ๊ทธ๋ ์ง ์์ต๋๋ค.
(๋ถ๋ช
ํ ์ด ์์ด๋์ด๋ #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+_: @&;
}
}
ํ์ง๋ง ์ด๊ฒ์ด ๊ตฌํ๋ ๋๊น์ง๋ ์๋ํ์ง ์์ ๊ฒ์ ๋๋ค.