是否有 CSS 优化器可以发现选择器中相同的单个属性并将它们分组在一起?

问题描述 投票:0回答:2

这是我期望的示例:

输入:

a {
    background: red;    
}

p {
    background: red;    
}

strong {
    background: red;
    color: green;
}

输出:

strong{color:green;}
a,p,strong{background:red;}

大多数优化器会输出如下内容:

strong{background:red;color:green;}
a,p{background:red;}

请注意,它没有注意到

strong
虽然包含
color: green;
,但也包含
background: red;
,因此它可以与其他组合在一起?

您能提供的任何帮助将不胜感激

祝一切顺利

伊恩

php css optimization css-selectors utilities
2个回答
2
投票

也许 CSSTidy 可以提供帮助。

如果你看一下“之前”的CSS,你会看到这部分代码:

a:hover{
    color: #DD6900;
}

a.admin:hover,a.mod:hover{
    color: #DD6900;
}

CSS“after”中,你会得到:

a:hover,a.admin:hover,a.mod:hover,a.topictitle:hover {
color:#DD6900
}

不确定它会处理所有可能的情况——但在某些情况下,它似乎正在按照你的要求做;-)


0
投票

好吧,看来我所追求的东西要么不存在,要么很难实现,所以我编写了一个脚本来解决我的特定问题。我将其粘贴在这里,希望有人有一天会发现它有用。

<?php

$css = file_get_contents('test.css');

//Strip comments and whitespace. Tabs to spaces
$css = preg_replace("/\s{2,}/e", ' ', $css);
$css = preg_replace("/\/\*.*?\*\//", '', $css);
$css = str_replace("\t", " ", $css);
$css = str_replace(": ", ":", $css);
$css = str_replace(" }", "}", $css);
$css = str_replace("{", "{", $css);
$css = str_replace(";}", "}", $css);

//Break each rule out onto a new line
$css = preg_replace("/}\s*/", "}\r\n", $css);

//Break @ rules out onto new lines
$css = preg_replace('/(@.*?;\s*)/', '\0'."\r\n", $css);


//Parse CSS Rules
$parsed = array();
$css = explode("\r\n", $css);
foreach($css as $line => $rule){
    if (preg_match('/(.*?)\{(.*?)\}/i', $rule, $regs)) {
        $clean_selectors =  preg_replace('/\s*,\s*/', ',', $regs[1]);
        $clean_selectors =  preg_replace('/,\s*$|\s$/', '', $clean_selectors);
        $parsed[$line]['selectors'] = explode(',', $clean_selectors);
        $parsed[$line]['properties'] = explode(';', $regs[2]);
    } elseif(trim($rule) != '') {
        $parsed[$line] = $rule;
    }   
}

//Group CSS by property
$groups =  array();
foreach($parsed as $line => $css){
    if(is_array($css)){
        foreach($css['properties'] as $pline => $property){
            if(isset($groups[$property])){
                $groups[$property] = array_merge($groups[$property], $css['selectors']);
            } else {
                $groups[$property] = $css['selectors'];
            }

        }
    } else {
        $groups[$line] = $css;  
    }
}

//Output CSS sorted by property
foreach($groups as $property => $selectors){
    if(is_array($selectors)){
        asort($selectors);
        echo implode(",\r\n", $selectors)." {\r\n\t".trim($property).";\r\n}\r\n\r\n";
    } else {
        echo $selectors."\r\n\r\n"; 
    }
}

?>

现在,有几点注意事项。

  1. 不,这不是世界上最漂亮的代码,它很快就解决了我曾经遇到的一个特定问题,并且它非常适合我使用的 CSS。也就是说,它应该足够通用,可以与您使用的大多数 CSS 一起使用。

  2. CSS 的本质是有时规则出现的顺序对于最终文档的呈现很重要。如果您只是通过此脚本运行所有 CSS,您的页面可能不会再按照您的预期呈现。我只是使用此脚本对我无法控制布局的 Web 应用程序上特定于页面的 css 进行分组。由于每个规则都适用于特定页面上的特定元素,因此当我以这种方式分组时,我并不期望出现大量的狡猾行为 - 它只会使 CSS 更易于维护。

© www.soinside.com 2019 - 2024. All rights reserved.