1

私のプロジェクト(PHP)でLESS cssを使用する予定でした。@mediaネストされたクエリ機能を使用する予定です。生成される出力 css で複数のメディア クエリをグループ化できないことがわかりました。

例えば:

// 以下
.ヘッダー {
  @media all and (min-width: 240px) and (max-width: 319px) {
    フォントサイズ: 12px;
  }

  @media all and (min-width: 320px) and (max-width: 479px) {
    フォントサイズ: 16px;
    フォントの太さ: 太字;
  }
}

。体 {
  @media all and (min-width: 240px) and (max-width: 319px) {
    フォントサイズ: 10px;
  }

  @media all and (min-width: 320px) and (max-width: 479px) {
    フォントサイズ: 12px;
  }
}

// CSSを出力
@media all and (min-width: 240px) and (max-width: 319px) {
  .ヘッダー {
    フォントサイズ: 12px;
  }
}
@media all and (min-width: 320px) and (max-width: 479px) {
  .ヘッダー {
    フォントサイズ: 16px;
    フォントの太さ: 太字;
  }
}
@media all and (min-width: 240px) and (max-width: 319px) {
  。体 {
    フォントサイズ: 10px;
  }
}
@media all and (min-width: 320px) and (max-width: 479px) {
  。体 {
    フォントサイズ: 12px;
  }
}

私の予想される出力は(@media query grouped)です

@media all and (min-width: 240px) and (max-width: 319px) {
  .ヘッダー {
    フォントサイズ: 12px;
  }
  。体 {
    フォントサイズ: 10px;
  }
}
@media all and (min-width: 320px) and (max-width: 479px) {
  .ヘッダー {
    フォントサイズ: 16px;
    フォントの太さ: 太字;
  }
  。体 {
    フォントサイズ: 12px;
  }
}

LESS (PHP) 自体で実行できるかどうか、または出力 CSS を操作して @media クエリをグループ化およびマージするために使用できる単純な PHP ベースの CSS パーサーがあるかどうかを知りたいです。以下の流れのとおりです。

  LESSファイル
      | |
      Ⅴ
【LESSphpコンパイラ】
      | |
      Ⅴ
   CSSファイル
      | |
      Ⅴ
生成された CSS ファイル
私のスクリプトを実行します
CSS パーサーを使用して記述
      | |
      Ⅴ
   CSSファイル
類似の @media で
グループ化。

グループ化された @media クエリを LESS (PHP) で実現できない場合、上記のフローで使用できる CSS パーサー (PHP) に関する提案を教えてください。

4

2 に答える 2

4

less コードを変更せずに、 autoCompileLess関数を CSS の最後にグループ メディア クエリに適用します。

@mobile: ~"only screen and (max-width: 529px)";
.test {
    color:green;
    @media @mobile { color:red; }
}    
.test2 {
    color:red;
    @media @mobile { color:blue; }
}

デフォルトで less でコンパイル

.test {
    color:green;
}    
.test2 {
    color:red;
}
@media only screen and (max-width: 529px) {
    .test {
        color:red;
    }
}    
@media only screen and (max-width: 529px) {
    .test2 {
        color:blue;
    }
}

以下の関数でコンパイルする

.test {
    color:green;
}    
.test2 {
    color:red;
}
@media only screen and (max-width: 529px) {
    .test {
        color:red;
    }
    .test2 {
        color:blue;
    }
}

そして機能:

<?php
function autoCompileLess($inputFile, $outputFile)
{
    // load cache
    $cacheFile = $inputFile.".cache";

    if (file_exists($cacheFile))
    {
        $cache = unserialize(file_get_contents($cacheFile));
        if (empty($cache)) $cache = $inputFile;
    }
    else
    {
        $cache = $inputFile;
    }

    // compile less
    $less = new lessc;
    $newCache = $less->cachedCompile($cache);

    // save less cache
    $saveCache = $newCache;

    // search media query in CSS
    preg_match_all('#@media(.*?)\{(.+?}[ \n])\}#si',$newCache['compiled'],$match,PREG_SET_ORDER);//$MatchingString now hold all strings matching $pattern.


    $media = array();

    // group same media query
    foreach ($match as $val)
    {
        if (!isset($media[$val[1]])) $media[$val[1]] = '';

        $media[$val[1]] .= $val[2];
    }

    // delete media query of cache
    $newCache['compiled'] = preg_replace('#@media(.*?)\{(.+?}[ \n])\}#si', '', $newCache['compiled']);

    // add groups of media query at the end of CSS
    $final = $newCache['compiled'] . "\n";
    foreach ($media as $id => $val)
    {
        $final .= "\n" . '@media' . $id . '{' . $val . '}' . "\n";
    }

    // save less
    // save CSS with groups of media query
    if (!is_array($cache) || $newCache["updated"] > $cache["updated"]) 
    {
        file_put_contents($cacheFile, serialize($saveCache));
        // file_put_contents($outputFile, $newCache['compiled']);
        file_put_contents($outputFile, $final);
    }
}

// use of function
autoCompileLess('style.less', 'style.css');
于 2013-08-12T16:24:06.630 に答える
0

期待される出力のように、メディアクエリにもセレクターを持たないのはなぜですか? 次に、行うすべてのメディアクエリを二重にする必要がなくなります...

于 2012-09-02T19:10:29.690 に答える