ãã®è§£æ±ºçããããŸãïŒ
// LESS
.selector {
<strong i="6">@r</strong>: ~'.selector';
&--mode {
@{r}__block {
prop: value;
}
}
}
// CSS
.selector--mode .selector__block {
prop: value;
}
æ©èœãè¿œå ããããšãææ¡ããŸããçŸåšã®ã»ã¬ã¯ã¿ãŒãååŸããŠä»»æã®å€æ°ã«ä¿åããã«ã¯ã <strong i="11">@r</strong>: ~".selector";
代ããã«<strong i="9">@r</strong>: &;
èšè¿°ããŸãã
äŸïŒ
// 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ãªã©ïŒ
ã ããç§ãæšæž¬ããããã«ããŸãããã
ãšããã§ãäžãäžã®å Žåã«åããŠïŒãããŠãèãããã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
åãã³ãŒãã£ã³ã°ãããšããã¢ã€ãã¢ãçãŸããŸããã oochïŒ:)ã
èšèªã«æ°ãããã®ãè¿œå ããããšã«ã¯äžè¬çãªèºèºãããããšã¯ç¥ã£ãŠããŸãããã»ã¬ã¯ã¿ãŒæå®åã¯äŸ¿å©ãããããŸããã ç§ã¯|
奜ãã§ããã CSS @namespace
ã»ã¬ã¯ã¿ãŒæ§æã®äžéšã§ãã ãã ãã |
ãã»ã¬ã¯ã¿ãŒã_éå§_ããããšãèš±å¯ãããŠããããã«ã¯èŠããªãããã競åããªãããã«ããå¿
èŠããããŸãã ç§ã¯ããã䜿çšããŠããŸãããªããªããããã¯æŒ ç¶ãšé©åã«èŠããæ°åŠã®ã絶察å€ããæãåºãããããã§ãããããŠãããã¯åçŽã ããã§ãã äŒè©±ãåºæ¿ããããã®åãªãèãã
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
ããªãŒããŒãã®ã
äŸã®@{var}
ã䜿çšããå Žåã®ããã«ã Selector
ã¿ã€ãã®ããªãŒããŒããä¿æãã_any_å€æ°ãã»ã¬ã¯ã¿ãŒã«è£éãããå Žåãçµæã®ã»ã¬ã¯ã¿ãŒã¯åãæ¹æ³ã§æ§ç¯ããå¿
èŠããããŸãã &
è£éåšãã»ã¬ã¯ã¿ãŒã«ååšããå Žåã®ããã«ãã€ãŸã; 1ã€ã®ãã¹ãã¬ãã«ããã®ã»ã¬ã¯ã¿ãŒãçµåããŠãã¬ãã£ãã¯ã¹ãä»ããªãã§ãã ããã
ãã®èåŸã«ããçç±ã¯ãäž¡æ¹ããã£ããã£ãããã»ã¬ã¯ã¿ãŒã§ãããšããããšã§ãã selector()
ã¯ãŠãŒã¶ãŒããã£ããã£ããã»ã¬ã¯ã¿ãŒã§ããã &
ã¯åžžã«ååšããŠãã£ããã£ãããã芪ãã»ã¬ã¯ã¿ãŒã§ãã
次ã«ããŠãŒã¶ãŒããã£ããã£ãããSelector
ããŒããš_current_ã»ã¬ã¯ã¿ãŒã³ã³ããã¹ãã®è£éãå¿
èŠãšããå ŽåããŠãŒã¶ãŒã¯ããã«ã€ããŠæ瀺çã«ããããšãã§ããŸãã äŸïŒ & @{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ïŒèŠªã»ã¬ã¯ã¿ãŒãã¿ãŒã²ããã«ããïŒã®ããªãšãŒã·ã§ã³ã§ãããã ãªã¹ãã§ãããåäžã®è©äŸ¡ãããã»ã¬ã¯ã¿ãŒïŒãŸãã¯ããã¯ã¹ã€ã³ïŒã§ã¯ãªããåºåã¯ã»ã¬ã¯ã¿ãŒãªã¹ãã§ãããè©äŸ¡ãããã«ãŒã«ã»ããã§ã¯ãªãããããšã€ãªã¢ã·ã³ã°ããã¯ã¹ã€ã³ãšã¯ç°ãªããŸããïŒ ãã®æ©èœã¯éããšæããŸãã ããããã¹ãŠãåãæ¹åã«åããŠããããšã確èªãããã ãã§ãã
@ 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
ãªã©ïŒå¹žããªããšã«ãããã¯ããã¯ã¹ã€ã³/é¢æ°ãšããŠäœ¿çš/å®çŸ©ã§ãããã¹ãŠã®ãã®ãã«ããŒããŸãïŒã¯å€æ°ã«çŽæ¥å²ãåœãŠãããŸãïŒãŸãã¯é¢æ°ã«ãã©ã¡ãŒã¿ãŒãšããŠæž¡ãããŸãïŒã ã€ãŸããå®éã«ã¯ãã§ã«ããããããŸãïŒ
<strong i="15">@var</strong>: .ns.mixin; // OK, its just Anonymous value (representing an arbitrary identifier)
function(.mixin); // error: TODO
^ããã¯ïŒæ¬è³ªçã«ïŒã»ã¬ã¯ã¿ãŒãšã¯ãŸã£ããé¢ä¿ãããŸãã-ãããã®å€ã¯ã @var(...)
ãŸãã¯@var[...]
ã¹ããŒãã¡ã³ã
ïŒäžè¬ã«ãè«ççãªèŠåã¯ãããã¯ã¹ã€ã³èå¥åãïŒå
éšçã«ã¯ïŒã»ã¬ã¯ã¿ãŒã§ããããšãå¿ããããšã§ãããåžžã«ããããŸãã¯#
ãã¬ãã£ãã¯ã¹ãæã€èå¥åãããã³.ns > .mixin
ãããªãã®ãšèããããšã§ããæçµçã«ã¯åé·ã§åœ¹ã«ç«ããªããã®ãšããŠæ¶ããŠãããŸã:)
è€éãŸãã¯ãæ¬ç©ãã®ã»ã¬ã¯ã¿ã«å¯Ÿãå¿
èŠselector
çç±æ§æ/ããŒãµã®ãããŸããã®æ¬äŒŒæ©èœã ã€ãŸãã次ã®ãããªãã®ã§ãã
<strong i="29">@var</strong>:foo>bar
<-ã»ã¬ã¯ã¿ãŒãšïŒæœåšçã«ïŒè«çåŒ<strong i="32">@var</strong>:.1+.2;
<-arithmåŒãšæå¹ãª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}
ãé©åãªåœ¢åŒã«å€æããå¿
èŠãããããšã«æ³šæããŠãã ããããããã£ãŠããã®å€æ°ã®å€ãã©ã®åœ¢åŒã§ãããã¯ãæååãå¿åããã®ä»ã®ãããã§ãã£ãŠããå®éã«ã¯éèŠã§ã¯ãããŸãããããŒãã®æ§é -å€æã®ããªãã¯ã®ã»ãšãã©ã¯åããŸãŸã§ãïŒã
@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]
ã¹ããŒãã¡ã³ãã®ã¿ã2ååŒã³åºãããŸãïŒã€ãŸããå®éã«ã¯é
延è©äŸ¡ãããŸãïŒãã [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ïŒâãããã
ãã£ããã ã 䜿çšæ³ã«é¢ããŠã¯ãããã«ã€ããŠé ãæ©ãŸããŠããŸããããããè¯ãã¢ã€ãã¢ããããŸããã ããã«ã¯äœãç¹å¥ãªããšããã£ããšæããŸãããããã§ã¯ãªããããããŸããã ããæç¹ã§$()
ã«ã€ããŠã®è°è«ããã£ãããšã¯ç¥ã£ãŠããŸãããçµå±$
ã ãšããã§ãããã¯selectors()
ããã selector()
ãªãã§ããããïŒ ïŒ &
ïŒã»ã¬ã¯ã¿ãŒãããã€ã§ãå«ããããšã¯ã§ããŸãããïŒ
ãããŠã selector(&)
ã¯current-selector()
ãããçã«ããªã£ãŠããããã§ãã ã€ãŸãããXãªããžã§ã¯ãããã»ã¬ã¯ã¿ãŒãªã¹ããäœæããŸãã &
ã§ãæååã§ãããŸããŸãããã æçµçãªæ§æãäœã§ãããåŒæ°ãšããŠ&
ãå¿
èŠã«ãªãããã§ãã
ãããŠã
selector(&)
ã¯current-selector()
ãããçã«ããªã£ãŠããããã§ã
ãããã¯å¥ã®ãã®ã§ãã current-selector
ã¯ã &
åãªãé¢æ°ããªã¢ã³ãã§ãïŒåŸè
ã¯ããŒãµãŒã§ãµããŒããããŠããªãããïŒã selector(...)
ã¯ãããŒãµãŒãä»»æã®ã»ã¬ã¯ã¿ãŒïŒ &
å«ãïŒããµããŒãããããã®ãããã§ãã
selectors
ã«ã€ããŠã¯ãããã§ããã ããããããã¯åäžã»ã¬ã¯ã¿ãŒã®ãŠãŒã¹ã±ãŒã¹ã®99ïŒ
ã§ãããããã»ãšãã©ã®ãŠãŒã¶ãŒã«ãšã£ãŠè€æ°åœ¢ã¯ããŸãç®ç«ããªãããã«èããããšæããŸãïŒã»ãšãã©ã®å Žåãã»ã¬ã¯ã¿ãŒãšããŠh1, h2, h3 {}
ãšããã¿ã€ãã«ãä»ããLess parentã»ã¬ã¯ã¿ãŒã«ã€ããŠè©±ãç¶ããŸãïŒã»ã¬ã¯ã¿ãŒã®å Žå
ãããããããŸããã
@ matthew-dean
è€æ°åœ¢ãšåæ°åœ¢ã¯ãCSSä»æ§ã®äœæè
以å€ã¯ã»ãšãã©äºææ§ããããŸãã å®éããããäœæããŠãã ãããCSSä»æ§èªäœã§ãããåæ°åœ¢ãšè€æ°åœ¢ã®äº€æ䜿çšã®é€é£ã«ãªãããšããããããä»æ§ã®äœæè
ãå«ããã¹ãŠã®äººã«ãšã£ãŠã
ãšãŠãéœæ°ã«ã è€æ°åœ¢ã®ãã»ã¬ã¯ã¿ãŒãã¯ãã³ã³ãåºåãã®ã»ãããæå®ããå ¬åŒã®æ¹æ³ã§ã¯ãããŸããã è€æ°åœ¢ã®å³å¯ã«æ£ããçšèªã¯ã_ã»ã¬ã¯ã¿ãŒãªã¹ã_ã§ãããšç§ã¯ä¿¡ããŠããŸãã
ãããã£ãŠããã®ãããŸããªåç §ãå®éã«ã©ãã»ã©æ·±ãæ ¹ä»ããŠãããã確èªã§ããŸãã
è€æ°åœ¢ã®å³å¯ã«æ£ããçšèªã¯ãã»ã¬ã¯ã¿ãŒãªã¹ãã ãšæããŸãã
ãããæšæ¥ãw3cãæ€çŽ¢ããŸãããããã¯ãã»ã¬ã¯ã¿ãŒã®ã°ã«ãŒããããã»ã¬ã¯ã¿ãŒã®ãªã¹ãããªã©ã§ãããã»ã¬ã¯ã¿ãŒã¯ãã³ã³ãããŒã¿ãŒã§åºåããã1ã€ä»¥äžã®åçŽãªã»ã¬ã¯ã¿ãŒã®ã·ãŒã±ã³ã¹ã®ãã§ãŒã³ã§ãããšããå¥åŠãªãã®ã¯ãããŸãããããã«ãããŸã:) ãã»ã¬ã¯ã¿ãŒã圢åŒã¯ãäž»ã«ãã»ã¬ã¯ã¿ãŒã¿ã€ããã®ããšã説æããããã«äœ¿çšãããŸãã
ãã»ã¬ã¯ã¿ãŒã¯ãã³ã³ãããŒã¿ãŒã«ãã£ãŠåé¢ãããåçŽãªã»ã¬ã¯ã¿ãŒã®1ã€ä»¥äžã®ã·ãŒã±ã³ã¹ã®ãã§ãŒã³ã§ãã
ãããŠããããã³ã³ãåºåãã®ãªã¹ããåç §ããŠããå¯èœæ§ããããšèããŠãã人ã«ãšã£ãŠã¯ãããã§ã¯ãããŸããã ãã®åŒçšã®å®å šãªåœ¢åŒã¯æ¬¡ã®ããã«ãªããŸããã_ complex_selectorã¯ãã³ã³ãããŒã¿ã§åºåããã1ã€ä»¥äžã®åçŽãªã»ã¬ã¯ã¿ãŒã®ã·ãŒã±ã³ã¹ã®ãã§ãŒã³ã§ããã
CSSä»æ§ã«ã¯å¥ã®åé¡ãããããã»ã¬ã¯ã¿ãŒãã®äžè¬åããã圢åŒã¯ãä»æ§ãæ£åŒã«_complexselectors_ãšåŒãã§ãããã®ãåç
§ããããã«äž»ã«äœ¿çšãããŸãã è€éãªã»ã¬ã¯ã¿ãŒã¯åçŽãªã»ã¬ã¯ã¿ãŒã§ããäŸïŒ tag
; #id
; .class
; [attr]
; ãªã©ãã³ã³ãããŒã¿ãä»ããŠãã§ãŒã³ãããŸããäŸïŒ >
; +
; ~
ãªã©
ul > li
ãããªãã®ã¯ãè€åã»ã¬ã¯ã¿ãŒãšåŒã°ããŸãã
èŠå以äžã¯å°ãæŽèšã«ãªããŸãïŒ
CSSã®ä»æ§ã¯ãæ²ããããšã«ãäžè²«æ§ã®ãªããååã®æªãçšèªã®çª®å°ã«ãããŸãã åŸãã«è¡ãã»ã©ãåŸã ã«æªåããŸãã CSS3ã¢ãžã¥ãŒã«ã®ããŒããCSS2.1ã¢ãžã¥ãŒã«ãåç §ãç¶ããããšããå€ãCSS2.1ããã¥ã¡ã³ããéèªçã«ã³ããŒããããšã«ãã£ãŠæ°ããCSS3ã¢ãžã¥ãŒã«ãæå®ãããããšãå©ããŸããã ãã ããã»ã¬ã¯ã¿ãŒãšããžã¥ã¢ã«ãã©ãŒãããã¢ãã«ã®ä»æ§ã¯ææªã®éåè ã§ãã éåžžã«ãããŸãã§ã䌌ããããªé³ã®ããŸãã¯ãããã«ããååã®ä»ããçšèªã
ããšãã°ã [*|attr^="value" i]
ãªã©ã ul > li
ãããã¯ããã«ç°¡åãªãã®ãèããŠã¿ãŸãããã åŸè
ã¯ãæè¡çã«ã¯åçŽãªã»ã¬ã¯ã¿ãŒãšããŠåé¡ãããŸãã ïŒã¯ããããã§ããïŒ
åŸè ã®ããžã¥ã¢ã«ãã©ãŒãããã¢ãã«ã®ä»æ§ã®äžéšããæ°å¹Žåã®ããæç¹ã§ããããã¶ã€ã³å¿åã®ååã®1人ã«èª¬æããå¿ èŠããããŸããã ã©ã€ã³ããã¯ã¹ã®æŠå¿µãæ±ã£ãŠããç®æã調ã¹ãŠãããšãã«ãå®éã«ããã€ãã®ãã¥ãŒãºãè³å ã§é£ãã§ãããšæããŸãããããã¯ææªã®éšåã§ã¯ãããŸããã§ããã ïŒæ£æ°åºŠã«ã»ãšãã©äŸ¡å€ããªãå Žåã¯ãããŒãã«ãã©ãŒãããã¢ãã«ã§ããéæ³ã®ã©ã©ã©ã³ãã«è¶³ãèžã¿å ¥ããŠã¿ãŠãã ãããïŒ
ãªãŒãã³ãœãŒã¹ãããžã§ã¯ãã®ããã¥ã¡ã³ãã®å€æ§ãªåã³...
ããšãã°ã
[*|attr^="value" i]
ãªã©ãul > li
ãããã¯ããã«ç°¡åãªãã®ãèããŠã¿ãŸãããã åŸè ã¯æè¡çã«ã¯åçŽãªã»ã¬ã¯ã¿ãŒãšããŠåé¡ãããŸã
ããã¯å®éã«ã¯ç§ã«ã¯çã«ããªã£ãŠããŸããç¬ãããã¯ã³ã³ãããŒã¿ã䜿çšããªãããã§ãã ããã¯æ£ç¢ºã«å®çŸ©ã«åŸããŸãã å€ãã®èšå·ã䜿çšããŠãããããšãã£ãŠãããããããè€éãã«ãªãããã§ã¯ãããŸããã ul > li
ã¯ã2ã»ããã®ã¯ãšãªãå«ãããè€éã§ããã€ãŸãã li
äžèŽãããã¹ãŠã®èŠçŽ ãã¯ãšãªããããããããããªãŒããã©ããŒã¹ããŠã ul
å«ãŸããèŠçŽ ãå€å¥ããŸãã åŸè
ã¯ãåã
ã®èŠçŽ ã1åã ããã¹ãããŸãã ããã¯1ã€ã®ã¯ãšãªãªã®ã§ãåçŽãªã»ã¬ã¯ã¿ãŒã§ãã
è€æ°åœ¢ã®ãã»ã¬ã¯ã¿ãŒãã¯ãã³ã³ãåºåãã®ã»ãããæå®ããå ¬åŒã®æ¹æ³ã§ã¯ãããŸããã è€æ°åœ¢ã®å³å¯ã«æ£ããçšèªã¯ãã»ã¬ã¯ã¿ãŒãªã¹ãã ãšæããŸãã
ããã§ããããªãã¯æ£ããã§ãã ãã»ã¬ã¯ã¿ãŒãã¯ãå®éã«ã¯èŠçŽ ãéžæã§ããããã«å®çŸ©ããããããã§ããã ul > li > .title
ã¯ãã»ã¬ã¯ã¿ãŒãã®åæ°åœ¢ã§ãã ãããã£ãŠã selector()
ã¯ãå®éã«ã¯ãããããæå³çã«è¿ããšæããŸãã
@ seven-phases-max
quick-n-dirtyãã©ã°ã€ã³é¢æ°ã§å¥ã®å°ããªåé¡ã«ééããŸããïŒåå空éã®ããã¯ã¹ã€ã³ããã®ã¢ã¯ã»ã¹ãæ£ããåŠçããŸããã åå空éã¯éåžžã®Ruleset
ã¿ã€ãã®ãã¬ãŒã ã§ããããããã®ååãã»ã¬ã¯ã¿ãŒã«è¿œå ãããŸãã
å®éã®å®è£ ã§ã¯ããããããã®å Žåãã«ããŒããå¿ èŠããããŸãã
[ç·šé]
ãããæ©èœãããç§èš£ã¯ãé¢æ°ã³ã³ããã¹ãã®ã¹ã¿ãã¯ã®ãã¬ãŒã ã®1ã€ãMixinDefinition
ã§ãããã©ããã確èªããããã_is_ã®å Žåã¯ããã®ã¹ã¿ãã¯ã®æ¬¡ã®x
ãã¬ãŒã ãã¹ãããããããšã§ããããã§x
ã¯ã MixinDefinition
ã®ã¹ã¿ãã¯äžã®ãã¬ãŒã ã®éãšåãã§ãã
ïŒåºæ¬çã«ãããã¯MixinCall
ãMixinDefinition
å®è¡ãããšãã«ã¹ã¿ãã¯ã«è¿œå ããããã¯ããŒãžã£ãŒããã¬ãŒã ãã¹ãããããŸããïŒ
ãå€ããã©ãã«ãåé€ããŸããã ããã¯ãŸã 調æ»ããã®ã«è¯ãåé¡ã§ãã
ãã¶ãcurrent-selector()
ã¯ããã»ã©æªãã¯ãããŸããã ãã ããæ確ã«ããããã«ãå®éã«ã¯current-selectors()
ãŸãã ããããããã¯ãŸã å°ãåé·ã§ãã ãã£ãšç°¡æœãªãcapturingïŒãã®é¢æ°åãèããã°ãã£ãšè³æã ãšæããŸãã
ããç°¡æœãªãcapturingïŒãã®é¢æ°åã
&()
ãšããååãä»ããŠãã ããã çµå±ã®ãšãããããã¯æŠå¿µçã«ã¯&
ã«ãããã®ã®ã²ãã¿ãŒã«ãããŸããã
äŸãã°
.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! */
}
ããã¯ãããã®ã§ãç§ã¯ããã倧奜ãã§ãã
ããã«ã€ããŠãã£ãšèãããšãç§ã«ãšã£ãŠæãé
åçãªã®ã¯ïŒæåã®ãã¹ã®åŸãæ°ãçã£ããæ¢ããŠãã ããïŒãæšæºåãããã³ã³ããŒãã³ãã®ããããã¯ãïŒã«ãŒã«ã»ããïŒã¹ã¿ã€ã«ãæã€å¯èœæ§ã ãšæããŸãã åºæ¬çã«ãä¿åãããåçŽãªã»ã¬ã¯ã¿ãŒæååå€ã®ä»£ããã«ãé¢æ°ã_ " &
ã«ããããããããšãã»ãŒæãã§ããŸãããã¹ã³ãŒãã§ã¯å€æ°ã¯" _ã§å®çŸ©ãããŠããããã®ãªãŒãµãªã³ã°ã¹ã¿ã€ã«ãå¯èœã«ãªããŸãã³ã³ããŒãã³ãã®å ŽåïŒãããBehavior 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ã®èª¬åŸåã®ããã±ãŒã¹ïŒå®è£ ã®é£ããã¯å¥ãšããŠïŒã¯ãããŸããïŒ
ããã¯ãäœæ¥ãéå§ããåã«åçããå¿ èŠããããšæã質åã®1ã€ã«ãããŸããã
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( ... )
}
ããã§äœ¿çšãããããã¯ã¹ã€ã³ã¯ã &()
ãä»ããŠã¯ã©ã¹ãèªã¿åãããããé©åã«åºåã«çµã¿èŸŒãããšãã§ããŸãã ããšãã°ã2çªç®ãš3çªç®ã®ã«ãŒã«ã§ãã£ããã£ãããã»ã¬ã¯ã¿ãŒã¯ãBEMæ§æãå解ããŠããã¹ããããèŠçŽ ã»ã¬ã¯ã¿ãŒã®ãªãŒããŒã©ã€ããçæããããã«äœ¿çšã§ããåºæ¬ãããã¯ã¯ã©ã¹ãååŸã§ããŸãã
ããã¯; ã»ã¬ã¯ã¿ãŒåããã©ã¡ãŒã¿ãŒãšããŠæž¡ãå¿
èŠãªãã«ã .my-button--wide > .my-button__text
ãããªã»ã¬ã¯ã¿ãŒãçæããããã«äœ¿çšã§ããŸãã åŒã³åºãå
ã»ã¬ã¯ã¿ãŒã³ã³ããã¹ãããã®ã¿ã
ãã®ãããªããã¯ã¹ã€ã³ããŒã¹ã®_ã³ã³ããŒãã³ããã¡ã¯ããª_ã¯ãã¹ã¿ã€ãªã³ã°ãã¬ãŒã ã¯ãŒã¯ã䜿çšããããšã§çºçãããç§ãã¡ã®éãé«ééè·¯ã®åé¡ã®å€ããåé¿ããŸãã ãã¬ãŒã ã¯ãŒã¯ãç»é²ã§ããŸãããå®éã«çµã¿èŸŒãã³ã³ããŒãã³ããšãã®ååããã现ããéžæã§ããŸãã
@rjgotten
ããã§äœ¿çšãããããã¯ã¹ã€ã³ã¯ãïŒïŒïŒãä»ããŠã¯ã©ã¹ãèªã¿åãããããé©åã«åºåã«çµã¿èŸŒãããšãã§ããŸãã ããšãã°ã2çªç®ãš3çªç®ã®ã«ãŒã«ã§ãã£ããã£ãããã»ã¬ã¯ã¿ãŒã¯ãBEMæ§æãå解ããŠããã¹ããããèŠçŽ ã»ã¬ã¯ã¿ãŒã®ãªãŒããŒã©ã€ããçæããããã«äœ¿çšã§ããåºæ¬ãããã¯ã¯ã©ã¹ãååŸã§ããŸãã
ãããããããŸããã ããããããã¯ã¹ã€ã³ã§æã䟿å©ã§ãã ç§ã¯ééããªããçŽæ¥ã»ã¬ã¯ã¿ãŒåã䜿çšããããã&()
ã®ãŠãŒãã£ãªãã£ãååŸããŸãã ç§ã®ãã€ã³ãã¯ãäžããããäŸã§&()
ã®å€ãæ確ã«ããããšããããš
ããã«èšãã°ãããã¯åªããæ§æãœãªã¥ãŒã·ã§ã³ã ãšæããŸãã誰ãããããæ¡çšãããå Žåã¯ãå人çã«&()
å®è£
ãé²ããããšã«ðãäžããŸãã
@ matthew-dean
æåŸ ããåºåãèšè¿°ããŠããªããããäŸã¯ããæ··ä¹±ããŠããŸãã
ãã£ãšããè©«ã³ããŸãã æ£ããèšãæããŸãã 以äžã®CSSã«Lessãã³ã³ãã€ã«ãããšã &()
æ¹ã匷åãªæ©èœã«ãªããšæããŸãã
.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;
ãšåãããã«åäœããå Žåããã®æ©èœãããã¯ã¹ã€ã³å
ã®ãŠãŒãã£ãªãã£_only_ã«å§ä»»ããŠããŸãããæäŸã§ãããã®ã¯ãŸã ãŸã ãããšæããŸãã
éçãªãçŸåšã®ïŒã®å€ããè¿ãã®ã§ã¯ãªããæ¬è³ªçã«ãïŒã§ãããããæ·±ãã§ã¯ãªãããã«ãã¹ããããŠãããã®ããã«ããæå³ããŸãã
ãããäœãæå³ããã®ãæ¬åœã«ããããŸããã
ããã¯ã .thing{ & {} }
ãš.thing{ <strong i="11">@amp</strong>:&(); @{amp} {} }
ãåãåºåãçæããã¯ãã ãšæãããšãæå³ããŸãã
ã€ãŸããããå®éçã«ã¯ãç°¡åãªBEMãå®è¡ããããã«ããã¯ã¹ã€ã³ãäœæããå¿ èŠã¯ãããŸããããã€ã³ã©ã€ã³ã§å®çŸ©ããããšãã§ããŸãã ç§ã®å€ãäŸã®1ã€ã«æ»ããŸãïŒ
_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;
}
}
}
}
// ...
_hypothetical-styles.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åAMã§ãrjgotten [email protected]æžããŸããïŒ
@ matthew-dean
ãã¹ãŠã®ãªã¹ãã¡ã³ããŒã«åºã¥ããŠã»ã¬ã¯ã¿ãŒãæ¡åŒµããããã®ç¹å¥ãªåäœãå«ããã»ã¬ã¯ã¿ãŒãªã¹ããã»ã¬ã¯ã¿ãŒã®å®éã®ãªã¹ããšããŠå ¬éãããšãå®éã«ã¯ããã«ãã°ãããã§ããããäŸãã°æã£ãŠãã
.aã.b {
@this ïŒïŒïŒïŒ;@{ãã} {
CD;
}
}
åºå.a .aã
.a .bã
.bã .aã
.a .b {
CD
}
ãã€ãã£ããšåãããã«ãâ
ããªããèšåãããã®ã§ãããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ãããã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_ã§ãã眮æããŒã¯ã³ãããå Žåã眮æããŒã¯ã³ã¯&
ãæå®ãããå Žåãšåãããã«æ©èœãããã¹ãã®çµæãšããŠçããéåžžã®ã»ã¬ã¯ã¿ãŒãã§ãŒã³ã_ç¡å¹ã«ããŸã_ã
&()
ããå®éã®ã»ã¬ã¯ã¿ãŒãªã¹ããšããŠèå¥ã§ããããŒãã¿ã€ããåºåããå Žåããã®åäœã¯æ¯èŒçç°¡åã«å®çŸã§ãããšæããŸãã
å®éãå°çšããŒãã¿ã€ããåºåããå Žåã¯ãåŸã§ãã£ããã£ãããã»ã¬ã¯ã¿ãŒãªã¹ãã_æäœ_ãããã©ã°ã€ã³é¢æ°ã®äœæã«ã圹ç«ã€å¯èœæ§ããããŸãã
ç§ã«ã¯ãïŒïŒïŒã«äžåºŠã«å€ãã®äœæ¥ãè¡ãããããã«èãããŸãã ã»ã¬ã¯ã¿ãŒãå€æ°ã«ä¿åãããå Žåãããã¯1ã€ã®ããšã§ããããã®_content_ã®ããã«ããã®å€æ°ã§ã»ã¬ã¯ã¿ãŒãã§ãŒã³ãç¡å¹ã«ãããšãæ§æãäžæ確ã«ãªããŸãã ãã®å€æ°ã¯ã©ãããã§ãååŸã§ãïŒããšãã°ãããã¯ã¹ã€ã³ããæž¡ãããïŒãã»ã¬ã¯ã¿ãŒãªã¹ãã¯åçŽãªå€æ°ã®å²ãåœãŠã«ãã£ãŠçæã§ããŸãã ã€ãŸããå€æ°ã®äœ¿çšæ³ãããå€æ°ã®å 容ã«åºã¥ããŠç°ãªãé£éåäœãçºçãããã©ããã¯æããã§ã¯ãããŸããã
ãã§ãŒã³ãç¡å¹ã«ãããå Žåã¯ãæé»ã®ïŒãå¥ã®å€ã«çœ®ãæããããšãæå®ããå¿ èŠããããšæããŸãïŒãã©ãŒããããèš±ããŠãã ãããç§ã¯ç§ã®é»è©±ã«ããŸãïŒ-
ãæå {
@var ïŒïŒïŒïŒ;
ïŒïŒ@ varïŒ_child {} //ãŸãã¯ãã®ãããªãïŒã®çœ®æãæ§æ
}
ãããã£ãŠãçµæãæãŸããçç±ã¯ããããŸãããIMOã§ã¯ãã»ã¬ã¯ã¿ãŒãªã¹ãã®ååŸå ã«åºã¥ããŠå€æ°ã®ããŒãžåäœããããžãã¯ã¹ã€ãããããããšã¯ã§ããŸããã ããã«ã¯2ã€ã®ç°ãªãæ©èœãå¿ èŠã§ãã
ãã...ç§ã¯å®éã«&(...)
ãã®ã奜ãã§ã...
ããæ¬åœã«ïŒ &()
ïŒïŒããã»ã¬ã¯ã¿ãŒããã£ããã£ïŒãš&(@arg)
ïŒïŒãã»ã¬ã¯ã¿ãŒã«çœ®ãæããïŒã®ã»ãã³ãã£ãã¯ãªæ··ä¹±ã¯ãªããšæããŸããïŒ
誰ãã&
ãæ¬è³ªçã«ç Žæ£ããããã«ç©ºã®ã»ã¬ã¯ã¿ãŒã«çœ®ãæããããšæããããããªãã®ã§ãããããæ··åããªãããšãæ€èšããããããããŸããã ïŒã«ãŒãã«åãé
眮ããŸããïŒå€å&(ââ)
.childãããããŸãããïŒ
ç§ã¯ç¥ããªããããã¯ããã€ãã®èã/èæ ®ã«å€ããã
ãŸããã芪ã»ã¬ã¯ã¿ãŒã«ã¯ã¿ãŒã²ãããå¿ èŠãã®ã¹ã¬ããã§è¿°ã¹ãããã«ãç¶æ¿ãããã»ã¬ã¯ã¿ãŒã®ç¹å®ã®éšåãïŒãŸãã¯å®å šã«ïŒçœ®ãæãããŠãŒã¹ã±ãŒã¹ãããã®ã§ããããèãããšããããã¯2ã€ã®å¥ã ã®åé¡ãšããŠè¿œè·¡ããå¿ èŠããããšæããŸãã ãã®åé¡ã¯ããã£ããã£ãš
ãã®åãéããããã«ãããã§ãé¢æ°ã®ãããªæ§é ã䜿çšããŠ&
ãã€ã³ãã¬ãŒã¹ã§å€æŽããããšã«èšåããŸããã -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+_: @&;
}
}
ãããããããå®è£ ããããŸã§ã¯æ©èœããŸãã