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="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
  }
}
feature request medium priority needs decision research needed

党おのコメント50件

䞍思議なこずに、私はそのような芁求がすでに存圚するこずを絶察に確信しおいたした。 どうやらそうではありたせん。
明らかに、このアむデアは以前の倚くのチケットに衚瀺されおいたした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+_: @&;
    }
}

しかし、これが実装されるたでは機胜したせん

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡