除了定義網(wǎng)頁的各個(gè)部分(例如“段落”或“圖片”)外,HTML還擁有一些用于定義網(wǎng)站區(qū)域的塊級元素(例如“標(biāo)題”,“導(dǎo)航菜單”,“主要內(nèi)容列”)。本文將探討如何規(guī)劃基本網(wǎng)站結(jié)構(gòu),并編寫HTML以表示此結(jié)構(gòu)。
前提: | 熟悉基本HTML,參考HTML入門。HTML文本格式,參考HTML文本基礎(chǔ)。超鏈接的工作原理,參考創(chuàng)建超級鏈接。 |
---|---|
目的: | 了解如何使用語義標(biāo)簽來構(gòu)建文檔,以及如何制定簡單網(wǎng)站的結(jié)構(gòu)。 |
網(wǎng)頁可以看起來彼此不同,但它們都傾向于使用類似的標(biāo)準(zhǔn)組件,除非該頁面顯示全屏視頻或游戲,是某種藝術(shù)項(xiàng)目的一部分,或者是結(jié)構(gòu)不當(dāng):
一個(gè)“典型網(wǎng)站”可以像這樣布置:
上面顯示的簡單示例不是很漂亮,但是非常適合用于說明典型的網(wǎng)站布局。一些網(wǎng)站有更多的列,有些網(wǎng)站更復(fù)雜,但你會有你的想法。使用正確的CSS,你可以使用幾乎任何元素來裝飾不同的部分,并得到你想要的結(jié)果,但是如前所述,我們需要遵循語義,并使用正確的元素進(jìn)行語義化工作。
這是因?yàn)橐曈X效果并不能說明整個(gè)故事。我們使用顏色和字體大小來吸引用戶對內(nèi)容最有用的部分的關(guān)注,例如導(dǎo)航菜單和相關(guān)鏈接,但是視覺障礙的人該怎么辦,那些“粉紅色”和“大字體”的概念對他們來說有用嗎?
注意:色盲患者大概占了世界人口的8%。盲人和視障人士約占世界人口的4-5%(2012年全球有2.85億這樣的人,而全球總?cè)丝谑谴蠹s70億)。
在你的HTML代碼中,你可以根據(jù)其功能標(biāo)記內(nèi)容部分 - 你可以明確地使用代表上述內(nèi)容部分的元素,而像屏幕閱讀器這樣的輔助技術(shù)可以識別這些元素,并幫助執(zhí)行諸如“查找主導(dǎo)航”或“查找主要內(nèi)容”等任務(wù)。正如我們之前在課程中提到的,沒有將正確的元素結(jié)構(gòu)和語義用于對應(yīng)的工作中,會產(chǎn)生一些后果。
為了實(shí)現(xiàn)這種語義標(biāo)記,HTML提供了可以用來表示這些部分的專用標(biāo)簽,例如:
<header>
。<nav>
。<main>
,由<article>
,<section>
和<div>
元素表示各種內(nèi)容分段。<aside>
;經(jīng)常放在<main>
內(nèi)。<footer>
。我們上面所看到的例子用下面的代碼表示(你也可以在我們的Github repo中找到該示例)。我們希望你看看上面的例子,然后查看下面的列表,觀察哪些部分組成上面所討論的內(nèi)容(標(biāo)題、導(dǎo)航欄、主要內(nèi)容、側(cè)邊欄、頁腳)。
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>My page title</title> <link href="https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300|Sonsie+One" rel="stylesheet" type="text/css"> <link rel="stylesheet" href="style.css"> <!-- the below three lines are a fix to get HTML5 semantic elements working in old versions of Internet Explorer--> <!--[if lt IE 9]> <script src="http://html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> </head> <body> <!-- Here is our main header that is used accross all the pages of our website --> <header> <h1>Header</h1> </header> <nav> <ul> <li><a href="#">Home</a></li> <li><a href="#">Our team</a></li> <li><a href="#">Projects</a></li> <li><a href="#">Contact</a></li> </ul> <!-- A Search form is another commmon non-linear way to navigate through a website. --> <form> <input type="search" name="q" placeholder="Search query"> <input type="submit" value="Go!"> </form> </nav> <!-- Here is our page's main content --> <main> <!-- It contains an article --> <article> <h2>Article heading</h2> <p>Lorem ipsum dolor sit amet, consectetur adipisicing elit. Donec a diam lectus. Set sit amet ipsum mauris. Maecenas congue ligula as quam viverra nec consectetur ant hendrerit. Donec et mollis dolor. Praesent et diam eget libero egestas mattis sit amet vitae augue. Nam tincidunt congue enim, ut porta lorem lacinia consectetur.</p> <h3>subsection</h3> <p>Donec ut librero sed accu vehicula ultricies a non tortor. Lorem ipsum dolor sit amet, consectetur adipisicing elit. Aenean ut gravida lorem. Ut turpis felis, pulvinar a semper sed, adipiscing id dolor.</p> <p>Pelientesque auctor nisi id magna consequat sagittis. Curabitur dapibus, enim sit amet elit pharetra tincidunt feugiat nist imperdiet. Ut convallis libero in urna ultrices accumsan. Donec sed odio eros.</p> <h3>Another subsection</h3> <p>Donec viverra mi quis quam pulvinar at malesuada arcu rhoncus. Cum soclis natoque penatibus et manis dis parturient montes, nascetur ridiculus mus. In rutrum accumsan ultricies. Mauris vitae nisi at sem facilisis semper ac in est.</p> <p>Vivamus fermentum semper porta. Nunc diam velit, adipscing ut tristique vitae sagittis vel odio. Maecenas convallis ullamcorper ultricied. Curabitur ornare, ligula semper consectetur sagittis, nisi diam iaculis velit, is fringille sem nunc vet mi.</p> </article> <!-- the aside content can also be nested within the main content --> <aside> <h2>Related</h2> <ul> <li><a href="#">Oh I do like to be beside the seaside</a></li> <li><a href="#">Oh I do like to be beside the sea</a></li> <li><a href="#">Although in the North of England</a></li> <li><a href="#">It never stops raining</a></li> <li><a href="#">Oh well...</a></li> </ul> </aside> </main> <!-- And here is our main footer that is used across all the pages of our website --> <footer> <p>©Copyright 2050 by nobody. All rights reversed.</p> </footer> </body> </html>
花一些時(shí)間來查看代碼并理解它 - 代碼中的注釋也可以幫助你理解它。我們不要求你在這篇文章中做許多其他事情,因?yàn)槔斫馕臋n布局的關(guān)鍵是編寫一個(gè)完整的HTML結(jié)構(gòu),然后用CSS布局。等你學(xué)習(xí)到CSS布局部分的時(shí)候才能完全理解上面的代碼。
從總體詳細(xì)的理解HTML分段元素是不錯(cuò)的 - 隨著你web開發(fā)經(jīng)驗(yàn)的逐漸積累,你將會逐漸深入理解。你可以通過查閱HTML元素參考找到更多的細(xì)節(jié)?,F(xiàn)在,你需要理解這些元素的主要定義:
<main>
展現(xiàn)了頁面內(nèi)容的獨(dú)特性。每一個(gè)頁面上只可以使用一次<main>
,并直接把它放到<body>
中。在理想情況下,不應(yīng)該把它嵌套進(jìn)其他的元素中。<article>
閉合一塊與自身相關(guān)的內(nèi)容,這塊內(nèi)容能夠解釋它自身而不是頁面上其他的內(nèi)容(例如一篇單獨(dú)的博客)。<section>
近似于<article>
,但是它更多的是將構(gòu)成一個(gè)單獨(dú)功能的頁面的單個(gè)部分(例如一個(gè)小型的地圖,或者是一組文章的標(biāo)題和摘要)組合在一起。被認(rèn)為最好的實(shí)際應(yīng)用是用標(biāo)題作為每一部分(section)的開頭;也要注意的是你可以把不同的<article>
分到不同的<section>
中,或者把不同的<section>
分到不同的<article>
中,這要取決于上下文。<aside>
包含的內(nèi)容并不與主要內(nèi)容有直接的聯(lián)系,但是它可以提供額外的不直接有聯(lián)系的信息(詞匯條目,作者簡介,相關(guān)鏈接等等)。<header>
展現(xiàn)了一系列的介紹性內(nèi)容。如果它是<body>
的子元素,它就定義了網(wǎng)站的全局頭部。但是如果它是<article>
或<section>
的子元素,它就定義了這些部分的特定的頭部(不要把這它與title和heading混淆)。<nav>
包含了頁面主要的導(dǎo)航功能。二級鏈接等,不會進(jìn)入導(dǎo)航功能部分。<footer>
包含了頁面的頁腳部分。有時(shí)候,你會遇到一種情況,你找不到理想的語義元素將一些項(xiàng)目組合起來或者包裝一些內(nèi)容。有時(shí)候你可能只想僅僅用CSS或JavaScript將一組元素作為一個(gè)單獨(dú)的實(shí)體來修飾。為了應(yīng)對這種情況,HTML提供了<div>
和<span>
元素。你應(yīng)該優(yōu)先使用合適的class
屬性來提供一些標(biāo)簽,這樣它們就能比較容易被找到。
<span>
是一個(gè)內(nèi)聯(lián)非語義元素,你應(yīng)該僅僅在無法找到更好的語義元素包裝內(nèi)容時(shí)使用,或者不想增加任何特定的含義。例如:
<p>The King walked drunkenly back to his room at 01:00, the beer doing nothing to aid him as he staggered through the door <span class="editor-note">[Editor's note: At this point in the play, the lights should be down low]</span>.</p>
在這種情況下,編劇的筆記應(yīng)該只是為戲劇導(dǎo)演提供額外的指導(dǎo);不應(yīng)該有額外的語義意義。對于觀看的用戶,CSS可能用于將筆記與主文本稍微隔開。
<div>
是一個(gè)塊級非語義元素,僅在你找不到更好的塊級語義元素,或者不想增加任何特定的意義時(shí)使用。例如,想象當(dāng)你瀏覽一個(gè)電商網(wǎng)站時(shí),你可以隨時(shí)選擇拉取一個(gè)購物車部件:
<div class="shopping-cart"> <h2>Shopping cart</h2> <ul> <li> <p><a href=""><strong>Silver earrings</strong></a>: $99.95.</p> <img src="../products/3333-0985/" > </li> <li> ... </li> </ul> <p>Total cost: $237.89</p> </div>
這不是一個(gè)真正的<aside>
,因?yàn)樗椭饕獌?nèi)容并沒有必要的聯(lián)系(你想在任何地方都能看到它)。它甚至不會特別保證使用<section>
,因?yàn)樗皇琼撁嬷饕獌?nèi)容的一部分。所以在這種情況下用<div>
是合適的。我們已經(jīng)將標(biāo)題包含進(jìn)去作為幫助屏幕閱讀者查找的引導(dǎo)。
警告:Div使用起來非常方便以至于很容易就被濫用。因?yàn)樗鼈儾粩y帶語義值,所以會讓你的HTML代碼變的混亂。要小心的使用它們,只有當(dāng)沒有更好的語義解決方案才使用,而且要盡可能把它的使用量降到最低,否則,當(dāng)你升級和維護(hù)你的文檔時(shí)會非常困難。
<br>
和<hr>
將會是你偶爾使用并且想要了解的兩個(gè)元素:
<br>
在一個(gè)段落中創(chuàng)建一個(gè)換行;在你想要一系列的固定短行的地方,它是唯一能夠生成這種結(jié)構(gòu)的元素,例如一個(gè)郵寄地址或一首詩。例如:
<p>There once was a girl called Nell<br> Who loved to write HTML<br> But her structure was bad, her semantics were sad<br> and her markup didn't read very well.</p>
如果沒有<br>
元素,這一段將只會呈現(xiàn)在一個(gè)長行中(正如我們之前課程中所述,HTML忽略大多數(shù)空格 );代碼中有了<br>元素,會生成下面這樣的:
There once was a girl called Nell
Who loved to write HTML
But her structure was bad, her semantics were sad
and her markup didn't read very well.
<hr>
元素在文檔中創(chuàng)建一條水平分割線,表示文本中主題的變化(例如主題或場景的變化)。視覺上它看起來像一條水平線。舉個(gè)例子:
<p>Ron was backed into a corner by the marauding netherbeasts. Scared, but determined to protect his friends, he raised his wand and prepared to do battle, hoping that his distress call had made it through.</p> <hr> <p>Meanwhile, Harry was sitting at home, staring at his royalty statement and pondering when the next spin off series would come out, when an enchanted distress letter flew through his window and landed in his lap. He read it hasily, and lept to his feet; "better get back to work then", he mused.</p>
將呈現(xiàn)如下:
Ron was backed into a corner by the marauding netherbeasts. Scared, but determined to protect his friends, he raised his wand and prepared to do battle, hoping that his distress call had made it through.
Meanwhile, Harry was sitting at home, staring at his royalty statement and pondering when the next spin off series would come out, when an enchanted distress letter flew through his window and landed in his lap. He read it hasily and sighed; "better get back to work then", he mused.
一旦你規(guī)劃了一個(gè)簡單網(wǎng)頁的內(nèi)容,接下來的合乎邏輯的步驟就是嘗試找出你想要放在整個(gè)網(wǎng)站上的內(nèi)容,你需要什么頁面,以及如何排列和鏈接到彼此,以獲得最佳的用戶體驗(yàn)。這被稱信息架構(gòu)。在一個(gè)大型、復(fù)雜的網(wǎng)站上,很多規(guī)劃都可以進(jìn)入這個(gè)過程,而對于一個(gè)簡單的網(wǎng)站的幾個(gè)頁面,這可以是相當(dāng)簡單、有趣的!
嘗試對你自己創(chuàng)建的網(wǎng)站進(jìn)行上述練習(xí)。你想做什么樣的網(wǎng)站?
注意:將你的工作保存在某處;你以后可能需要它。
總結(jié)
此時(shí),你應(yīng)該更好地了解了如何構(gòu)建網(wǎng)頁/網(wǎng)站。在本單元的最后一篇文章中,我們將學(xué)習(xí)如何調(diào)試HTML。
更多建議: