【问题标题】:What is the best way to include a style sheet for a specific page?为特定页面包含样式表的最佳方式是什么?
【发布时间】:2011-02-18 07:52:57
【问题描述】:

感谢您的观看。

我的网站使用 PHP 为每个页面包含相同的页眉和页脚。

我想要一个仅适用于特定页面的样式表,因此请使用适当的标签放置样式。

...<body><style type="text/css"> /* what ever */ </style></body>...

样式表在我测试的所有浏览器中都得到了正确处理,但是 W3C 没有正确验证它,因为它位于 body 标记内而不是 head 内。

我的问题是:
如果我不能将样式表放在 body 标记中,包含它的最佳方法是什么?我可以在 PHP 标头中引用样式表,但我宁愿不要对这么小的文件有另一个 HTTP 请求。你会怎么做?什么是最不马虎的方法?虽然样式标签不应该在

中,但它仍然被浏览器正确处理。

【问题讨论】:

  • 我想我可能会感到困惑,但是...为什么要在 PHP 标头中引用样式表?
  • 如果你把你所有的css放在一个外部文件中并使其可缓存,那么用户只需要下载一次,不管他们下载了多少页,下载了多少次。
  • @some 不会阻止另一个 HTTP 请求的发生。它仍然请求它并以 304 的形式发回,而不是修改
  • 您的 PHP 脚本的结构是什么,它们是如何相互包含/引用的?这将对提出最实用的解决方案产生重大影响。
  • @Petah:你试过设置正确的缓存头吗?例如,看一下 Goggles 的第一页。使用 firebug 您可以看到它发出 6 个 HTTP 请求(在强制重新加载或清空缓存时)。然后点击地址栏并按回车,它只做两个。例如 ps_logo2.png 没有被第二次检索,因为它已经在浏览器缓存中。

标签: php html css stylesheet


【解决方案1】:

如果给 body 一个 id,然后只在通用 CSS 中包含页面特定文件,但样式以 id 选择器为前缀,该怎么办?像这样的:

在页面上

<body id="pageSpecificId">......</body>

在 CSS 文件中:

#pageSpecificId p {
   ... paragraph specific styles ...
}

#pageSpecificId li {
   ... list item specific styles ...
}

【讨论】:

  • 这是假设body标签不包含在他的页眉/页脚中
  • 好吧,body 标签在代码示例中,但你是对的,我确实做了这个假设。
  • @Petah 你是对的,body 标签在我的标题中。谢谢大家的回答,大家!这是我在 Stack Overflow 上的第一个问题。
  • @Nathan 将 body 标签放在头文件中是一个非常不明智的选择。请重新考虑您使用包含文件的方式:@Dante617 提到的方法更加灵活和可扩展跨度>
  • @Lucius 在每个页面的开头包含两个单独的标题会更好吗?一个在 HTML 之前执行的 PHP 代码的标头,另一个包含页面布局的标头?
【解决方案2】:

最好的方法是使用一个 MVC 框架来缓冲你的视图文件,并允许标签在输出之前动态添加到头部。

这是一个非常简单的方法:

index.php:

<?php
class Page {
    private static $head = array();
    private static $content = '';
    static function add_head($tag) {
        self::$head[] = $tag;
    }
    static function render_head() {
        foreach (self::$head as $tag) echo $tag;
    }
    static function render_content() {
        echo self::$content;
    }
    static function read_content($file) {
        ob_start();
        require $file;
        self::$content = ob_get_clean();
    }
    static function render_layout($file) {
        require $file;
    }
}

Page::read_content('view.php');
Page::render_layout('layout.php');
?>

layout.php:

<html>
    <head><?php Page::render_head(); ?></head>
    <body>
        <div id="header"></div>

        <div id="content"><?php Page::render_content(); ?></div>

        <div id="footer"></div>
    </body>
</html>

view.php:

<?php Page::add_head('<title>Hello World!</title>'); ?>
<h1>Hello</h1>
<p>World</p>

【讨论】:

  • 谢谢,我以前没听说过这个。看来我得读书了。这应该可以工作,因为我的网站仍处于早期开发阶段。
猜你喜欢
  • 1970-01-01
  • 2020-08-09
  • 2013-10-15
  • 2011-06-18
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多