整一個月,我又回來了,好吧,咱繼續聊。
<div>
<h3>使用者登陸</h3>
<div>
<label for="name">使用者名</label>
<input id="name" />
</div>
<label for="pw">密碼</label>
<input id="pw" />
<p><button /></p>
</div>
最外層的div是作為産生節點使用,而使用者名和密碼部分實際上是為了産生具有結構的行,這裡若使用br同樣能夠産生行,但是缺乏結構,是以div代替了br。猜到我要說什麼了嗎?呵呵,又是xhtml 2.0,2.0中的section和line标簽,是的,在1.X中,div同時扮演了section和line的角色,因為分割産生節點,因為分割産生行。但是很明顯section和line具有比div更為明确的語義,那麼我們可不可以認為div的語義和br一樣是模糊的,既然是模糊的,br已經被斃了,我們現在大量使用的div會不會落到同樣的下場呢?不知道,至少目前的xhtml 2.0中,div仍然存在。看看上面的結構代碼在xhtml 2.0中應該如何展示(沒考慮XForm):
<section>
<h>使用者登陸</h>
<line>
</line>
<div><button /></div>
</section>
是以有些人單純的認為好像是div在不斷嵌套,其實不是的,是沒有辦法而産生出來的假象。這裡再請大家注意一個情況,需要和css結合起來看待,按鈕那個部分,在xhtml1.X中我使用了p,嚴格說從結構上是錯誤的,很明顯按鈕不是一個段落,我僅僅是希望它換行呈現,但是如果使用div,那麼就必須給予這個div一個class="button"以區分開來,并且在設定css的時候必須先清除公有的樣式屬性,這樣會帶來不少麻煩。另外作為節點的div和作為行的div同樣會出現這種問題。示例:如果我定義節點div{width: 300px; padding: 10px;},那麼我就必須在定義行div時要麼覆寫要麼清除以避免沖突,div div{width: 200px /*覆寫*/; margin: 10px; padding: 0 /*清除*/; color: #333;},然後在定義div div.button{margin: 0 /*清除*/; color: #F60 /*覆寫*/; background: #999;}的時候再做對行div的樣式沖突避免,為了避免這種情況,采用對節點div增加class="loginarea"和p,這樣就可以避開兩次樣式清除和覆寫操作。這樣的情況在結構複雜的頁面中更為明顯,不要告訴我加class就行了,class越多,文檔通用性越差,xhtml越難固定。這就是在xhtml1.X 中因為div的語義模糊帶來的麻煩,回頭在xhtml 2.0的結構中就很好辦了,section{},section line{},section div{},無需class也互不幹擾,诶诶诶,這裡的div貌似很适合它分隔的語義哈,不是行也不是節點,僅僅就是一個分隔,呵呵。
在我認為标簽中最難了解的2個之一的div現在應該算是很清楚了。剩下的一個就是span,至今我仍未能了解到span如何産生結構,隻好說說自己的迷惑了。
先還是說說div和span的差別,從大的方面來說,div被歸類到Structural Module(結構子產品),而span被歸類到Text Module(文本子產品)。小的方面,div是block-elements(塊級元素),span是inline-elements(行内元素)。在所有Structural Module中,div是唯一一個語義模糊的,在所有Text Module中,span也是唯一一個語義模糊的,呵呵,兩個Tag唯一的共性:語義模糊。
回到span的語義:跨度、範圍。這個這個……比division(分割)更為抽象,難以了解。在一陣瘋狂google後還是沒找到我想要的那種解釋,接近的都沒有,也許根本就沒有,所有的結果都指向表現,無論中英文都是指為字型添加樣式,可是可是W3中明文寫着The span element, in conjunction with the id, class and role attributes, offers a generic mechanism for adding structure to documents. 這裡的for adding structure to documents做何解釋?百思不得其解,後來氣不過,甚至打開W3的源碼檢視他是如何使用span的,雖說獲得了一些提示,但依舊不足以領悟到structure的真谛,我想應該是我的XML功力還不夠。唉,既然語義上,結構上行不通,那麼隻好換個角度,從實際應用中試着去了解。span是行内元素,主要應用于文本,這點沒什麼異議,關鍵在于如何運用?為什麼我始終不認為span是個樣式容器,對,又是容器,google的時候發現清一色的容器解釋,div是大容器,span是小容器,我郁悶。如果span因為文本的樣式而存在,它憑什麼存在?一段文本為什麼要添加樣式?如果你想強調應該使用em,如果想特别強調應該使用strong,Text Module裡還有很多語義明确的标簽可以使用。是以span應該不是作為樣式容器而存在,就像div不是作為布局容器而存在一樣。但是我領悟不到span的真谛,哭啊!不過我可以抛磚引玉,在有一個地方,我一定會使用span的。那就是表單中。還是以登陸為例,如果登陸的資料需要展現出來,比如很多edit頁面和view頁面,結構應該完全相同,不同的是在edit頁面中是輸入框,而view頁面中則用span展現資料。類似如下:
<span>MyName</span>
<span>MyPassword</span>
這樣的好處有兩點:1、和label區分開來,便于應用樣式,如下定義:div div span{}。2、可以通過節點提取所有錄入的資料。這是我目前唯一非常明确的使用span的地方,這裡除了span好像沒有更合适的了,也有點符合它的語義:範圍和結構化。這是我抛出的一塊磚頭,誰能引出玉來,或者知道玉,求之。其他span的運用仍在摸索中,包括從W3源代碼中獲得的提示。
說到這裡,問一句,html和xhtml最大的不同在哪裡?是文法嗎?是名稱嗎?是嚴格了,xml化了嗎?不不不,本質差別是:html是面向表現的語言,而xhtml是面向結構的語言!是以我們應當從結構的角度去審視和了解與運用xhtml中的每一個Tag。比如容器的了解,在面向表現的html中,是正确的,但是在面向結構的xhtml中則錯了,應該了解為節點。了解直接影響運用,以表現的了解顯然無法寫出結構化的代碼。否則什麼合什麼離,哈哈哈,忍不住又敲出來了。
好了,span現在總結不出來,隻好先對div做個總結收尾:在目前xhtml1.x環境下,我們需要産生節點(section)和行(line)的時候選用div。
阿彌陀佛,最煩人的兩個東西總算告一段落,雖然未完,但是遺憾也是美嘛,以後再說了。結構也算告一段落,下篇可以換個口味了,正式進入語義!
本文轉自爆牙齒部落格園部落格,原文連結:http://yuntian.cnblogs.com/archive/2006/04/29/388013.html,如需轉載請自行聯系原作者