使用PHP在我的CSS样式表中创建变量有什么缺点?

时间:2010-06-01 01:42:31

标签: php css

CSS的一个重要缺点是无法使用变量。例如,我想使用变量来控制导入的CSS的位置,为设计中重复使用的颜色创建变量会很棒。

一种方法是将CSS文件用于CSS样式表。换句话说,用...创建“style.php”。

<?php header("Content-type: text/css"); ?>

...在文件的顶部,然后使用...

链接到它

<link href="style.php" rel="stylesheet" type="text/css" />

...在任何使用这些样式的文件中。

那捕获的是什么?我认为它可能是性能 - 我在Firefox / Firebug中进行了一些快速实验,正如人们所预料的那样,CSS样式表被缓存,但PHP样式表却没有。所以我们要付出额外的GET价格。

另一个令人讨厌的事情是,TextMate没有为.php文件中的CSS正确突出显示语法。

还有其他缺点吗? 您是否使用过这种方法,如果是这样,您会推荐它吗?

4 个答案:

答案 0 :(得分:7)

性能几乎就是这样。这是一个好主意,但只有你缓存它。您可以发送浏览器标题以请求客户端非常好地缓存它,但如果性能有问题,您可以从开发一个系统中受益,通过该系统将启用PHP的样式表编译为vanilla CSS文件以正常运行。 / p>

但是,如果您打算手动滚动自己的编译系统,则可能需要查看SASS

答案 1 :(得分:2)

您仍然可以设置相应的HTTP标头,以指示浏览器缓存动态生成的CSS。您可能有兴趣查看以下Google代码文章,以便进一步阅读相关主题:

您还可以考虑从脚本生成静态CSS文件,然后从Web文档中包含该文件。这消除了实时预处理以及与此相关的任何性能问题,代价是在您更改CSS文件时必须“编译”它们。但是,如果您已经是minifying CSS或JavaScript,则只需将此额外步骤添加到构建过程中即可。

对于代码突出显示,您可能希望使用包含变量的普通CSS文件而不是硬编码常量。然后你的php预处理器可以加载CSS文件并用变量替换实际值。

答案 2 :(得分:1)

缺点是文件没有缓存(就像你指出的那样)以及服务器必须为EACH请求计算CSS文件的事实。

加载静态文件对于服务器几乎没有负担,因为它只是读取和转储文件,但对于PHP脚本,它必须为每个页面请求执行它,这可能会增加额外的开销。

您可能会将CSS缓存在内存或Memcache等中,但仅使用静态文件仍然不会有效。

为什么不在静态文件中定义大部分CSS,然后只是覆盖更改的特定样式?

答案 3 :(得分:0)

不完全是答案,但是对@Matchu答案的补充 这是一个代码sni [我几年前使用过,你可以从它开始玩作为基础来开发自己的客户端缓存规则方法。任何觉得自己可以改进的人都欢迎。

<?php

//functions to cache HTML output Or JS/CSS output from a PHP script

class ControlHtmlCache

{

    //Will cache output of a php script on the browser for the giver hours.

    //Do notice, this will not cahce from now until now+hours, but rather for a rounded time period in the time stamp

    //For example, If I send 4 it will refresh the cache at approx 3,7,11,15,19,23 (In the summer, it will be 4,8,12....)

    static function client_side_cache($hours)

    {

        //in the event a session start is used, I have to clean all the #$%# headers it sends to prevent caching

        header('Cache-Control: ',true);

        header("Pragma: ", true);

        header("Expires: ", true);



        //get the If-Modified-Since header in a unix time format

        $headers = getallheaders();

        if (isset($headers['If-Modified-Since']))

        {

            $modifiedSince = explode(';', $headers['If-Modified-Since']);

            $modifiedSince = strtotime($modifiedSince[0]);

        }

        else

        {

            $modifiedSince = 0;

        }



        //calculate the Last-Modified timestamp

        $current_time=time();

        $last_modified=($current_time)/($hours*3600);

        $last_modified=(int)$last_modified;

        $last_modified=$last_modified*$hours*3600;



        //check cache not expires

        if ($last_modified <= $modifiedSince)

        {

            header('HTTP/1.1 304 Not Modified');

            exit();

        }

        else //emit a new Last-Modified (either cache expired or page wasn'r cached

        {

            Header('Last-Modified: '.gmdate("D, d M Y H:i:s",$last_modified).' GMT ');

        }

    }

}//EOF class