目錄
WordPress樣式的演變
為什麼選擇theme.json而不是style.css?
使用JSON元素定義樣式
JSON和CSS特異性
樣式引擎
使用JSON元素
JSON元素的全局樣式
首頁 web前端 css教學 在WordPress塊主題中管理CSS樣式

在WordPress塊主題中管理CSS樣式

Mar 10, 2025 am 10:01 AM

Managing CSS Styles in a WordPress Block Theme

WordPress主題的CSS編寫方式正在發生巨大變化。我最近分享了一種通過theme.json在WordPress中添加流體字體支持的技術,這是一個WordPress大力推廣的新文件,它將成為定義支持全站編輯(FSE)功能的WordPress主題樣式的中心真理來源。

等等,沒有style.css文件?我們仍然有它。事實上,style.css仍然是塊主題中必需的文件,儘管它的作用大大減少,僅用於註冊主題的元信息。也就是說,theme.json仍在積極開發中,這意味著我們正處於一個過渡時期,您可能會發現樣式定義在theme.jsonstyles.css甚至塊級別。

那麼,在這些WordPress FSE時代,樣式實際上是什麼樣的呢?這就是我想在這篇文章中介紹的內容。 WordPress主題開發者手冊中缺乏關於塊主題樣式的文檔,因此我們在這裡介紹的所有內容都是我收集到的關於當前情況以及WordPress主題未來討論的信息。

WordPress樣式的演變

WordPress 6.1中包含的新開發功能使我們更接近於一個完全在theme.json中定義樣式的系統,但在我們可以完全依賴它之前,仍有很多工作要做。我們可以通過使用Gutenberg插件來了解未來版本中將出現的內容,這是實驗性功能通常進行試運行的地方。

我們還可以通過查看默認WordPress主題的演變來了解我們的現狀。迄今為止,有三個支持全站編輯的默認主題:

  • Twenty Twenty-One (TT1): 這是第一個與塊兼容的經典默認主題版本。還有一個塊版本(TT1塊),並且此後一直是塊主題的可靠資源。然而,TT1中所有5900行CSS都在style.css中。沒有theme.json文件。 TT1塊是我們第一次看到塊編輯器時代中的樣式,我們可以將其視為預告片而非模型。
  • Twenty Twenty-Two (TT2): 這是第一個真正的基於塊的默認WordPress主題,也是我們第一次遇到theme.json的地方。該文件僅包含373行代碼。其主要開發人員已做出協調努力,使其成為無CSS主題;但是,style.css仍然帶有不到150行代碼,因為並非所有theme.json的問題都在發布前的實驗性Gutenberg插件中得到解決。
  • Twenty Twenty-Three (TT3): 這是WordPress 6.1中發布的,它是第一個在必需的style.css文件中沒有任何CSS的主題示例。

但是,不要立即將style.css中的CSS換成theme.json中的JSON屬性-值對。在考慮這樣做之前,仍然需要在theme.json中支持一些CSS樣式規則。目前正在討論剩餘的重要問題,目標是將所有CSS樣式規則完全移入theme.json,並將theme.json的不同來源合併到一個UI中,以便直接在WordPress站點編輯器中設置全局樣式。

這讓我們處於一個相對艱難的境地。不僅沒有明確的覆蓋主題樣式的路徑,而且還不清楚這些樣式的來源是什麼——是來自不同層的theme.json文件、style.css、Gutenberg插件還是其他地方?

為什麼選擇theme.json而不是style.css?

您可能想知道為什麼WordPress轉向基於JSON的樣式定義而不是傳統的CSS文件。 Gutenberg開發團隊的Ben Dwyer雄辯地闡述了為什麼theme.json方法對主題開發者來說是一個好處。

值得閱讀Ben的帖子,但重點在於這段引用:

無論是佈局、預設還是塊樣式,覆蓋CSS都會對集成和互操作性構成障礙:前端和編輯器之間的視覺一致性變得更難以維護,對塊內部的升級可能會與覆蓋衝突。此外,自定義CSS在其他塊主題中的可移植性較差。

通過鼓勵主題作者盡可能使用theme.json API,可以正確解決“基礎>主題>用戶”定義樣式的層次結構。

將CSS移至JSON的主要好處之一是JSON是一種機器可讀的格式,這意味著它可以通過獲取API在WordPress站點編輯器UI中公開,從而允許用戶修改默認值並自定義站點的外觀,而無需編寫任何CSS。它還提供了一種一致地設置塊樣式的方法,同時提供了一種結構,該結構創建了特異性層,以便用戶設置比在theme.json中定義的設置具有更高的優先級。 theme.json中的主題級樣式與全局樣式UI中用戶定義的樣式之間的這種相互作用,使得JSON方法如此吸引人。

開發人員在JSON中保持一致性,用戶通過無代碼自定義獲得靈活性。這是一個雙贏的局面。

當然,還有其他好處,WP Engine的Mike McAlister在這個Twitter線程中列出了幾個。您可以在Make WordPress Core博客上的深入討論中找到更多好處。閱讀之後,將JSON方法的優點與在經典主題中定義和覆蓋樣式的可用方法進行比較。

使用JSON元素定義樣式

theme.json能夠設置主題的哪些部分而言,我們已經看到了很大的進步。在WordPress 6.1之前,我們真正能做的只是設置標題和鏈接的樣式。現在,使用WordPress 6.1,我們可以添加按鈕、標題、引用和標題。

我們通過定義JSON元素來做到這一點。可以將元素視為存在於WordPress塊中的單個組件。假設我們有一個塊,其中包含標題、段落和按鈕。這些單獨的部分是元素,theme.json中有一個elements對象,我們在其中定義它們的樣式:

<code>{
  "version": 2,
  "settings": {},
  // etc.
  "styles": {
    // etc.
    "elements": {
        "button": { ... },
        "h1": { ... },
        "heading": { ... },
    },
  },
  "templateParts": {}
}</code>
登入後複製
登入後複製

更好的描述JSON元素的方法是作為主題和塊的低級組件,它們不需要塊的複雜性。它們是HTML原語的表示,這些原語未在塊中定義,但可以在塊之間使用。它們在WordPress(和Gutenberg插件)中的支持方式在塊編輯器手冊和Carolina Nymark的這個全站編輯教程中進行了描述。

例如,鏈接在elements對像中設置樣式,但本身不是塊。但是鏈接可以在塊中使用,它將繼承在theme.jsonelements.link對像中定義的樣式。但這並沒有完全概括元素的定義,因為某些元素也註冊為塊,例如標題和按鈕塊——但是這些塊仍然可以在其他塊中使用。

以下是Carolina提供的在WordPress 6.1之前的theme.json中當前可用於設置樣式的元素表:

如您所見,這還處於早期階段,仍然有很多東西需要從Gutenberg插件移入WordPress核心。但是您可以看到,在不搜索CSS文件或DevTools中的選擇器的情況下,全局設置主題中所有標題的樣式將是多麼快速。

此外,您還可以開始了解theme.json的結構如何形成特異性層,從全局元素(例如標題)到單個元素(例如h1),以及塊級樣式(例如包含在塊中的h1)。

有關JSON元素的更多信息,請參閱此Make WordPress提案和Gutenberg插件GitHub存儲庫中的此開放票證。

JSON和CSS特異性

讓我們繼續討論CSS特異性。我前面提到過,JSON的樣式方法建立了一個層次結構。這是真的。在theme.json中JSON元素上定義的樣式被認為是默認主題樣式。全局樣式UI中用戶設置的任何內容都將覆蓋默認值。

換句話說:用戶樣式比默認主題樣式具有更高的特異性。讓我們看一下按鈕塊來了解其工作原理。

我使用Emptytheme,這是一個沒有CSS樣式的空白WordPress主題。我將在新頁面上添加一個按鈕塊。

好的,我們知道WordPress核心附帶一些簡單的樣式。現在,我將切換到WordPress 6.1中的默認TT3主題並激活它。如果我刷新帶有按鈕的頁面,按鈕的樣式會發生變化。

您可以在TT3的theme.json文件中準確看到這些新樣式的來源。這告訴我們,JSON元素樣式優先於WordPress核心樣式。

現在我將通過在子主題中覆蓋它來修改TT3,其中按鈕塊的默認背景顏色設置為紅色。

但是請注意最後一個屏幕截圖中的搜索按鈕。它也應該是紅色的,對吧?這意味著如果我所做的更改是在全局級別,那麼它一定是在另一個級別設置樣式的。如果我們想更改兩個按鈕,我們可以使用站點編輯器中的全局樣式UI在用戶級別進行更改。

我們使用全局樣式UI將兩個按鈕的背景顏色更改為藍色並修改了文本。請注意,那裡的藍色優先於主題樣式!

樣式引擎

這是一個非常快速但很好的關於WordPress塊主題中如何管理CSS特異性的想法。但這並不是完整的畫面,因為目前還不清楚這些樣式在哪裡生成。 WordPress有自己的默認樣式,這些樣式來自某個地方,使用theme.json中的數據獲取更多樣式規則,並用全局樣式中設置的任何內容覆蓋這些規則。

這些樣式是內聯的嗎?它們是否在單獨的樣式表中?也許它們是在頁面上註入的?

這就是新的樣式引擎有望解決的問題。樣式引擎是WordPress 6.1中的一個新API,旨在使樣式的生成方式和样式的應用位置保持一致。換句話說,它獲取所有可能的樣式來源,並單獨負責正確生成塊樣式。我知道,我知道。只是為了編寫一些樣式,又添加了一個抽象層在其他抽象層之上。但是,鑑於樣式可以來自多個地方,因此擁有一個集中的樣式API可能是最優雅的解決方案。

我們只是第一次看到樣式引擎。事實上,根據該票證,到目前為止已經完成了以下工作:

  • 審核和合併後端生成塊支持CSS的代碼位置,以便它們從同一位置(而不是多個位置)交付。這包括CSS規則,例如邊距、填充、排版、顏色和邊框。
  • 刪除重複的特定於佈局的樣式並生成語義類名。
  • 減少為塊、佈局和元素支持打印到頁面的內聯樣式標記的數量。

基本上,這是建立單個API的基礎,該API包含主題的所有CSS樣式規則,無論它們來自何處。它清理了WordPress在6.1之前註入內聯樣式的方式,並為語義類名建立了一個系統。

有關樣式引擎的長期和短期目標的更多詳細信息,請參閱此Make WordPress Core討論。您還可以關注跟踪問題和項目板以獲取更多更新。

使用JSON元素

我們討論了theme.json文件中JSON元素以及它們基本上是如何定義標題、按鈕和鏈接等內容的默認樣式的HTML原語。現在,讓我們看看實際使用JSON元素以及它在各種樣式上下文中的行為。

JSON元素通常有兩種上下文:全局級別塊級別。全局級別樣式的定義特異性低於塊級別,以確保塊特定樣式優先,以便在使用塊的任何位置保持一致性。

JSON元素的全局樣式

讓我們看一下新的默認TT3主題並檢查其按鈕的樣式。以下是TT3 theme.json文件的簡短複製粘貼(這是完整代碼),顯示全局樣式部分,但您可以在此處找到原始代碼。

查看代碼 ``` { "version": 2, "settings": {}, // ... "styles": { // ... "elements": { "button": { "border": { "radius": "0" }, "color": { "background": "var(--wp--preset--color--primary)", "text": "var(--wp--preset--color--contrast)" }, ":hover": { "color": { "background": "var(--wp--preset--color--contrast)", "text": "var(--wp--preset--color--base)" } }, ":focus": { "color": { "background": "var(--wp--preset--color--contrast)", "text": "var(--wp--preset--color--base)" } }, ":active": { "color": { "background": "var(--wp--preset--color--secondary)", "text": "var(--wp--preset--color--base)" } } }, "h1": { "typography": { } }, // ... "heading": { "typography": { "fontWeight": "400", "lineHeight": "1.4" } }, "link": { "color": { "text": "var(--wp--preset--color--contrast)" }, ":hover": { "typography": { "textDecoration": "none" } }, ":focus": { "typography": { "textDecoration": "underline dashed" } }, ":active": { "color": { "text": "var(--wp--preset--color--secondary)" }, "typography": { "textDecoration": "none" } }, "typography": { "textDecoration": "underline" } } }, // ... }, "templateParts": {} }

<code>{
  "version": 2,
  "settings": {},
  // etc.
  "styles": {
    // etc.
    "elements": {
        "button": { ... },
        "h1": { ... },
        "heading": { ... },
    },
  },
  "templateParts": {}
}</code>
登入後複製
登入後複製

{ "version": 2, // ... "styles": { // 全局級別樣式 "elements": { }, // 塊級別樣式 "blocks": { "core/search": { "elements": { "button": { "color": { "background": "var(--wp--preset--color--quaternary)", "text": "var(--wp--preset--color--base)" } } }, // ... } } } }

<code>
所有按钮都在全局级别(`styles.elements.button`)设置样式。

我们也可以在DevTools中确认这一点。请注意,名为`.wp-element-button`的类是选择器。相同的类也用于设置交互式状态。

同样,所有这些样式都在全局级别发生,来自`theme.json`。每当我们使用按钮时,它都将具有相同的背景,因为它们共享相同的选择器,并且没有其他样式规则覆盖它。

顺便说一句,WordPress 6.1添加了对使用`theme.json`中的伪类(包括`:hover`、`:focus`和`:active`)或全局样式UI设置某些元素(如按钮和链接)的交互式状态样式的支持。Automattic工程师Dave Smith在一个YouTube视频中演示了此功能。

我们可以在`theme.json`中(最好在子主题中,因为我们使用的是默认WordPress主题)或在站点编辑器中的全局样式设置中覆盖按钮的背景颜色(不需要子主题,因为它不需要代码更改)。

但是,按钮将同时更改。如果我们想在按钮是特定块的一部分时覆盖背景颜色怎么办?这就是块级样式发挥作用的地方。

#### 元素的块级样式

为了了解如何在块级别使用和自定义样式,让我们更改包含在搜索块中的按钮的背景颜色。请记住,有一个按钮块,但我们正在做的是在搜索块的块级别覆盖背景颜色。这样,我们只在那里应用新颜色,而不是将其全局应用于所有按钮。

为此,我们在`theme.json`的`styles.blocks`对象上定义样式。没错,如果我们在`styles.elements`上定义所有按钮的全局样式,我们可以在`styles.block`上定义按钮元素的块特定样式,这遵循类似的结构:
</code>
登入後複製

{ "version": 2, "styles": { // 全局級別樣式 "elements": { }, // 塊級別樣式 "blocks": { } } }

<code>
看到了吗?我在`styles.blocks.core/search.elements.button`上设置了背景和文本属性,并使用了WordPress中预设的两个CSS变量。

结果?搜索按钮现在是红色的(`--wp--preset--color--quaternary`),默认按钮块保留其亮绿色背景。

我们也可以在DevTools中看到更改。

如果我们想设置包含在其他块中的按钮的样式,也是如此。按钮只是一个例子,所以让我们再看一个。

### 示例:在每个级别设置标题样式

让我们用一个例子来巩固所有这些信息。这次,我们将:

- 全局设置所有标题的样式
- 设置所有二级标题元素的样式
- 设置查询循环块中二级标题元素的样式

首先,让我们从`theme.json`的基本结构开始:
</code>
登入後複製

{ "version": 2, "styles": { // 全局級別樣式 "elements": { "heading": { "color": "var(--wp--preset--color--base)" }, }, // 塊級別樣式 "blocks": { } } }

<code>
这为我们的全局和块级样式建立了轮廓。

#### 全局设置所有标题的样式

让我们将`headings`对象添加到我们的全局样式并应用一些样式:
</code>
登入後複製

{ "version": 2, "styles": { // 全局級別樣式 "elements": { "heading": { "color": "var(--wp--preset--color--base)" }, "h2": { "color": "var(--wp--preset--color--primary)", "typography": { "fontSize": "clamp(2.625rem, calc(2.625rem ((1vw - 0.48rem) * 8.4135)), 3.25rem)" } } }, // 塊級別樣式 "blocks": { } } }

<code>
这将所有标题的颜色设置为WordPress中的预设基本颜色。让我们在全局级别更改二级标题元素的颜色和字体大小:
</code>
登入後複製

{ "version": 2, "styles": { // 全局級別樣式 "elements": { "heading": { "color": "var(--wp--preset--color--base)" }, "h2": { "color": "var(--wp--preset--color--primary)", "typography": { "fontSize": "clamp(2.625rem, calc(2.625rem ((1vw - 0.48rem) * 8.4135)), 3.25rem)" } } }, // 塊級別樣式 "blocks": { "core/query": { "elements": { "h2": { "typography": { "fontSize": 3.25rem } } } } } } }

<code>
现在,所有二级标题元素都设置为主要预设颜色,并具有流体字体大小。但也许我们希望在将二级标题元素用于查询循环块时使用固定fontSize:
</code>
登入後複製

以上是在WordPress塊主題中管理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

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

熱工具

記事本++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教學
1657
14
CakePHP 教程
1415
52
Laravel 教程
1309
25
PHP教程
1257
29
C# 教程
1229
24
Google字體可變字體 Google字體可變字體 Apr 09, 2025 am 10:42 AM

我看到Google字體推出了新設計(Tweet)。與上一次大型重新設計相比,這感覺更加迭代。我幾乎無法分辨出區別

如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 如何使用HTML,CSS和JavaScript創建動畫倒計時計時器 Apr 11, 2025 am 11:29 AM

您是否曾經在項目上需要一個倒計時計時器?對於這樣的東西,可以自然訪問插件,但實際上更多

HTML數據屬性指南 HTML數據屬性指南 Apr 11, 2025 am 11:50 AM

您想了解的有關HTML,CSS和JavaScript中數據屬性的所有信息。

如何通過CSS選擇第一個類名為item的子元素? 如何通過CSS選擇第一個類名為item的子元素? Apr 05, 2025 pm 11:24 PM

在元素個數不固定的情況下如何通過CSS選擇第一個指定類名的子元素在處理HTML結構時,常常會遇到元素個數不�...

為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? 為什麼Flex佈局中的紫色斜線區域會被誤認為是'溢出空間”? Apr 05, 2025 pm 05:51 PM

關於Flex佈局中紫色斜線區域的疑問在使用Flex佈局時,你可能會遇到一些令人困惑的現象,比如在開發者工具(d...

我們如何創建一個在SVG中生成格子呢模式的靜態站點 我們如何創建一個在SVG中生成格子呢模式的靜態站點 Apr 09, 2025 am 11:29 AM

格子呢是一塊圖案布,通常與蘇格蘭有關,尤其是他們時尚的蘇格蘭語。在Tar​​tanify.com上,我們收集了5,000多個格子呢

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

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

在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? 在前端開發中,如何使用CSS和JavaScript實現類似Windows 10設置界面的探照燈效果? Apr 05, 2025 pm 10:21 PM

在前端開發中如何實現類似Windows...

See all articles