問題描述

[這與 this question 相關,但不是因為它不是電子郵件。]

在許多情況下 – 特別是在使用 CMS 或其他人的框架時,嵌入< style> 標籤和< script> < body> 中的標籤比< head> 中的。這似乎在 IE6,IE7(Windows),Firefox 3.x 和 Safari(OS X) 中起作用。

嚴格來說,這是錯的嗎?如果是這樣,它可能會產生什麼負面後果呢?除了在一些客戶中被完全忽視外,

注意:很高興每個人都想談談 DRY 和集中風格。想象一下,我想在檔案中使用樣式標籤,因為它們不是全域性的,而且我沒有訪問 PER-PAGE 基礎上的頭。無論什麼原因,無論是基於 page-by-page,還是以 per-paragraph 為基礎的網站。我並不感興趣,很難跟蹤和改變。我擔心在身體中使用風格的可能後果。

你集中的中心的東西。一切都在中央樣式表中膨脹。

最佳解決方案

雖然規範明確地指定樣式標籤在 body 標籤中是不允許的,但 specs 並不重要。每個主要瀏覽器都支援樣式標籤,終端使用者可以看到您的網站。*儘管瀏覽器行業長期以來一直是更好的標準和標準支援的驅動力,但長期來看,一直以來,渲染破壞檔案以及可以。

引領 HTML5 規範工作的 Google 同時維護 google.com,它違反規範來儲存位元組,透過將引號從其屬性值中刪除,使用針對 CSS 規範的選擇器攻擊,包括沒有型別或語言的指令碼標記,並連結沒有型別的標籤。純粹主義者可能會爭辯網際網路上最常用的網站之一是違反規範,並且有嚴重錯誤的嚴重危險。或者,我們可以推測,沒有瀏覽器將進入流行的使用,不能渲染這樣廣泛使用的駭客的規格。

那麼問題更多的就是瀏覽器行業的發展方向,這也是更好的規範之一,也是盡力履行違反這些規範的網頁的意圖。我的打賭是風格標籤將繼續在身體工作很長時間。

*在撰寫本文時,Firefox 3+,IE6 +,Safari 2+,Chrome 12+中的 HTML5 指令碼型別支援了正文中的樣式標籤。支援可能會回到更遠的地方,但這些瀏覽器很少在網際網路上看到。

次佳解決方案

可以使用<script><style> 標籤的上下文取決於您使用的 doctype 。例如,我假設你使用的是 HTML5 的 doctype:

<!DOCTYPE html>

script tag 具有 HTML5 指令碼型別下的三個上下文:

  1. 其中 metadata content 是預期的。

  2. 其中 phrasing content 是預期的。

  3. 其中 script-supporting elements 是預期的。

style tag 在 HTML5 指令碼型別下有一個稍微複雜的 context-structure:

  1. 如果 scoped attribute 不存在:其中 metadata content 是預期的。

  2. 如果 scoped attribute 不存在:在作為 head 元素的子物件的 noscript 元素中。

  3. 如果存在 scoped attribute:其中 flow content 是預期的,但是除了 inter-element 空格和樣式元素之外的任何其他流內容,而不是其內容模型為透明的元素的子元素。

本質上,這表示您可以將樣式標籤和指令碼標籤放在正文中,因為正文是我們放置流內容的地方,並且表達內容。

一如以往,請參考您正在使用的 doctype 的規格。

第三種解決方案

簡短的答案:

  • STYLE 元素僅允許作為 HEAD 元素的子元素

  • 允許 SCRIPT 元素作為 HEAD 元素的子元素,BODY 元素以及 inline-level elements 允許的任何位置。


詳細答案:

STYLE 被定義為 head.misc:

<!ENTITY % head.misc "SCRIPT|STYLE|META|LINK|OBJECT" -- repeatable head elements -->

head.misc 的元素只允許作為 HEAD 元素的子元素。所以 STYLE 只能是 HEAD 元素的子代。

SCRIPT 被定義為 head.misc 和特殊的:

<!ENTITY % special
   "A | IMG | OBJECT | BR | SCRIPT | MAP | Q | SUB | SUP | SPAN | BDO">

特殊定義為 inline:

<!ENTITY % inline "#PCDATA | %fontstyle; | %phrase; | %special; | %formctrl;">

另外,SCRIPT 也可以是 BODY 元素的子代。所以 SCRIPT 允許在允許內聯的 HEAD 元素中。

第四種方案

身體風格的兩個可能的答案:

  1. 使用內聯樣式。誠然,您將失去內部和外部樣式的優點,但如果您無法訪問該標題,則無法訪問該標題。

  2. 在樣式元素中使用範圍屬性。這是 HTML5 的新手,但是想法是將 CSS 的範圍限制在一個頁面的一部分,例如到一個 div 。不幸的是,它尚未得到支援 (截至 2011 年 7 月),也不向後相容。但是 (據稱) 有一個可以幫助的 JQuery 外掛。更多資訊:

第五種方案

那麼你有直接嵌入樣式和指令碼到你的內容的問題。這裡的主要咒語是 「幹」(Do not Repeat Yourself) 原則。您可以在多個地方使用指令碼或特定風格。當這種風格或指令碼需要修改時,您現在可以對該程式碼存在的所有地方進行清道夫搜尋。將您的風格和指令碼保持在一個共同的地方是理想的。

另一方面,如果它是一個小小的風格問題 (畫素推動或者與一個檢視相關的東西),那可能還行。

參考文獻

注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇