成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

HTML5大綱算法對結構的影響

開發 前端 算法
這兩個都是我早期的作品了。當時還覺得自己的結構寫的不錯,特別是第二個,還用上了HTML5標簽,以為自己就踏進這個新世界了。看過HTML大綱算法之后,檢測了一下這些頁面,真的是慘不忍睹。

[[91338]]

HTML5已經出來好長時間了,越來越多人希望并且開始把HTML5應用到平時的工作、個站中。大家對section、article、aside、nav等新標簽的使用也越來越上手,也許是自我感覺良好的上手。不從多個方面去認識理解這些標簽,可能反而讓自己落入了更混亂的境地。HTML的大綱算法(outlining algorithm)就是一個很重要的切入點。

先看兩個大綱:

這兩個都是我早期的作品了。當時還覺得自己的結構寫的不錯,特別是第二個,還用上了HTML5標簽,以為自己就踏進這個新世界了。看過HTML大綱算法之后,檢測了一下這些頁面,真的是慘不忍睹。第一個各種混亂標題不說,“主創陣容”居然從屬于“用戶評論”?第二個也不好發言了,那么多未命名的是什么東西?不過總是要踩在傷痛的歷史上才能往前進。

再來看幾個其他人重構的頁面大綱:

想象你是一個有點視力障礙的用戶,需要依靠屏幕閱讀器來瀏覽這些網頁,閱讀器會按照層級來給你解讀這個網頁,你覺得上面那個網頁更容易讓你獲得所需要的資訊呢?也許對比完大家更想知道大綱算法到底是個怎么樣的東西了吧?

什么是HTML大綱算法?

大綱算法允許用戶代理(user agent)從一個web頁面生成一個信息結構目錄,讓用戶對頁面有一個快速的概覽。類似書籍、PDF、幫助文檔等,都有一個清晰的目錄結構,用戶能方便的定位所需內容。一個良好結構的大綱,不僅是對于搜索引擎的優化,更是為借助于屏幕閱讀器瀏覽網頁的盲人(或弱視力)用戶提供了巨大的幫助。

幫助文檔的目錄結構:

每個頁面都有大綱,先從一個簡單的例子來了解web頁面大綱吧。假設要做一個電影介紹頁面,主題是8月電影推介,頁面結構也許如下:

  1. 1.8月電影推介  
  2.   1.國內電影  
  3.     1.《四大名捕》  
  4.     2.《搜索》  
  5.   2.國外電影  
  6.     1.《冰川時代4》  
  7.     2.《在劫難逃》 

HTML4或者之前,我們都是采用hn(h1~h6)來生成大綱的。HTML5引入了section、article、aside、nav等新的節點元素(sectioning content),添加了一些新的規則,后面會詳細闡述。

#p#

hn生成的大綱

也許HTML4的結構會這樣寫:

  1. <div> 
  2.   <h1>8月電影推介</h1> 
  3.   <h2>國內電影</h2> 
  4.   <h3>《四大名捕》</h3> 
  5.   <p>四大名捕講的是..</p> 
  6.   <h3>《搜索》</h3> 
  7.   <p>搜索講的是..</p> 
  8.   <h2>國外電影</h2> 
  9.   <h3>《冰川時代4》</h3> 
  10.   <p>冰川時代4講的是..</p> 
  11.   <h3>《在劫難逃》</h3> 
  12.   <p>在劫難逃講的是..</p> 
  13.   <p>以上內容由迅雷看看提供</p> 
  14. <div> 

可以看出,網頁大綱由標題的層級來生成。

如果想要查看這段代碼的大綱,可以試試Geoffrey Sneddon做的大綱工具Outliner(強烈推薦),上傳文件和輸入片段代碼都可以。如果想要查看在線網頁的大綱,可以給瀏覽器安裝插件:chrome:HTML5 Outliner(推薦)/ Web Devoloper,firefox:Web Devoloper;opera:HTML5 Outliner。(HTML5 Outliner里中文會顯示亂碼,建議換成英文測試。瀏覽器插件可以顯示中文)

每個標題都會生成一個隱性節點(implicit section),緊隨其后的相對層級低的標題會成為它的子節點,層級相同或者更高的標題則會關閉這個節點并生成新的節點。可以測試一下下面的代碼:

  1. <h3>《四大名捕》</h3> 
  2. <p>四大名捕講的是..</p> 
  3. <h3>《搜索》</h3> 
  4. <p>搜索講的是..</p> 

或者:

  1. <h3>《搜索》</h3> 
  2. <p>搜索講的是..</p> 
  3. <h2>國外電影</h2> 

節點元素生成的大綱

也許HTML5的結構會這樣寫:

  1. <div> 
  2.   <h6>8月電影推介</h6> 
  3.   <section> 
  4.     <h1>國內電影</h1> 
  5.     <article> 
  6.       <h1>《四大名捕》</h1> 
  7.       <p>四大名捕講的是..</p> 
  8.     </article> 
  9.     <article> 
  10.       <h3>《搜索》</h3> 
  11.       <p>搜索講的是..</p> 
  12.     </article> 
  13.   </section> 
  14.   <section> 
  15.     <h5>國外電影</h5> 
  16.     <article> 
  17.       <h6>《冰川時代4》</h6> 
  18.       <p>冰川時代4講的是..</p> 
  19.     </article> 
  20.     <article> 
  21.       <h1>《在劫難逃》</h1> 
  22.       <p>在劫難逃講的是..</p> 
  23.     </article> 
  24.   </section> 
  25.  
  26.   <p>以上內容由迅雷看看提供</p> 
  27. <div> 

(可以先注意一下上面這段代碼的各個hn)把代碼復制到Outliner工具去查看,很驚訝的發現,生成的大綱跟層級寫的很漂亮的HTML4一樣。為什么hn的層級在這里沒有表現出來?

原因是此時大綱是由節點元素生成的,而非標題元素。HTML5的新標簽section、article、aside、nav會生成顯性節點(explicit sections),每個顯性節點內部又有它自己的標題結構(當然也符合HTML4、HTML5大綱算法)。這也就是為什么HTML5允許多個h1存在的原因,不過,在全部瀏覽器、屏幕閱讀器都完美支持HTML5之前,建議還是需要同時考慮標題結構,優雅降級。所以上面的結構可以改成這樣:

  1. <div> 
  2.   <h1>8月電影推介</h1> 
  3.   <section> 
  4.     <h2>國內電影</h2> 
  5.     <article> 
  6.       <h3>《四大名捕》</h3> 
  7.       <p>四大名捕講的是..</p> 
  8.     </article> 
  9.     <article> 
  10.       <h3>《搜索》</h3> 
  11.       <p>搜索講的是..</p> 
  12.     </article> 
  13.   </section> 
  14.   <section> 
  15.     <h2>國外電影</h2> 
  16.     <article> 
  17.       <h3>《冰川時代4》</h3> 
  18.       <p>冰川時代4講的是..</p> 
  19.     </article> 
  20.     <article> 
  21.       <h3>《在劫難逃》</h3> 
  22.       <p>在劫難逃講的是..</p> 
  23.     </article> 
  24.   </section> 
  25.   <p>以上內容由迅雷看看提供</p> 
  26. <div> 

這里有另外一個問題值得注意,就是“以上內容由迅雷看看提供”這段話指的是上面的哪部分內容?在HTML4結構里,這段話是從屬于隱性節點“《在劫難逃》”的,但明顯不對。HTML5大綱算法就很好地解決了這個問題。

hn和節點元素同時生成大綱

如果頁面里既有隱性節點(h1~h6)又有顯性節點(section等),大綱又會如何生成呢?只要記住一點:顯性節點能包含隱性節點,反之則不行。

  1. <h1>8月電影推介</h1> 
  2. <section> 
  3.   <h2>國內電影</h2> 
  4.   <h3>《四大名捕》</h3> 
  5.   <p>四大名捕講的是..</p> 
  6.   <h3>《搜索》</h3> 
  7.   <p>搜索講的是..</p> 
  8. </section> 

(代碼1)

這段代碼的大綱會是: 

  1. 1.8月電影推介  
  2.   1.國內電影  
  3.     1.《四大名捕》  
  4.     2.《搜索》 
  1. <h1>8月電影推介</h1> 
  2. <h2>國內電影</h2> 
  3. <article> 
  4.   <h3>《四大名捕》</h3> 
  5.   <p>四大名捕講的是..</p> 
  6. </article> 
  7. <article> 
  8.   <h3>《搜索》</h3> 
  9.   <p>搜索講的是..</p> 
  10. </article> 

然而這段代碼的大綱會是:

  1. 1.8月電影推介  
  2.   1.國內電影  
  3.   2.《四大名捕》  
  4.   3.《搜索》  

由標題元素生成的隱性節點遇上由節點元素生成的顯性節點就會關閉并生成下一個同級節點。

未命名節點(untitled sections)

HTML5新節點元素除了section、article還有aside、nav,我們也來使用一下。

  1. <nav> 
  2.   <ul> 
  3.     <li><a href="">首頁</a></li> 
  4.     <li><a href="">專題</a></li> 
  5.     <li><a href="">關于</a></li> 
  6.   </ul> 
  7. </nav> 
  8. <h1>8月電影推介</h1> 
  9. <section> 
  10.   <h2>國內電影</h2> 
  11. </section> 
  12. <section> 
  13.   <h2>國外電影</h2> 
  14. </section> 

復制到outliner會發現, nav標簽會產生一個untitled section,因為nav里并沒有給予任何標題元素。這不是錯誤也不會被認為是不好的HTML5結構。但是section、article還是建議給予適當的標題。如果不確定可以給予什么標題,也許使用div更適合,不要忘了我們還有div啊。

根節點

前面提到一個重要的原則:顯性節點能包含隱性節點,反之則不行。也許你會注意代碼1生成的大綱:

  1. 1.8月電影推介  
  2.   1.國內電影  
  3.     1.《四大名捕》  
  4.     2.《搜索》  

標題元素h1(“8月電影推介”)下緊跟著的節點元素section(“國內電影”),變成了它的一個子節點。隱性節點不是不能包含顯性節點么?這時候就需要認識一下根節點了。

根節點可以生成自己的大綱,它的標題和節點對祖先的大綱沒有任何影響(而且不會出現在祖先大綱里)。目前有六個根節點:

1.body、2.blockquote、3.details、4.fieldset、5.figure、6.td

可以測試一下:

  1. <h1>我是老大 I'm the big brother</h1> 
  2. <blockquote> 
  3.   <section> 
  4.     <h1>我是blockquote里的老大,待會你看不到我了 I'm the big brother in blockquote,you'll not find me in the outliner</h1> 
  5.   </section> 
  6. </blockquote> 
  7. <h2>我是老二 I'm the younger</h2> 

定義文檔里說明了:節點元素是離它最近的祖先根節點或節點元素的子節點。代碼1里的標題元素h1(“8月電影推介”)是body的標題,節點元素section(“國內電影”)是body的子節點。

還有一個很重要的:文檔的標題是文檔中第一個且非節點元素里的標題元素。測試一下下面的代碼就很明了了:

  1. <section> 
  2.   <h1>我很想成為文檔的標題可惜不能 I want to be the title but I couldn't</h1> 
  3. </section> 
  4. <h6>雖然我層級最小可是我是第一個出現的 I'm h6 but I come first</h6> 
  5. <h1>最大也沒用順序我還是在老6下面 I'm h1 but I come after h6</h1> 

過程中我還遇到過另一個讓我迷惑的:

  1. <section> 
  2.   <h1>我很想成為文檔的標題可惜不能 I want to be the title but I couldn't</h1> 
  3. </section> 
  4. <section> 
  5.   <h2>我也很想成為文檔的標題可惜不能 Me either:(</h2> 
  6. </section> 
  7. <footer> 
  8.   <h3>我是footer可是為什么我成為了文檔標題啊 I'm footer but why I become the title??</h3> 
  9. </footer> 

原因很簡單,header和footer不是節點元素。

hgroup

hgroup很好理解也很好用,它的作用就是幫你添加副標題而不影響文檔大綱,大綱中只會出現層級最高的標題,無論出現順序。

  1. <hgroup> 
  2.   <h3>我是副標題,我很重要但我不會出現在大綱中 I'm your loved second title,I'm useful and I won't appear in the outliner</h3> 
  3.   <h2>我是大標題,我是故意跑到下面來的 I'm the highest level of hn in the group,no matter where I am,I will be part of ouliner</h2> 
  4. </hgroup> 

總結

到寫完這篇文章為止,好像還沒有哪個瀏覽器是完美支持HTML5大綱算法的。但這不影響我們對HTML5大綱算法的學習,就像我們現在在努力使用HTML5+CSS3一樣。理解了HTML5大綱算法,不僅對于新標簽的使用有更進一步的認識,而且對于最根本的頁面結構有更優化的理解,就算只是標題元素生成的大綱,也能擁有完美的層級結構,這也是語義化的一個標志。

特別感謝一下大安仔,是他提醒我要注意這個問題的。

參考學習文章:

http://www.osmn00.com/rebuild/223.html

http://www.456bereastreet.com/archive/201103/html5_sectioning_elements_headings_and_document_outlines/

http://coding.smashingmagazine.com/2011/08/16/html5-and-the-document-outlining-algorithm/

http://html5doctor.com/outlines/

https://developer.mozilla.org/en-US/docs/Sections_and_Outlines_of_an_HTML5_document

原文鏈接:http://cued.xunlei.com/log047

【編輯推薦】

  1. Go語言和HTML5構建一個Web聊天室
  2. 兄弟割席:HTML5標準制定組織分裂
  3. 百行HTML 5代碼實現四種雙人對弈游戲
  4. HTML 5帶來全新網絡格局
  5. Jscex和HTML 5制作的抽獎小程序
責任編輯:張偉 來源: 迅雷CUED
相關推薦

2013-01-24 10:26:04

HTML5HTML 5HTML5的未來

2013-01-21 13:52:47

2011-05-13 17:36:05

HTML

2011-12-31 11:11:01

2023-03-16 09:00:00

HTML5HTML語言

2012-07-30 10:18:21

HTML5

2011-05-11 18:00:10

HTML5兼容性

2013-10-21 15:24:49

html5游戲

2022-01-17 10:10:59

5G企業IT

2022-01-19 10:57:36

5G物聯網機器人

2011-08-01 15:06:57

HTML5

2012-05-29 09:23:23

HTML5移動應用框架jQTouch

2015-12-03 15:22:01

HTML5游戲建議

2012-08-17 10:22:26

HTML5性能瀏覽器

2011-05-13 17:41:40

2011-01-14 17:53:33

HTML5cssweb

2014-03-11 10:17:42

HTML5iOS

2017-01-03 18:09:33

HTML5本地存儲Web

2011-05-12 15:42:16

HTML5

2011-05-11 12:59:18

HTML5
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲欧美bt| 亚洲精品久久久久久久久久吃药 | 韩国av网站在线观看 | 欧美精品一区二区三区四区 在线 | 欧美日产国产成人免费图片 | 精品91久久久 | 美女黄色在线观看 | 久久av网站 | 亚洲欧美一区二区三区在线 | 精品久久久久久久 | 午夜无码国产理论在线 | 香蕉视频在线播放 | 亚洲日本三级 | 国产精品久久久久久久久久久久久 | 第一色在线 | 久久一区二区三区免费 | 亚洲国产欧美在线人成 | 日韩中文视频 | 日韩成人一区 | 色婷婷综合久久久久中文一区二区 | 国产欧美在线观看 | 色综合成人网 | 欧美综合视频 | 中文字幕亚洲欧美日韩在线不卡 | 久久久国产精品视频 | 国产一区 在线视频 | 国产精品久久久久久久久久久久久 | 成人av免费在线观看 | a久久 | 国产二区视频 | 精品av | 91一区二区三区 | 久草在线 | 成人av播放 | 91亚洲精 | 黄色一级电影在线观看 | 午夜精品久久久久久久星辰影院 | 精品久久久久久 | 午夜影院在线 | 二区不卡 | www.国产.com|