在下面我们将讨论Drupal是如何通过.info文件来处理样式表的.而在子页面中,我们将讨论更高级的功能,比如通过API添加样式表的功能.完全基于CSS的主题,其样式表的相关信息也可以放在这里.
有几点需要注意。每一个核心组建或者模块都将提供一个默认输出。包括文本标记和相应的样式表。(更多解释,可参看文本标记的覆写)。 由于Drupal的易扩展性,对于主题设计者来说,处理浏览器端的一切,将会是一个极大的负担。这些默认的输出,将会根据主题设计者的判断,作出修改。与主题函数和模板的覆写一样,内核和模块提供的样式表也可以被覆写。不要直接修改。所有的修改都应该放在你主题目录里。
注意:
- 注意,修改样式表时,首先要确保仅用了CSS优化。它位于"Administer > Site configuration > Performance"。如果启用了的话,你将看不到你对CSS所做的修改,除非你清空聚合到一块的样式表。修改完以后,你可以在启用它。
- .info文件被缓存了。所以样式表的添加或者删除都不会显示出来,直到你将缓存清空。(不要将它与主题注册表混淆了。)为了清空缓存,你可以这样:
- 点击位于"Administer > Site configuration > Performance"的清空(Clear)按钮
- 如果启用了devel区块的话(devel模块生成的),点击链接"Empty cache"。
- 简单的访问主题选择页面"Administer > Site building > Themes"。
添加样式表:
在默认情况下,如果你主题的.info文件中没有定义样式表的话,将会使用"style.css"文件。添加其它的样式表非常简单,只需要定义一个新的'stylesheets'键,媒体属性(media property)和样式表的名称。注意,定了了定制的样式表后,就不再加载默认的"style.css"了。如果你的主体需要使用它的话,你需要在info文件中明确声明它。
; Add a stylesheet for all media stylesheets[all][] = theStyle.css
; Add a stylesheets for screen and projector media stylesheets[screen, projector][] = theScreenProjectorStyle.css
; Add a stylesheet for print media stylesheets[print][] = thePrintStyle.css
一些注意点:
- 注意[]的使用,在[media]和“= styleName.css”之间,使用了[]。
- 这里定义的顺序,就是样式表在页首出现的顺序。
- 样式表可以出现在子目录下面,比如stylesheets[all][] = stylesheets/styleName.css.这样易于管理样式表。
覆写内核和模块的样式表:
为了覆写内核或者模块的样式表,可以在主题的.info文件中对其进行重定义。以"system-menus.css"为例。它位于"modules/system/system-menus.css"。使用下面的代码,将会忽略这个样式表,取而代之的是主题下面的拷贝。
stylesheets[all][] = system-menus.css
当覆写模块的样式表时,应该将样式表文件放在你的主题下面,路经和文件名一定要匹配。这样,就使用主题提供的样式表来替换默认的样式表了。
如果添加的样式表,在主题内部不存在的话,将会忽略内核或者模块的样式表。这个特性是在Drupal6.0中设计的,在Drupal 6.3中已被纠正。
一些注意点:
- 覆写一个核心CSS文件,将会阻止加载默认的"style.css"文件。当你需要这些默认文件时,一定要明确的对其进行定义。
- 覆写的样式表与原始样式表在媒体(media)类型上必须匹配。
- 样式表内部的所有链接元素必须正确。你需要多检查一下'url()'属性或者'@import'规则,以确保里面的资源确实存在。
- 样式表在页面头部的出现顺序将被修改。修改以后,将会产生相应的级联效应。
- 一些内核和模块的样式表是根据条件自动加载的。使用.info文件覆写将会使得这些文件将被永远调用。
- 如果在主题中的修改不是很重要的话,可以考虑使用CSS选择器来覆写样式表,而不是覆写整个文件。
覆写基主题的样式表:
下面的内容适用于子主题。为了在子主题中禁用基主题的一个样式表,你可以在.info文件中重定义样式表。这与覆写模块或者内核样式表的方式相同。
基主题和子主题必须包含这一项:
stylesheets[all][] = masterStyle.css
如果文件存在于子主题中的话,就使用这个文件,而如果忽略该文件的话,将会阻止加载它。