首頁 web前端 css教學 CSS中的偽計算(或者如何瀏覽解析樣式)

CSS中的偽計算(或者如何瀏覽解析樣式)

Feb 23, 2025 am 11:14 AM

CSS伪注释 (或浏览器如何解析样式)

雖然CSS規範未提及,但您可以通過一些方法在CSS文件中模擬C風格和/或Unix風格的行註釋(存在一些限制)。其他人之前也寫過這方面的文章(特別是SitePoint的Web Foundations文章中涵蓋了CSS註釋)。本文將對此進行更詳細的探討。

關鍵要點

  • CSS正式只支持C風格的多行註釋,但偽註釋利用解析錯誤來無意中註釋掉代碼。
  • 偽註釋可以通過使CSS聲明格式錯誤來創建,例如省略分號或使用無法識別的屬性名稱,從而導致後續代碼被忽略。
  • 偽註釋的內聯和下一行放置會影響後續CSS規則是否應用,內聯偽註釋可能會使同一行上的後續聲明無效。
  • 偽註釋也可以應用於@規則,根據@規則是否包含主體塊或以分號結尾,觀察到的行為會有所不同。
  • 雖然偽註釋可用於調試,但它們可讀性較差,不應在生產代碼中替代標準CSS註釋。

CSS註釋

根據規範,CSS解析器正式支持一種註釋樣式,即來自C風格語言的多行註釋,它使用起始標記/*和結束標記*/,如下所示:

<code>/*
  起始和结束标记之间(包括起始和结束标记)的字符将被解析器忽略,
*/</code>
登入後複製
登入後複製

因此,註釋中的規則聲明將被忽略:

<code>body {
  background: red;
  /*
  background: white;
  */
}</code>
登入後複製
登入後複製

註釋中的塊聲明將被忽略:

<code>/*
body {
  background: red;
}
*/</code>
登入後複製
登入後複製

在這些示例中,我們都故意使用註釋語法來指示解析器忽略內容。

但是,我們也可能意外地做到這一點,例如使用格式錯誤的聲明:

<code>body {
  background: red    /* 缺少分号 */
  background: blue;      
}</code>
登入後複製
登入後複製

在此示例中,由於缺少分號,兩個 background聲明均未應用。解析器掃描下一個分號,確定整個兩行語句格式錯誤,因此忽略整個詞法分析的內容。如果我們完全省略屬性值,也會發生同樣的事情:

<code>body {
  background:
  background: blue; /* 此声明未应用 */
}</code>
登入後複製
登入後複製

表明我們可以使用格式錯誤的聲明作為……

偽註釋

我們將這些稱為“偽註釋”,因為嚴格來說,這些不是在行尾字符處終止的註釋。相反,它們通過使後續輸入(甚至在後續行)格式錯誤來工作。這是由於規則集、聲明塊和選擇器的錯誤處理過程:

“如果選擇器中的任何位置出現錯誤,則應忽略整個語句,即使選擇器的其餘部分在CSS 2.1中看起來合理。”

在以下示例(摘自規範)中,由於選擇器中存在無效字符“&”,第二個規則集被忽略:

<code>h1, h2 {color: green }
h3, h4 & h5 {color: red } /* h6 {color: black }</code>
登入後複製
登入後複製

同樣,在以下示例中,由於在background屬性名稱中存在多餘字符,第二個和第三個聲明被忽略:

<code>body {
  background: red;
  xbackground: white;    /* 属性名称未被识别 */
  y background: blue;    /* 属性名称格式不正确 */
}</code>
登入後複製
登入後複製

快速瀏覽一下英語鍵盤,就會發現以下特殊字符將充當單行聲明註釋:

<code>/*
  起始和结束标记之间(包括起始和结束标记)的字符将被解析器忽略,
*/</code>
登入後複製
登入後複製

但是,不要使用任何字符,而應堅持使用C和Unix約定,並使用#或//:

<code>body {
  background: red;
  /*
  background: white;
  */
}</code>
登入後複製
登入後複製

分號

分號是規則聲明的結束標記。因此,它們不能“註釋”其後的文本。用規範的話說,解析器將懸空分號視為格式錯誤的聲明(缺少名稱、冒號或值的聲明)。

如前所述,當常規多行註釋格式錯誤時,即起始和結束標記未圍繞規則集或聲明平衡時,解析器會忽略後續的聲明或規則集。以下內容實際上將“註釋”掉兩個 background聲明,因為解析器將搜索受影響聲明的下一個聲明結束標記(分號):

<code>/*
body {
  background: red;
}
*/</code>
登入後複製
登入後複製

通過在註釋後、下一個聲明前添加分號來修復此問題(因此將應用background blue聲明):

<code>body {
  background: red    /* 缺少分号 */
  background: blue;      
}</code>
登入後複製
登入後複製

對於一行缺少分號的偽註釋,效果相同:

<code>body {
  background:
  background: blue; /* 此声明未应用 */
}</code>
登入後複製
登入後複製

並通過恢復分號來更正:

<code>h1, h2 {color: green }
h3, h4 & h5 {color: red } /* h6 {color: black }</code>
登入後複製
登入後複製

內聯與下一行放置

這就是“偽”進入“偽註釋”一詞的地方。這可能是根本不稱其為“註釋”的充分理由,因為它們違背了C或Unix風格行註釋的行尾約定。

放在自己一行上的偽註釋將抑制下一行上的聲明。在以下示例中,background將為藍色:

<code>body {
  background: red;
  xbackground: white;    /* 属性名称未被识别 */
  y background: blue;    /* 属性名称格式不正确 */
}</code>
登入後複製
登入後複製

放在同一行有效聲明之後的偽註釋將抑制下一行上的聲明。在以下示例中,background將為白色而不是藍色:

<code>selector {
  ~ property-name: ignored;
  ` property-name: ignored;
  ! property-name: ignored;
  @ property-name: ignored;
  # property-name: ignored;
  $ property-name: ignored;
  % property-name: ignored;
  ^ property-name: ignored;
  & property-name: ignored;
  * property-name: ignored;
  _ property-name: ignored;
  - property-name: ignored;
  + property-name: ignored;
  = property-name: ignored;
  | property-name: ignored;
  \ property-name: ignored;
  : property-name: ignored;
  property-name: ignored;
  . property-name: ignored;
  > property-name: ignored;
  , property-name: ignored;
  ? property-name: ignored;
  / property-name: ignored;
}</code>
登入後複製

即使是帶有內聯偽註釋的CSS選擇器的“壓縮”版本也將表現為單聲明註釋。在以下示例中,由於解析器識別到的註釋標記#在下一個分號處終止,第一個background聲明被忽略,第二個background聲明被識別為格式正確,因此被應用(在這種情況下,藍色將應用於body background):

<code>// background: ignored;
  # background: ignored;</code>
登入後複製

(後續內容同理,由於篇幅限制,此處省略剩餘部分的偽原創。)

以上是CSS中的偽計算(或者如何瀏覽解析樣式)的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

<🎜>:泡泡膠模擬器無窮大 - 如何獲取和使用皇家鑰匙
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
北端:融合系統,解釋
3 週前 By 尊渡假赌尊渡假赌尊渡假赌
Mandragora:巫婆樹的耳語 - 如何解鎖抓鉤
3 週前 By 尊渡假赌尊渡假赌尊渡假赌

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

熱門話題

Java教學
1666
14
CakePHP 教程
1425
52
Laravel 教程
1327
25
PHP教程
1273
29
C# 教程
1253
24
靜態表單提供商的比較 靜態表單提供商的比較 Apr 16, 2025 am 11:20 AM

讓我們嘗試在這裡造成一個術語:“靜態表單提供商”。你帶上html

使Sass更快的概念證明 使Sass更快的概念證明 Apr 16, 2025 am 10:38 AM

在一個新項目開始時,Sass彙編發生在眼睛的眨眼中。感覺很棒,尤其是當它與browsersync配對時,它重新加載

每周平台新聞:HTML加載屬性,主要的ARIA規格以及從iframe轉移到Shadow dom 每周平台新聞:HTML加載屬性,主要的ARIA規格以及從iframe轉移到Shadow dom Apr 17, 2025 am 10:55 AM

在本週的平台新聞綜述中,Chrome引入了一個用於加載的新屬性,Web開發人員的可訪問性規範以及BBC Move

帶有HTML對話框元素的一些動手 帶有HTML對話框元素的一些動手 Apr 16, 2025 am 11:33 AM

這是我第一次查看HTML元素。我已經意識到了一段時間,但是尚未將其旋轉。它很酷,

'訂閱播客”鏈接應在哪裡? '訂閱播客”鏈接應在哪裡? Apr 16, 2025 pm 12:04 PM

有一段時間,iTunes是播客中的大狗,因此,如果您將“訂閱播客”鏈接到喜歡:

它全部都在頭上:管理帶有React頭盔的React Power Site的文檔頭 它全部都在頭上:管理帶有React頭盔的React Power Site的文檔頭 Apr 15, 2025 am 11:01 AM

該文檔負責人可能不是網站上最迷人的部分,但是其中所處的內容對於您的網站的成功也一樣重要

託管您自己的非JavaScript分析的選項 託管您自己的非JavaScript分析的選項 Apr 15, 2025 am 11:09 AM

有很多分析平台可幫助您跟踪網站上的訪問者和使用數據。也許最著名的是Google Analytics(廣泛使用)

紙張形式 紙張形式 Apr 16, 2025 am 11:24 AM

購買或建造是技術的經典辯論。自己構建東西可能會感覺更便宜,因為您的信用卡賬單上沒有訂單項,但是

See all articles