Re: CSS 不能覆蓋 input[type=hidden] 的 'display' ?

(12/10/25 1:17), John Hax wrote:
> 我个人觉得以下user-agent规则就足够了:
> 
> input[type=hidden] { display:none !important; }

我這裡要先問一下這裡面的 "!important" 有特殊意義還是沒有?注意到 UA 樣式
裡面沒有跟這條矛盾的。

> 所以我的立场是html不应该规定trump CSS这样的事情。
>
> 过去浏览器厂商曾经坚持过(至少Mozilla的人这样说过),现代浏览器是CSS浏
> 览器,而不是HTML浏览器。意即,所有特性应该都以CSS为基础实现,不应该有
> 特别的magic。
>
> [恕刪]

有時候的情況是 magic 其實可以用 CSS 描述,不過沒有這個必要。就舉
<noscript> 這個例子好了,Gecko 的確是用

  noscript { diplay: none !important; }

實作的。證據:[1](因為還有判斷有沒腳本有無啟動的部份,所以不能完全用
CSS 寫,不過 input[type=hidden] 就的確是用 CSS 了,檔名是 /layout/css
/forms.css。)

不過 HTML 規範還是要寫[2]

  # 不管 CSS 規則為何,本規範預期使用者代理強制將腳本啟用的 noscript 元
  # 素的 'display' 屬性計算為 'none'。

的原因是:CSS 2.1 根本沒講清楚 UA 裡出現 !important 的時候該怎麼處理[3]:

  # 2. 以重要性(一般或重要)與來源(網頁作者、使用者或使用者代理)排
  #    列。以下是優先度遞增的排序:
  #
  #   1. 使用者代理宣告
  #   2. 使用者一般宣告
  #   3. 網頁作者一般宣告
  #   4. 網頁作者重要宣告
  #   5. 使用者重要宣告

(沒講清楚「使用者代理宣告」但底包不包括重要宣告)

實際上 Gecko 的實現順序就是

   1. 使用者代理一般宣告
   2. 使用者一般宣告
   3. 網頁作者一般宣告
   4. 網頁作者重要宣告
   5. 使用者重要宣告
   6. 使用者代理重要宣告

所以才會 <input type=hidden>(6.)不管 Web Developer (3.、4.)或是使用
者(2.、5.)怎麼弄都看不到。

不過不管怎麼樣,這只是一種實現方法,WebKit 好像就不是用 UA !important 實
現 <input type=hidden>,而是直接寫在 C++ 裡的。就 HTML 規範來說,只要使
用者、前端動不到了,就滿足「不管 CSS 規則為何,本規範預期使用者代理強制
將腳本啟用的 noscript 元素的 'display' 屬性計算為 'none'」,不管這種強制
的規則是寫成 C++ 代碼還是 CSS 都一樣。


所以我們這裡應該回到比較核心的問題,input[type=hidden] { display:
'display' 到底應該擺在 1. 還是 6.,你的立場貌似是 1. 理由是「html不应该
规定trump CSS这样的事情」,不過 Gecko 其實是「讓 CSS(UA
!important)trump CSS(所有其他 CSS)」,所以你意思是 Gecko 其實應該用

   1. 使用者代理一般宣告
   2. 使用者代理重要宣告
   3. 使用者一般宣告
   4. 網頁作者一般宣告
   5. 網頁作者重要宣告
   6. 使用者重要宣告

的順序?

有沒有其它理由?我感覺「html不应该规定trump CSS这样的事情」這的理由比較
虛幻一點,只是規範的寫法問題而已。


[1]
https://hg.mozilla.org/mozilla-central/annotate/tip/layout/base/nsPresShell.cpp#l1273
[2] http://www.w3.org/html/ig/zh/wiki/HTML5/rendering#hidden-elements
[3] http://www.w3.org/html/ig/zh/wiki/CSS2/cascade#cascade


以上
Kenny
-- 
Web Specialist, Oupeng Browser, Beijing
Try Oupeng: http://www.oupeng.com/

Received on Thursday, 25 October 2012 18:18:34 UTC