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正确突出显示语法。
还有其他缺点吗? 您是否使用过这种方法,如果是这样,您会推荐它吗?
答案 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