問題描述
[這與 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 腳本類型下的三個上下文:
-
其中 metadata content 是預期的。
-
其中 phrasing content 是預期的。
-
其中 script-supporting elements 是預期的。
style tag 在 HTML5 腳本類型下有一個稍微複雜的 context-structure:
-
如果 scoped attribute 不存在:其中 metadata content 是預期的。
-
如果 scoped attribute 不存在:在作為 head 元素的子對象的 noscript 元素中。
-
如果存在 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 元素中。
第四種方案
身體風格的兩個可能的答案:
-
使用內聯樣式。誠然,您將失去內部和外部樣式的優點,但如果您無法訪問該標題,則無法訪問該標題。
-
在樣式元素中使用範圍屬性。這是 HTML5 的新手,但是想法是將 CSS 的範圍限制在一個頁面的一部分,例如到一個 div 。不幸的是,它尚未得到支持 (截至 2011 年 7 月),也不向後兼容。但是 (據稱) 有一個可以幫助的 JQuery 插件。更多信息:
第五種方案
那麼你有直接嵌入樣式和腳本到你的內容的問題。這裏的主要咒語是 「幹」(Do not Repeat Yourself) 原則。您可以在多個地方使用腳本或特定風格。當這種風格或腳本需要修改時,您現在可以對該代碼存在的所有地方進行清道夫搜尋。將您的風格和腳本保持在一個共同的地方是理想的。
另一方面,如果它是一個小小的風格問題 (像素推動或者與一個視圖相關的東西),那可能還行。
參考文獻
注:本文內容整合自 Google/Baidu/Bing 輔助翻譯的英文資料結果。如果您對結果不滿意,可以加入我們改善翻譯效果:薇曉朵技術論壇。