16

あるミックスインまたはスタイルの宣言を入力パラメーターとして別のミックスインに渡す方法はありますか?

アニメーション キーフレームの例を見てみましょう。以下は、純粋な CSS でキーフレームを定義する方法です。

@-moz-keyframes some-name
{
    from { color: red; }
    to { color: blue; }
}

@-webkit-keyframes some-name
{
    from { color: red; }
    to { color: blue; }
}

@keyframes some-name
{
    from { color: red; }
    to { color: blue; }
}

アイデアは、ミックスインを使用してこれらの宣言を簡素化することです。そのため、次のようなものを作成できます。

.keyframes(name, from, to)
{
    // here we need somehow to reproduce structure
    // that we have in an example above
}

// define one animation
.my-from() { color: red; }
.my-to() { color: blue; }
// the following won't work because you cannot pass mixin as a parameter
// in way I have here, so I am looking for a way to solve this problem
.keyframes('some-name', .my-from, .my-to);

// define another animation
.another-from() { font-size: 1em; }
.another-to() { font-size: 2em; }
.keyframes('another-name', .another-from, .another-to);

システムには、アプリケーションに動的にアタッチしたり削除したりできるさまざまなモジュールがあります。そうではないので、私に使用を勧めないでください@import。出力 CSS は、モジュールとその独自の LESS スタイル、および mixins ライブラリなどの基本 LESS 依存関係に関する情報を使用して、動的にコンパイルされます。

注:ミックスインの代わりにクラス定義を渡す方法を知っていれば、うまくいきます。上記の例では、 and など.my-fromの代わりになります。.my-from()

4

4 に答える 4

24

LESS 1.7.0+ 用に更新 ( WAY Simpler )

1.7.0 の更新と、ルールセットを作成する機能、および設定で変数@keyframesを使用する機能により、これをはるかに直接的に行うことができるようになりました。

これで、ルールセットによってパラメーターを介してミックスインを実際に渡すことができるようになりました。または、プロパティ文字列自体を渡すことができます。したがって、これを考慮してください:

LESS (1.7 を使用)

.keyframes(@name, @from, @to) {
    @frames: {
        from { @from(); }
        to { @to(); }
    };
    @pre: -moz-keyframes;
    @-moz-keyframes @name
    {
       @frames();
    }

    @-webkit-keyframes @name
    {
       @frames();
    }

    @keyframes @name
    {
       @frames();
    }
}

.keyframes(testName, {color: red; .myMix(0);}, {color: blue; .myMix(1);});

.myMix(@value) {opacity: @value;}

プロパティ設定と mixin 呼び出しの両方を渡していることに注意してください。私の出力は次のとおりです。

CSS出力

@-moz-keyframes testName {
  from {
    color: red;
    opacity: 0;
  }
  to {
    color: blue;
    opacity: 1;
  }
}
@-webkit-keyframes testName {
  from {
    color: red;
    opacity: 0;
  }
  to {
    color: blue;
    opacity: 1;
  }
}
@keyframes testName {
  from {
    color: red;
    opacity: 0;
  }
  to {
    color: blue;
    opacity: 1;
  }
}

ルールセットが括弧内に渡され{...}、 and を介して呼び出される@from()方法に注意してください@to()(mixin 呼び出しによく似ています)。これらの渡されたルール セットを使用して別のルール セットを設定し、そのルール セット@frames自体を呼び出してキーフレームの定義を埋めます。

より一般的に

ここでは、プライベート mixin を別の mixin に渡し、その別の mixin から呼び出します。

以下

.someMixin(@class; @expectedMixin) {
    .@{class} {
      @expectedMixin();
      .myPrivateMix(0.6);
      test: 1;
    }
}

.someMixin(newClass; {.myClass;});

.myClass {
  .myPrivateMix(@value) {opacity: @value;}
}

CSS出力

.newClass {
  opacity: 0.6;
  test: 1;
}

レガシー情報のために以下を保持します。

更新 (LESS 1.4.0+ サポートを追加)

うわー、これには少し手間がかかりましたが、あなたが使えるものがあると思います。ただし、具体的にはパターン マッチングを使用して、モジュール内のミックスインを特別に定義する必要があります。そう...

まず、モジュールのミックスインを定義します

特定の将来の mixin で使用される予定のモジュール mixin が、同じ mixin nameで定義されているが、異なるパターン名で定義されていることに注意してください。これは、この作業を行うための鍵でした。

// define one animation in a module
.from(my-from){ color: red; }
.to(my-to) { color: blue; }

// define one animation in another module
.from(another-from){ font-size: 1em; }
.to(another-to) { font-size: 2em; }

モジュールに個々の mixin 名も必要な場合は、次のようにすることができます。

// define one animation in a module
.my-from(){ color: red; }
.my-to() { color: blue; }

.from(my-from){ .my-from() }
.to(my-to) { .my-to() }   

// define one animation in another module
.another-from(){ font-size: 1em; }
.another-to() { font-size: 2em; }

.from(another-from){ .another-from() }
.to(another-to) { .another-to() }

これにより、ストレート mixin を呼び出すか、またはパターン マッチングを通じて.my-from()特異な mixin グループにアクセスする後の mixin 内で可変的にアクセスできるようにする必要があります。.from()

次に、Mixin を定義します

あなたの@keyframes例では、それは非常に困難でした。実際、スタック オーバーフローの回答は、定義@nameに従っているために通常の LESS ルールでは適用されなかったの適用に関する問題を解決するのに不可欠でした。@keyframes適用するソリューション@nameは厄介に見えますが、機能します。残念なことに、アニメーションを再生するためのセレクター文字列も定義する必要があります (その文字列を使用して最後}のキーフレームを構築するため)。@この名前付けの制限は、 like@keyframesおよびpossible で始まる css 文字列にのみ当てはまります@media

さらに、モジュール ファイルで使用される標準の mixin 名があるため、新しい mixin 内で一貫してアクセスでき、同時に変数を渡して、パターン マッチを通じてその mixinの適切なバリエーションを選択できます。したがって、次のようになります。

LESS 1.3.3 以下

// define mixin in mixin file

.keyframes(@selector, @name, @from, @to) {
    @newline: `"\n"`; // Newline
    .setVendor(@pre, @post, @vendor) {
        (~"@{pre}@@{vendor}keyframes @{name} {@{newline}from") {
            .from(@from); 
        }    
        to  { 
            .to(@to);
        }
       .Local(){}
       .Local() when (@post=1) {
           (~"}@{newline}@{selector}") {
              -moz-animation: @name;
              -webkit-animation: @name;
              -o-animation: @name;
              -ms-animation: @name;
              animation: @name;
           } 
       }    
       .Local;
    } 
    .setVendor(""            , 0,    "-moz-");
    .setVendor(~"}@{newline}", 0, "-webkit-");
    .setVendor(~"}@{newline}", 0,      "-o-");
    .setVendor(~"}@{newline}", 0,     "-ms-");
    .setVendor(~"}@{newline}", 1,         "");
}

未満 1.4.0+

.keyframes(@selector, @name, @from, @to) {
    @newline: `"\n"`; // Newline
    .setVendor(@pre, @post, @vendor) {
        @frames: ~"@{pre}@@{vendor}keyframes @{name} {@{newline}from";
        @{frames} {
            .from(@from); 
        }    
        to  { 
            .to(@to);
        }
       .Local(){}
       .Local() when (@post=1) {
           @animationSector: ~"}@{newline}@{selector}";
           @{animationSector} {
              -moz-animation: @name;
              -webkit-animation: @name;
              -o-animation: @name;
              -ms-animation: @name;
              animation: @name;
           } 
       }    
       .Local;
    } 
    .setVendor(""            , 0,    "-moz-");
    .setVendor(~"}@{newline}", 0, "-webkit-");
    .setVendor(~"}@{newline}", 0,      "-o-");
    .setVendor(~"}@{newline}", 0,     "-ms-");
    .setVendor(~"}@{newline}", 1,         "");
}

Mixin を呼び出す

独自の名前を付けて、モジュール mixin のパターン マッチにストレート パターン (すべてドット [.]も引用符もなし)を渡すことができますが、セレクター文字列 (. mixin を正しく動作させるには:

.keyframes('.changeColor', some-name, my-from, my-to);
.keyframes('.changeFontSize', another-name, another-from, another-to);

目的の出力が得られる

@-moz-keyframes some-name {
from {
  color: red;
}
to {
  color: blue;
}
}
@-webkit-keyframes some-name {
from {
  color: red;
}
to {
  color: blue;
}
}
@-o-keyframes some-name {
from {
  color: red;
}
to {
  color: blue;
}
}
@-ms-keyframes some-name {
from {
  color: red;
}
to {
  color: blue;
}
}
@keyframes some-name {
from {
  color: red;
}
to {
  color: blue;
}
}
.changeColor {
  -moz-animation: some-name;
  -webkit-animation: some-name;
  -o-animation: some-name;
  -ms-animation: some-name;
  animation: some-name;
}
@-moz-keyframes another-name {
from {
  font-size: 1em;
}
to {
  font-size: 2em;
}
}
@-webkit-keyframes another-name {
from {
  font-size: 1em;
}
to {
  font-size: 2em;
}
}
@-o-keyframes another-name {
from {
  font-size: 1em;
}
to {
  font-size: 2em;
}
}
@-ms-keyframes another-name {
from {
  font-size: 1em;
}
to {
  font-size: 2em;
}
}
@keyframes another-name {
from {
  font-size: 1em;
}
to {
  font-size: 2em;
}
}
.changeFontSize {
  -moz-animation: another-name
  -webkit-animation: another-name;
  -o-animation: another-name;
  -ms-animation: another-name;
  animation: another-name;
}
于 2012-07-21T03:33:40.767 に答える
1

簡素化

@keframesを-animationから分離して、 ScottSの方法を少し単純化しました。

.keyframes(@name, @from, @to) {
    @newline: `"\n"`;
    .Local(@x){};
    .Local(@x) when (@x="") {(~"}@{newline}/*"){a:a}/**/};

    .setVendor(@pre, @vendor) {
        (~"@{pre}@@{vendor}keyframes @{name} {@{newline}from") {
            .from(@from);
        }
        to {
            .to(@to);
        }
        .Local(@vendor);
    }
    .setVendor(""            , "-webkit-");
    .setVendor(~"}@{newline}",    "-moz-");
    .setVendor(~"}@{newline}",      "-o-");
    .setVendor(~"}@{newline}",         "");
}

.animation(...) {
  -webkit-animation: @arguments;
     -moz-animation: @arguments;
       -o-animation: @arguments;
          animation: @arguments;
}

使用する:

.from(a1-from){ width: 10px; }
.to(a1-to) { width: 20px; }
.keyframes(a1-animation, a1-from, a1-to);


.selector {
    // some other css
    .animation(a1-animation 1s infinite linear);
}

出力:

@-webkit-keyframes a1-animation {
from {
  width: 10px;
}
to {
  width: 20px;
}
}
@-moz-keyframes a1-animation {
from {
  width: 10px;
}
to {
  width: 20px;
}
}
@-o-keyframes a1-animation {
from {
  width: 10px;
}
to {
  width: 20px;
}
}
@keyframes a1-animation {
from {
  width: 10px;
}
to {
  width: 20px;
}
}
/* {
  a: a;
}
/**/


.selector {
  // some other css
  -webkit-animation: a1-animation 1s infinite linear;
  -moz-animation: a1-animation 1s infinite linear;
  -o-animation: a1-animation 1s infinite linear;
  animation: a1-animation 1s infinite linear;
}

少し問題:

そのため、アニメーションは@keyframesから分離されましたが、代償を払う必要があります。厄介なことがあります:

/* {
  a: a;
}
/**/

しかし、それは問題ではないはずです->おそらく、私たち全員が、コメントを切り取るあらゆる種類のミニファイアを介してCSSファイルをプッシュします。

于 2013-02-13T12:28:39.803 に答える
1

私のソリューションを使用して CSS キーフレームを生成することもできます: https://github.com/thybzi/keyframes

特徴:

  • クロスブラウザのキーフレーム生成(Firefox 5 以降、Chrome 3 以降、Safari 4 以降、Opera 12 以降、IE 10 以降)
  • 各ルールで最大 16のタイムポイントkeyframes(必要に応じて、数を簡単に増やすことができます)
  • ミックスイン、変数、および関数は、タイムポイントのスタイリングに使用できます
  • animationキーフレームはルールと は別に作成されるため、次のようになります。
    • 複数のanimationルールで、タイミング、繰り返しなどに異なる値を持つ同じキーフレームを使用できます。
    • 複数のアニメーションを同じanimationルール内で使用できます
    • アニメーションは、任意の親セレクター内で適用できます (作成ではありません!)。
  • 軽量で (ほぼ) きちんとした LESS コード

基本的な使い方:

// Preparing styles for animation points
.keyframes-item(fadeIn, 0%) {
    opacity: 0;
}
.keyframes-item(fadeIn, 100%) {
    opacity: 1;
}
// Generating keyframes
.keyframes(fadeIn);

// Applying animation to fade-in block in 1.5 seconds
.myBlock {
    .animation(fadeIn 1.5s);
}
于 2013-11-29T09:21:57.767 に答える
0

実際には、ミックスインをどのように使用するかではありません。

次の行に沿って何かを行う必要があります。

.mixin-one { ... }
.mixin-two { ... }
.target-style {
    .mixin-one;
    .mixin-two;
    font-family: 'Comic Sans MS';
    color: magenta;
}
于 2012-07-18T22:59:19.080 に答える