Группировать несколько медиазапросов, сформированных как вывод LESS CSS

Я планировал использовать LESS CSS в своем проекте (PHP). Я планирую использовать его вложенный @media функция запроса. Я обнаружил, что он не может сгруппировать несколько медиа-запросов в выходной CSS, который он генерирует.

Например:

// МЕНЬШЕ.header {
  @media all and (минимальная ширина: 240 пикселей) и (максимальная ширина: 319 пикселей) {
    размер шрифта: 12 пикселей;
  }

  @media all and (минимальная ширина: 320 пикселей) и (максимальная ширина: 479 пикселей) {
    размер шрифта: 16 пикселей;
    вес шрифта: полужирный;
  }
}
.body {
  @media all and (минимальная ширина: 240 пикселей) и (максимальная ширина: 319 пикселей) {
    размер шрифта: 10 пикселей;
  }

  @media all and (минимальная ширина: 320 пикселей) и (максимальная ширина: 479 пикселей) {
    размер шрифта: 12 пикселей;
  }
}

// выводим CSS
@media all and (минимальная ширина: 240 пикселей) и (максимальная ширина: 319 пикселей) {.header {
    размер шрифта: 12 пикселей;
  }
}
@media all and (минимальная ширина: 320 пикселей) и (максимальная ширина: 479 пикселей) {.header {
    размер шрифта: 16 пикселей;
    вес шрифта: полужирный;
  }
}
@media all and (минимальная ширина: 240 пикселей) и (максимальная ширина: 319 пикселей) {
  .body {
    размер шрифта: 10 пикселей;
  }
}
@media all and (минимальная ширина: 320 пикселей) и (максимальная ширина: 479 пикселей) {
  .body {
    размер шрифта: 12 пикселей;
  }
}

Мой ожидаемый результат (@media запросы сгруппированы)

@media all and (минимальная ширина: 240 пикселей) и (максимальная ширина: 319 пикселей) {.header {
    размер шрифта: 12 пикселей;
  }
  .body {
    размер шрифта: 10 пикселей;
  }
}
@media all and (минимальная ширина: 320 пикселей) и (максимальная ширина: 479 пикселей) {.header {
    размер шрифта: 16 пикселей;
    вес шрифта: полужирный;
  }
  .body {
    размер шрифта: 12 пикселей;
  }
}

Я хотел бы знать, может ли это быть сделано в LESS (PHP) самостоятельно или есть какой-нибудь простой синтаксический анализатор CSS на основе PHP, который я могу использовать для управления выходным CSS для группировки и объединения запросов @media. как показано на рисунке ниже.

  МЕНЬШИЙ файл
      |
      В
[LESSphp компилятор]
      |
      В
   Файл CSS
      |
      В
Сгенерированный файл CSS
будет проходить мой сценарий
написанный с использованием CSS-парсера
      |
      В
   Файл CSS
с похожими @media
группироваться.

В случае, если выполнение сгруппированных запросов @media в LESS (PHP) не вариант, я хотел бы узнать ваши предложения по синтаксическому анализатору CSS (PHP), которые можно использовать в приведенном выше потоке.

2 ответа

Я адаптирую функцию autoCompileLess для группирования медиазапроса в конце CSS без изменения кода.

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

Компилировать с меньшим по умолчанию

.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');

Почему в ваших медиа-запросах нет ваших селекторов, например, ожидаемого результата? Тогда вы избавитесь от двойных медиазапросов для всего, что вы делаете...

Другие вопросы по тегам