:matches(俗稱 :any)改用媒體查詢式錯誤處理(丟棄錯誤直到碰到逗點)

我想熟悉 CSS 的人都知道 CSS 選擇器的這項規則[1]:

  # 使用者代理必須遵守下面的解析錯誤處理規則:
  # ...
  #
  # * 含有不合法選擇器的選擇器列表不合法
  #
  # 不合法的選擇器不代表任何東西。

舉例來說,瀏覽器一定會丟棄 ":-webkit-any(foo, bar), :-moz-any(foo,
bar)",因為最多只認識其中一個,不認識就不合法。

如同[1]也提到的,有人建議這個東西更改成媒體查詢式的錯誤處理:用逗點分
隔,有錯誤的部份丟棄(同等於視其為 ":not(*)",)。其實很多人都支持這個思
路,但是主要就是兼容問題 — 有很多網站利用這個規則寫瀏覽器特定的樣式,改
這個規則會破壞很多網站[2]。

我最近突然想到說,是不是可以把這個錯誤處理限制在 ":matches()" 裡,讓

  :matches(:-moz-any-link, :webkit-any-link)

之類的可以用。(雖然 ":-moz-any-link, :-webkit-any-link" 還是老樣子不行。)

這裡可能有兩個問題:

1. 基本上不早點把 ":matches()" 的前輟拿掉沒什麼意義。

最近的趨勢似乎是前輟會越來越少,有可能當 ":matches()" 本身前輟拿掉的時
候,已經沒有其它前輟了。不過我還是很好其這種錯誤處理在*跟前輟無關*的用途
上有沒有用,像是優雅退化之類的,比如說:

  :matches(:any-link, :link)

不過這個例子看起來很沒有用,所以有點好奇有沒有真的有用的東西,可能要從
selectors4 裡找一些新的偽類來研究看看。

2. ":matches()" 現階段不能在裡面放偽類[3]。

  # 批配偽類無法表示偽元素 ― 偽元素在 :matches() 裡不合法。

所以

  :matches(::-moz-selection, ::-webkit-selection)

之類的原先[2]的提議裡面提到的一個使用情節,不能用。我覺得「批配偽類中不
能用偽元素」這個問題應該是有辦法解決的,就是要完整定義

  :matches(::selection)::before

之類的東西要怎麼處理就好,要再多想想。


各位認為如何?

ps. 目前 selectors4 翻了 10%,老樣子,推薦加入翻譯的章節都放在討論頁了。


[1] http://www.w3.org/html/ig/zh/wiki/selectors4#invalid
[2] http://lists.w3.org/Archives/Public/www-style/2010Nov/0500
[3] http://www.w3.org/html/ig/zh/wiki/selectors4#matches


以上

Kenny

Received on Friday, 15 June 2012 03:48:07 UTC