Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 为特定页面包含样式表的最佳方式是什么?_Php_Html_Css_Stylesheet - Fatal编程技术网

Php 为特定页面包含样式表的最佳方式是什么?

Php 为特定页面包含样式表的最佳方式是什么?,php,html,css,stylesheet,Php,Html,Css,Stylesheet,谢谢收看 我的网站使用PHP为每个页面提供相同的页眉和页脚 我想要一个只适用于特定页面的样式表,所以使用适当的标记将样式放入其中 ...<body><style type="text/css"> /* what ever */ </style></body>... ../*什么事。。。 我测试的所有浏览器都正确处理了样式表,但是W3C没有正确验证它,因为它位于body标记而不是head中 我的问题是: 如果我不能将样式表放在body标记中,那么

谢谢收看

我的网站使用PHP为每个页面提供相同的页眉和页脚

我想要一个只适用于特定页面的样式表,所以使用适当的标记将样式放入其中

...<body><style type="text/css"> /* what ever */ </style></body>...
../*什么事。。。
我测试的所有浏览器都正确处理了样式表,但是W3C没有正确验证它,因为它位于body标记而不是head中

我的问题是:

如果我不能将样式表放在body标记中,那么最好的方法是什么?我可以在PHP头中引用样式表,但我不希望对这样一个小文件有另一个HTTP请求。你会怎么做?最不草率的方法是什么?虽然样式标记不应该在中,但浏览器仍然可以正确处理它。

给主体一个id,然后只在常规CSS中包含特定于页面的文件,但样式的前缀是id选择器,怎么样?大概是这样的:

第页

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

最好的方法是使用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>

你好
世界


我想我可能会感到困惑,但是。。。为什么要在PHP标题中引用样式表?如果将所有css放在一个外部文件中并使其可缓存,则用户只需下载一次,而不管他们下载了多少页以及下载了多少次。@但有些不会阻止另一个HTTP请求的发生。它仍然请求它,并作为304返回,而不是修改。您的PHP脚本的结构是什么,它们如何相互包含/引用?在提出最实用的解决方案时,这将产生很大的不同。@Petah:你试过设置正确的缓存头吗?例如,看看护目镜的第一页。使用firebug,您可以看到它发出6个HTTP请求(强制重新加载或清空缓存)。然后单击地址字段并按enter键,它只生成两个。例如,ps_logo2.png已经在浏览器缓存中,因此没有第二次被检索到。这是假设
body
标记没有包含在他的页眉/页脚中。好的,body标记在代码示例中,但是你是对的,我做了这个假设。@Petah你是对的,body标记在我的页眉中。谢谢大家的回答!这是我关于堆栈溢出的第一个问题。@Nathan将body标记放在头文件中是一个不明智的选择。。请重新考虑您使用include文件的方式:@Dante617提到的方法更灵活、更安全scalable@Lucius在每页的开头包含两个单独的标题会更好吗?一个是在HTML之前执行的PHP代码的头,另一个是包含页面布局的头?谢谢,我以前没听说过这个。看来我得读点书了。这应该是可行的,因为我的网站仍处于早期开发阶段。
<?php Page::add_head('<title>Hello World!</title>'); ?>
<h1>Hello</h1>
<p>World</p>