Sass 3.5 發佈候選版本

由 Natalie Weizenbaum 於 2016 年 8 月 30 日發佈

我剛剛按下按鈕發佈了 Sass 3.5.0-rc.1。如果感覺距離上次發佈已經有一段時間了,那是真的!但這是有原因的。我們決定在 3.5 版本後進入功能凍結期,讓 libsass(Sass 的超高速 C++ 實作)有時間達到與 Sass 3.4 的功能對等。Libsass 比 Sass 年輕許多,而且 C++ 通常是一種比 Ruby 開發速度更慢的語言,所以這花了一些時間。但這一切都是值得的:libsass 現在幾乎與 Ruby Sass 100% 相容,只有少數幾個小錯誤的差異。

在功能凍結解除後,我們主要專注於設計新的模組系統,這將會是 Sass 4.0 的核心功能。但我們也找到了一些時間來新增一些功能,這些功能是本次發佈的重點。

CSS 自訂屬性支援CSS 自訂屬性支援永久連結

Sass 3.5 現在完全支援 CSS 自訂屬性。這些對我們來說是一個特殊的挑戰,因為自訂屬性的語法非常廣泛。您幾乎可以在右側放置任何內容。例如,以下是完全有效且有意義的 CSS

.wacky-property {
  --property: .%(#@$~`^[^_+]<;:"}"|?)*+;
}

特別是,這表示 SassScript 運算式也是有效的 CSS,這對我們實現 CSS 相容性的目標造成了一個問題。只要有可能,我們都希望有效的 CSS 在 Sass 中與在 CSS 中的含義相同。因此,像 3.4 版那樣將自訂屬性視為一般屬性並不是一個好的解決方案。不僅一些有效的 CSS 被解釋不同,有些甚至不可能實現。以下直接取自 Polymer 文件的 CSS,幾乎不可能在 Sass 中表示

:host {
  --my-toolbar-theme: {
    background-color: green;
    border-radius: 4px;
    border: 1px solid gray;
  }
}

另一方面,我們需要某種方法將動態 SassScript 值包含在自訂屬性中。因此,我們決定採取一種折衷方案:我們將像處理選擇器和 at-rule 值一樣處理自訂屬性,並且只允許 #{} 作為包含 Sass 值的方法。雖然技術上來說這是純 CSS,但它的表面積非常小,而且很容易被跳脫,所以我們不太擔心。這表示在 3.5 中,您可以撰寫

:host {
  --my-toolbar-theme: {
    background-color: #{$toolbar-background};
    border-radius: 4px;
    border: 1px solid gray;
  }
}

新的資料類型:一級函式新的資料類型:一級函式永久連結

為了準備 Sass 4.0 中即將推出的模組系統,3.5 新增了一個新的資料類型:一級函式。這只是一種比函式名稱更具體地引用函式的方法。您可以透過將函式名稱傳遞給 get-function($name) 來取得一級函式,並且您可以將其傳遞給 call(),以前您會在這裡傳遞函式名稱。

您可能會想,「為什麼這很有用?我已經可以直接傳遞函式名稱了。」嗯,現在,Sass 具有全域作用域。所有函式(以及變數、mixin 和選擇器)對稍後執行的任何程式碼都是可見的。這使得某些事情,例如 call(),變得簡單,但它也造成了很多問題。很容易意外覆蓋在其他地方定義的變數或函式,而且很難找出任何給定名稱最初是在哪裡定義的。

我們尚未準備好廣泛討論關於 4.0 模組系統的計劃,但我們確定的一件事是它不會使用全域作用域。每個 Sass 檔案將只能看到有限數量的已定義名稱,尤其是 Sass 函式庫將無法看到由匯入它們的終端使用者樣式表定義的任何內容。一流的函式允許使用者將他們定義的函式傳遞給函式庫。

任何目前以字串形式傳遞函式名稱的樣式表都應改為傳遞一流函式。為此,使用字串呼叫 `call()` 已被棄用。它在 4.0 之前實際上不會失效,到那時它也沒有多大用處了,但我們強烈建議使用者立即改用 `get-function()`。

新語法:括號清單新語法:括號清單 永久連結

新的 CSS Grid Layout 模組新增了一種新的語法類型:以方括號括住的識別字。我們一直致力於與 CSS 完全相容,這意味著我們也需要支援這些括號。以下是它們在 CSS 中的樣子

.container {
  grid-template-columns: [first] 40px [line2] 50px [line3] auto [col4-start] 50px [five] 40px [end];
  grid-template-rows: [row1-start] 25% [row1-end] 100px [third-line] auto [last-line];
}

解決方案很明確:Sass 已經有一個 清單資料類型,所以我們允許清單使用方括號。因此,`[first]` 只是一個包含未加引號的字串 `first` 的清單。與所有 Sass 清單一樣,括號清單可以空格分隔或逗號分隔:`[foo bar baz]` 和 `[foo, bar, baz]` 都是包含三個元素的清單。

我們還為括號清單新增了函式支援。`is-bracketed($list)` 函式會傳回清單是否帶有括號,而 `join()` 有一個新的 `$bracketed` 參數,允許呼叫者選擇結果清單是否帶有括號(預設情況下,如果第一個清單帶有括號,則結果也帶有括號)。

較小的功能較小的功能 永久連結

我們新增了一個 `content-exists()` 函式,它會傳回是否將內容區塊傳遞給目前的 mixin。這允許 mixin 選擇性地接受內容區塊,而不必定義一個接受內容的 mixin 和一個不接受內容的 mixin。

我們新增了在參數清單中新增尾隨逗號的功能。這與清單和映射的行為相符。

我們在 `invert()` 函式中新增了一個 `$weight` 參數。這是一個介於 0% 到 100% 之間的百分比,表示結果顏色的反轉程度。預設值為 100%。

發佈之路發佈之路 永久連結

這只是一個候選版本,但它已經處於我們樂於將其作為最終版本發佈的狀態。我們沒有這樣做的原因是,既然我們已經達到了與 libsass 的功能相容性,我們就致力於保持這種狀態。

不幸的是,自從 Marcel Greter 離開該專案 後,libsass 最近的進展相當緩慢。如果您或您認識的任何人有興趣參與一個可以造福數千人的專案,我們仍在尋找新的貢獻者!

在我們獲得 libsass 相容性之前,3.5 將保持在候選版本級別。但不要讓這阻止您試用它並讓我們知道您的想法!我們一直樂於在 郵件論壇 上聽到您的回饋!