当人们被问及他们想要在 CSS 中添加哪些功能时,“变量”总是会出现在答案中。 这是否是一个好主意,我个人还没有决定,但我倾向于认为是。 无论如何,使用 PHP,在 CSS 中使用变量轻而易举。 这当然不是一个新技巧,但我从未专门介绍过它,所以我认为我应该介绍一下。
Style.php
不要使用 .css 文件扩展名,而要使用 .php
<link rel='stylesheet' type='text/css' href='css/style.php' />
Content-type
在新的 style.php 文件的顶部,将 Content-type 设置回 CSS
<?php
header("Content-type: text/css; charset: UTF-8");
?>
设置变量
现在您可以为任何您喜欢的元素设置变量
<?php
header("Content-type: text/css; charset: UTF-8");
$brandColor = "#990000";
$linkColor = "#555555";
$CDNURL = "http://cdn.blahblah.net";
?>
使用变量
在所有 PHP 代码之后,您可以开始编写普通的 CSS,只是您可以混合一些 PHP 来输出这些变量。
#header {
background: url("<?php echo $CDNURL; ?>/images/header-bg.png") no-repeat;
}
a {
color: <?php echo $linkColor; ?>;
}
...
ul#main-nav li a {
color: <?php echo $linkColor; ?>;
}
扩展功能/其他想法
- 在您进行这些操作的同时,也可以使用 PHP 压缩 CSS。
- 理论上,您可以提取用户代理并尝试执行特定于浏览器的 CSS,但这样做会遇到很多问题,不建议使用。
- 提取日期/时间,并可能为不同的季节或一天中的不同时间更改网站上的某些内容。
- 生成一个随机数,测试结果,使用它为您的页眉设置一个随机背景图像。
无法正常工作?
我创建了一个完全静态的测试页面,它运行良好,然后我在 WordPress 网站中尝试了相同的技术,但没有成功。 对我来说,解决方案是将文件命名为 style.css,并使用 .htaccess 将其解析为 PHP。 只需确保此代码位于与 CSS 文件相同的目录级别的 .htaccess 文件(仅限 Apache 服务器)中。 然后,像使用任何其他 PHP 文件一样,在其中使用 PHP。
<FilesMatch "^.*?style.*?$">
SetHandler php5-script
</FilesMatch>
Carlo DeAgazio 写信说,这对他来说在 WordPress 中有效。
<?php
$absolute_path = explode('wp-content', $_SERVER['SCRIPT_FILENAME']);
$wp_load = $absolute_path[0] . 'wp-load.php';
require_once($wp_load);
/**
Do stuff like connect to WP database and grab user set values
*/
header('Content-type: text/css');
header('Cache-control: must-revalidate');
?>
嘿,Chris,我前几天玩过这个想法,但没有时间深入研究它。 我有一个问题:你能告诉我一些关于性能的信息吗? 我想它比纯 CSS 样式表慢,但它慢得多,还是你甚至感觉不到差别?
感谢你的时间,以及这篇非常有趣的文章。
非常有趣的想法。 我可以预见它在像我现在工作这样的企业环境中非常有用。 如果公司品牌有新的方向,更改颜色/字体将变得容易。
看起来非常有趣,感谢 Chris。 我想我会很快自己尝试一下!
@Martin
没有理由它应该比纯 CSS 慢:当 CSS 从服务器传递到客户端时,它已经变成了纯 CSS。
不要忘记,任何 PHP 代码都会在浏览器发生任何操作之前在服务器上执行。
如果您的代码非常复杂,您可能会注意到性能方面的一些缺点,因为它需要一些时间才能让服务器执行脚本。 但是我完全看不到这种情况在这种方法中发生。
我的 2 美分
我确信会有某种代价,因为服务器必须处理它,然后传递它,而不是直接传递它——但我们在这里讨论的是微秒级。
当我使用这种方法时,它并没有比纯 CSS 明显慢。
感谢你们的回答,O 和 LineIn。 你们写的东西似乎非常连贯,所以我想这只是一个试一试的问题!
实际上存在性能问题。 据我所知,这些 PHP 解析的样式表不会被客户端缓存。 因此,样式表每次被客户端调用时都会被处理。
如果我错了,请纠正我。
您可能可以在 php 中设置一个“expires”标头,但我对 HTTP 并不了解。 有什么想法吗?
实际上您不需要解决缓存问题。 由于您在脚本中没有真正执行任何动态操作,因此您只需在 mac/linux 上从命令行运行以下命令:
php myStyles.php > myStyles.css
然后链接我们刚刚生成的 css 文件。 您每次更改它时都需要重新编译 css 文件,因此它只在您完成测试后才真正有用。
存在一些主要的性能问题。 您不应该使用 PHP 或任何应用程序层逻辑在运行时生成静态内容。 我在这里详细介绍了所有性能问题
http://bit.ly/4suKSp
另一种方法是将样式直接嵌入文档中,并让 php 在那里回显变量,虽然这种方法不太有效。 这种方法的一个更有用的变体是将其应用于 JavaScript。 我曾经在必须使用 JS 生成的 CSS 定位元素时使用过这种方法,而定位依赖于 php 表单的提交。
我想要使用 CSS 变量的最大原因是类继承。 例如,对于精灵。
.sprite {
background-url…
text-indent…
}
.header extends .sprite
.header {
background-position…
}
.submit extends .sprite
.submit {
background-position…
}
这可以让我们不必写诸如
input class=”sprite submit” 以及在 HTML 中使用类名。
我希望能看到使用这种方法实现类似的功能。
Nicole Sullivan 在这里深入讨论了这个问题:http://www.stubbornella.org/content/2009/11/09/css-wish-list/
您应该查看 oocss 的 github 项目页面 (http://github.com/stubbornella/oocss)。
您可以在那里找到很多面向对象的 CSS 代码,可以使用“input class=”sprite submit””这样的方式。
每个人都知道这不是最好的方法,但它实际上是一个应该被纳入 CSS 规范的概念。
当然,该项目对任何类型的贡献(想法、评论、代码等)都是开放的。
嗯,确实存在“面向对象 CSS”,但我不确定它是否允许继承(虽然我认为它应该可以)。 我需要学习一下它。 哎,这些技术发展得太快了。 我刚学会 CSS 2.0,新的 CSS 版本就出现了,比如 CSS 3.0 和面向对象 CSS :P
您还可以使用 Scaffold 之类的东西来实现这一点,它还带来了许多其他好处(缓存、嵌套选择器、压缩等)。
如果我要走这条路,我会使用 Scaffold。我试过它了,但不幸的是它在我的 WAMP 设置上不起作用。
那就用 LAMP 吧。有人真的用 WAMP 来进行严肃的生产托管吗?
Chris,
既然你是 WordPress 专家,我想问问。有没有简单的方法可以把它整合到 WordPress 主题中?
很多时候,当我出售主题时,我会收到一些不懂 CSS 的人要求更改颜色等。如果他们只需要更改顶部的几个变量,那就很容易解释。
我一直不明白为什么人们如此渴望这种增强功能,因为这种功能已经存在。难道你不能使用伪变量,并能够指定多个类吗?
Sweet
Sweetness
这意味着你必须在 HTML 中定义样式。我不会解释为什么这样做不好,谷歌知道 ;)
这正是我要发布的内容。我发现它非常方便,可以快速创建 div,例如
div class=”w500px h200px float-l bgcolor1 textcolor3 font1″
我不明白为什么这比给一个元素一个 id 并为它创建一个样式块更糟糕或更重。当我玩这个的时候,我能够用更少的代码做更多的事情,因为你可以声明一堆特定于设计的变量,然后很容易地将它们应用到任何你想要的元素。它还与 jQuery 的 addClass 和 toggleClass 配合良好。不过,我想知道这种方法的缺点。显然,当使用动态生成的內容时,事情会变得更加棘手。我注意到 Facebook 在他们的标记中使用了大量的这些描述符类。
WordPress 主题 Mandigo 使用了这种技术。样式表是 style.css.php。有趣的主题,但这使得难以在代码级别修改主题。最终用户可以使用管理主题选项获得相当多的控制权。
哦。有趣。我认为,如果用户可以在管理面板中设置颜色代码,那将是一个很大的吸引力。
谢谢 Chris。这将非常有用。我会尝试在我的未来项目中进行实验。
如果你要给项目增加这种额外的开销,我想 csscaffold 可以很好地完成这项工作。
我同意这一点。感谢你指出这一点。
我将 style.php 与来自 http://www.eyecon.ro 的一个很棒的 js 颜色选择器插件一起使用,以创建一些很酷的 WP 管理界面选项 - 你可以轻松地为用户提供一个 js 颜色轮盘!
我遇到的唯一问题是,你必须在 style.php 的顶部调用 wp_config.php 文件,才能访问所有 WP 函数/数据库选项。
当然,另一个缺点是,一些代码编辑器(Dreamweaver)无法正确地对其进行颜色编码,这可能会让它一开始看起来有点令人困惑。
好文章!
对于那些好奇为什么 style.php 在 WordPress 中无法工作的人
实际上,WordPress 对此没有问题。在 WordPress 中使用 PHP 编写 CSS 与正常文件一样,没有问题。
但是,由于大多数主题使用快速标记:”get_bloginfo(‘stylesheet_url’)”,因此它必须是 style.css,因为 bloginfo-thing 正在寻找 style.css。
或者
* 将 style.css 重定向到 style.php;
* 或者重写它;
* 或者创建一个空的 style.css 并 @include style.php
* 或者将其命名为 style.css,并通过 .htaccess 使服务器将其解释为 php (<– 推荐的,最终也是最干净的方式)
—
TeMc
@TeMc,
我同意 #4 是最干净的,但如果你正在出售主题,你可能会遇到一些人遇到问题。例如,一些共享主机不允许使用 .htaccess。可能很少,但仍然可能是一个问题。
我还没有尝试过,但我想知道你是否可以挂接到 get_bloginfo 并将 style.css 更改为 style.php。
第五个选项
编辑主题标题并更改
为
/style.php
我认为这比让用户无故地去修改 .htaccess 文件更干净。
当然,这只是我的观点。
该死!过滤了我的 php
应该是
改变
get_bloginfo(‘stylesheet_url’)
为
get_bloginfo(‘stylesheet_directory’)/style.php
是的,或者可能是这样的
get_bloginfo('stylesheet_url').php
并使用 style.css.php。我需要以后尝试这些选项。WordPress 从 style.css 中提取主题信息,所以你必须有一个单独的 style.css 其中包含这些信息,或者也许使用 style.css.php 仍然可以工作,这就是 Mandigo 的做法。
哦,不错。我从未想过这一点 - 现在我已经测试过了,效果很好。
不错,Tim!
当然,你仍然需要一个 style.css 文件,因为如果没有它,WordPress 主题将无效。
…这正是你刚才所说的话。
我把这个放在 ccs/php 文件的顶部
ob_start (“ob_gzhandler”);
header(“Content-type: text/css; charset: UTF-8”);
header(“Cache-Control: must-revalidate”);
$offset = 60 * 60 ;
$ExpStr = “Expires: ” . gmdate(“D, d M Y H:i:s”, time() + $offset) . ” GMT”;
header($ExpStr);
我把这个放在 css/php 文件的顶部
ob_start ("ob_gzhandler");
header("Content-type: text/css; charset: UTF-8");
header("Cache-Control: must-revalidate");
$offset = 60 * 60 ;
$ExpStr = "Expires: " . gmdate("D, d M Y H:i:s", time() + $offset) . " GMT";
header($ExpStr);
;
可以缩短为
几乎所有 php 安装都支持这种方式
看起来“使用变量”部分下有一个错别字。在第一个代码块中,php 开启标签写的是“<php”。刚刚注意到。无论如何,这篇文章对人们来说绝对是有价值的。感谢你发布它。
来自 Bigspaceship 的人创建了 Rosemary,它可以完成上面列出的所有操作。
还有其他解决方案,如 LESS(非常酷的功能和语法)、Sass 等等…
干杯。
由于某种原因,LESS 链接在上一条评论中不起作用。它是 https://lesscss.org.cn/
我刚刚写了一篇关于使用 <a href="http://wordpresstheming.com/2009/12/dynamic-css-theme-options/"dynamic 样式表和 WordPress 的文章。它涉及从主题选项页面将变量传递到带有 css 内容类型标题的 php 文件。
查看一下:http://wordpresstheming.com/2009/12/dynamic-css-theme-options/
嗨 Devin,看起来那页现在不见了。你还有关于这个的教程吗?我很想看看!
谢谢!
嗨,我对 php 不太了解,所以我并不真正理解这样做而不是直接更改 css 的好处。
有人能解释一下吗?因为我喜欢这个概念,但我对 php 不够精通,现在还无法理解它的好处。
我也会非常感谢。
谢谢
好处是你可以编辑一个在多个位置/文件中使用的单个变量。
例如,如果你想使用一个特定颜色,比如 #FF0(在本例中是亮黄色),但你不想编辑 CSS 文件中的每个实例,你可以在一个名为‘css_config.php’ 的文件中创建一个这样的变量
$spotColor = ‘#FF0’;
你的每个 CSS 文件都可以包含主配置变量,如下所示
require_once(‘css_config.php’);
通过将 CSS 文件指定为 css_styles.php 并将其输出“伪造”为 text/css 内容类型,那么对于浏览器来说,就好像你调用了一个具有 PHP 能力的普通 .css 文件一样。
顺便说一下,另一个帮助缩短和使你的 PHP 代码更不容易被察觉的技巧是
希望这有帮助…
太棒了!
非常感谢你的解释,我现在明白了。对于拥有大量不同页面和部分的大型网站来说,这是一个好主意。
很好,兄弟,我感谢你的帮助。
这很酷…… 但是……
如果你销售主题,这是一个不好的做法。买家将无法访问 WordPress 的“编辑器”选项,这是一个主要的阻碍因素。
此外,语法高亮对 CSS 不起作用,这使得管理大型文件非常麻烦。
如果这是你的个人主题,那就去吧!:-)
可以考虑使用 Compass @ http://wiki.github.com/chriseppstein/compass – 基于 SASS (https://sass-lang.com.cn/)
啊,我的帖子没有成功。
我想发布
?=$var;?
(在尖括号之间)
不建议在 PHP 中使用短标签 – 可能会与 xml 开启标签冲突。
此外,一些服务器已关闭短标签,因此,如果您正在分发代码,则在主题等中使用它可能会遇到可避免的兼容性问题。
Si
这种方法的主要缺点是缓存。
通常,CSS 是一个很少更改的文件,因此趋势是将其进行大量缓存,以避免来自客户端的请求。
PHP 文件默认情况下不会被缓存,因此每次访问都会发出请求。你应该使用“header”函数从代码中设置缓存头,或者告诉你的 HTTP 服务器如何执行。
不过,很棒的教程!
你们想得太复杂了。创建加载模板信息的 style.css 文件,但不要在你的 html WordPress 主题标题中加载它。
只需将 style.php 加入队列即可。
不过,性能很差,因为服务器仍然解析 style.php 文件,即使它为空。
我希望它更像这样
我还没有用变量取得成功。CSS 需要跟上 OOP。这绝对可以为我们所有人节省大量时间。
如果你有一个比较繁忙的网站,实现某种缓存功能将非常方便。
这太棒了,我以前根本不知道可以这样做。
+1 for Scaffold
我从未在 CSS 中错过变量…… 并且设置所有这些东西并输入所有 -php- echo ‘blah’; -php- 东西似乎效率不足,甚至没有尝试过。
我的意思是 color:#535353 比 -php- echo $textcolor -php- 短得多,这到底让编写 CSS 好在哪里/更短/更容易?
使用此方法的主要原因有两个。
1.) 在大型网站上跨多个框架/包含文件编辑单个变量。
2.) 通过将变量放在可编辑的管理区域中,能够将标记与值抽象出来,然后仅更新变量,而不允许非管理员触碰标记本身。
这只是几个在实际应用中的例子。
嗨 Norman – 我是 CSS 新手,但感觉变量对我很有用。我有一个早期阶段的网站/webapp,它将有相当数量的内部链接。由于这篇文章,我使用此方法为所有链接创建变量。随着我的文件结构的演变和/或更改,我只需更新每个链接变量一次,而不是在所有页面上查找该链接的每个实例。
虽然可能存在我意识不到的缺点。
感谢这篇文章。就像我的前一位发言者一样,我并没有错过 CSS 中的变量。在索引中找到 php、html、css 和 javascript 不够吗?应该在 css 中使用 php 吗?什么时候应该在 javascript 中使用 php 来编写 html 中的 css?
我在我的 javascript 和 CSS 中使用 PHP,这样我就可以让用户从友好的界面轻松更改变量。
例如,用户可以使用管理界面中的友好色轮更改颜色,而无需担心编辑原始 CSS(并可能破坏网站)。
这一切都是为了用户体验!
你们应该看看 xCSS,它不是特别有名,但它真的很强大,如果你在配置中告诉它,它甚至可以压缩 CSS。
同意
你能使用 <a href="https://php.ac.cn/manual/en/language.types.string.php#language.types.string.syntax.heredoc"heredoc 语法吗?这样你就不必跳到 PHP 中来输出变量,你可以直接说 background-color:$brandcolor;。
我的意思是 heredoc 语法 :P
好主意…… 你可以在 HEREDOC 中包裹整个文件底部(CSS 部分),并以这种方式执行。
这就是我过去一直使用的方法。效果很好。如果你使用的是 textmate,把它放到 CSS 模式,它仍然可以正确地突出显示语法。
请注意性能问题,如果你使用此解决方案,要么使用“Expires”头来允许客户端缓存(好),要么在将其作为普通静态 CSS 文件提供之前,在服务器端预先解析文件(更好)。
你不想让客户端在*每个*页面上重新下载并重新解析所有 CSS……
这非常有用,除非你在 css 中执行了一些极端的 php 操作(不应该这样做),否则性能应该不是问题。
只要确保 GZIP,并压缩或以单行代码编写即可。
这当然非常酷,并且可以成为一个真正强大的工具,但我不会在生产网站上使用任何 PHP 脚本。它只是一个额外的瓶颈。你应该改用 PHP 生成一个静态文件,并将其作为你的样式表链接。
这是一个开始,但如果不使用缓存,可能会对你的服务器造成负面影响。
如果你要走这条路,使用像 Scaffold 这样的东西,但我可能有点偏见 :)
@Logan 如果你在处理完文件后对其进行缓存,这根本不坏。
很棒的概念!
你知道 CSS 会不会永远支持变量吗?
“烘焙而不是油炸”
除非有非常、非常充分的理由需要动态生成 CSS,否则应该在构建时而不是运行时生成它。
提供静态响应比提供动态响应快得多,并且对服务器的负载更小,静态响应也更容易迁移到 CDN
其他人提到了设置缓存头和压缩,但不要忘记缩小。
Andy
你好,我是你的粉丝,但为什么如果要输入 #555,输入起来就很容易呢?
ul#main-nav li a {
color: ;
}
ul#main-nav li a {
color: #555;
}
我很好奇为什么使用的人这么少,而不是。它使代码更具可读性,我知道如果我将来使用它遇到问题,我可以简单地进行全局搜索和替换。
很棒的技巧,谢谢克里斯。
要使用WordPress函数在文件中,使用第一种方法时,将此添加到customstyle.php(您的PHP样式表)中
谢谢!
@Arun Basil,这并不能完全奏效。如果wp在不同的目录中怎么办?文档根目录将是htdocs或public_html,而不是实际的wp目录。为了便携性,我建议使用本教程中使用的示例。
刚刚拯救了我。谢谢!
为了记录,我在WordPress 3.8.1中成功实现了这一点,无需Apache mod或wp_load修改。
非常感谢您发布这些内容!
我现在才开始使用它。
@Scott Russell,您是否使用wp_register/wp_enqueue_style加载style.php文件?