我打算在我的项目中使用LESS css(PHP)。我打算使用它的嵌套@media
查询功能。我发现它无法将多个媒体查询分组到它生成的输出css中。
例如:
// LESS .header { @media all and (min-width: 240px) and (max-width: 319px) { font-size: 12px; } @media all and (min-width: 320px) and (max-width: 479px) { font-size: 16px; font-weight: bold; } } .body { @media all and (min-width: 240px) and (max-width: 319px) { font-size: 10px; } @media all and (min-width: 320px) and (max-width: 479px) { font-size: 12px; } } // output CSS @media all and (min-width: 240px) and (max-width: 319px) { .header { font-size: 12px; } } @media all and (min-width: 320px) and (max-width: 479px) { .header { font-size: 16px; font-weight: bold; } } @media all and (min-width: 240px) and (max-width: 319px) { .body { font-size: 10px; } } @media all and (min-width: 320px) and (max-width: 479px) { .body { font-size: 12px; } }
我的预期输出是(@media查询分组)
@media all and (min-width: 240px) and (max-width: 319px) { .header { font-size: 12px; } .body { font-size: 10px; } } @media all and (min-width: 320px) and (max-width: 479px) { .header { font-size: 16px; font-weight: bold; } .body { font-size: 12px; } }
我想知道它是否可以在LESS(PHP)中自行完成,或者是否有任何简单的基于PHP的CSS解析器,我可以使用它来操作输出CSS来分组和合并@media查询。如下面的流程所示。
LESS file | V [LESSphp compiler] | V CSS file | V The CSS file generated would undergo my script written using CSS parser | V CSS file with similar @media grouped.
如果在LESS(PHP)中实现分组的@media查询不是一个选项,我想知道您对CSS解析器(PHP)的建议,可以在上面的流程中使用。
答案 0 :(得分:4)
我将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');
答案 1 :(得分:0)
为什么你的媒体查询中没有选择器,就像预期的输出一样?那么你就可以摆脱对所做的一切进行双重媒体查询......