跳到主要內容

HTML Element 使用整理

本篇文章專注於HTML標籤,盡量少提 JavaScript和CSS

一個網頁的格式大致如下:
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>Index</title>
    ...
</head>

<body>
    ...    //元素標籤撰寫處
</body>
</html>

Doctype標籤宣告html文件版本
在過去會看到各式各樣的宣告,如html4:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

在過去的發展中,HTML有各式各樣的版本,目前最新的為HTML5
在HTML5以後只要使用<!DOCTYPE html>就能宣告為網頁文件
以後的版本也只要這樣即可,而且這個標籤能相容於舊瀏覽器

<meta>元素包含在<head>元素內,紀錄網頁的相關資訊
這些資訊並非記載給使用者看,而是提供給搜尋引擎
使用上透過name屬性標註網頁特性,content屬性則記錄特性值,能設定的大致如下:

<meta name="description" content="test page" />
description描述網頁特性給搜尋引擎,最多能用155字元

<meta name="keywords" content="test,html" />
keywords包含了使用者可能用來搜尋此網頁的字詞清單,使用","分隔
目前對搜尋引擎的索引效果已經不大了

<meta name="robots" content="nofollow" />
robots標明搜尋引擎是否該加入頁面到搜尋結果中,不想被加入的話指定值為noindex
若允許加入此頁面,但不加入此頁連結的其他頁面則使用 nofollow

另有http-equiv屬性標註不同目的
<meta http-equiv="author" content="vencil" /> 標註網頁作者
<meta http-equiv="pragma" content="no-cache" /> 指定pragma為no-cache能避免瀏覽器儲存cache
指定頁面語系則使用<meta charset="utf-8">的形式

若要在頁面下註解需使用<!-- 註解 --> 的形式
註解能下在文件中的任何地方,作為提醒或記錄設計者之用,而不會在頁面上顯示出來

我們在網頁中使用的每一項元素均由標籤構成
元素標籤的擺放位置於<body>標籤之中
要寫出良好的網頁便要了解各種標籤的使用方式

每個元素均可被指定 id、class屬性
id能代表在頁面中的特定元素,所以每個id在頁面裡均應為唯一值
class屬性則能對元素進行分類,以方便群組操作
這兩種屬性均常應用在JavaScript操作和CSS套用

結構標籤

<h1></hi>~<h6></h6>  標題標籤,h1最大,h6最小

<p></p>      段落文字標籤,預設值中瀏覽器會使用新的一行來顯示每個段落
                    段落之間也會保留一些空間。

<b></b>      粗體標籤

<i></i>        斜體標籤

<sup></sup>  上標,被標注在其中的文字呈現方式就像是數學中的次方

<sub></sub>  下標,和上標相反,常用在註解或化學式

<br />       斷行標籤

<hr />       水平線標籤,可以用於區隔不同主題

為了網頁的易讀性,編輯者常在其中加入一些空白
當瀏覽器遇上兩個或以上的空白時,它只會顯示一個
如果遇到斷行也是視為單一空白字元處理
這種處理方式被稱為空白壓縮(white space collapsing)

語法標籤

語法標籤用在更精確地描述網頁內容
螢幕閱讀器或搜尋引擎可以使用這些額外資訊
例如搜尋引擎可能會將網頁中用了<blockquote>的內容登錄起來

<strong></strong>  表示內容重要程度,瀏覽器預設以粗體顯示<strong>裡的內容

<em></em>           表示了文義轉折的強調字眼,瀏覽器預設以斜體顯示

<blockquote></blockquote>  <blockquote>是標示引述
                                              用在較長的文章篇幅,裡面的內容應該用<p>包著
                                              大多數瀏覽器會將包在裡面的文字縮排
                                              但若僅要縮排效果的話不應該使用這個標籤,應改用CSS達成

<q></q>    用在段落中比較短的引述
                  因為IE在顯示<q>上會與其他瀏覽器有差異,所以也是有人不使用<q>。

兩種引述標籤都可以使用cite屬性標明引述來源
其值必須要是URL,這樣才能提供更多資訊

<abbr></abbr>    標記縮寫或縮略字,其title屬性可以標記其全名
                            在HTML4中有一個專門給縮略字用的<acronym>標籤
                            但HTML5在兩者都使用<abbr>

<cite></cite>    指引讀者參考書籍、電影或論文等。在HTML5中這個標籤不應該用在人名上

<dfn></dfn>       在文件中第一次解釋某些術語時使用(defining instance)
                          有些瀏覽器會將dfn中的內容顯示為斜體

<address></address>    用來包含網頁作者的聯絡細節,瀏覽器通常以斜體表示

<ins></ins>       用來顯示被出入文件的內容,通常瀏覽器是以加上底線表示

<del></del>       用來顯示被刪除的文字,通常瀏覽器是在文字上加上刪節線表示

<s></s>           此標籤用來標示不再正確(但不該刪掉)的內容

功能性標籤

清單的項目均是用<li>標籤表示(list item),在預設值下瀏覽器會縮排清單
雖然清單標籤有type屬性可以指定編號類型,但最好還是用CSS list-style-type
編號清單(ordered list)標籤<ol></ol>、項目清單標籤(unordered list)<ul></ul>
定義清單稍微特殊一點<dl></dl>
裡面包含<dt></dt>標籤來容納要被定義的名詞,<dd></dd>則容納其解釋
實務上有可能發生複數名詞共用同樣的定義,或同一個名詞有不同定義
清單本身可以做成巢狀結構,瀏覽器也通常會改變符號的樣式
清單使用形式:
<ul>
    <li></li>
    <li></li>
</ul>

網頁的連結是用<a>元素製作
其href屬性設定欲前往的頁面,如果在同一網域的頁面可以使用相對URL表示
<a> 元素的target屬性若設定成 _blank 則會在新視窗中開啟連結頁面
除了連結到其他頁面外,也可以設定成EMAIL連結,href屬性增加mailto即可,如:
  <a href="mailto:a@a.com">mail to a</a>
而如果是要連到同網頁的某個部分,則寫成 <a href="#topBar">連結標題列</a>這樣的形式
href裡填上'#' 和頁面中某個元素的id後就可以連結到該元素
要連結到其他頁面的某個部份則依此類推, <a href="...otherPage/#topBar">...</a>

圖片的標籤是<img>,它是一個空白元素
意思是他沒有結束標籤,而是在標籤結尾增加 "/" 表示內容結束
其中有幾個屬性可以使用:
src指定圖片的位置
alt提供該圖片的文字敘述,當圖片無法顯示時便會以這段文字代替
title屬性提供圖片額外的資訊,大部分瀏覽器的處理方式是滑鼠移到圖片上時會出現提示
 height、width屬性現在較常以CSS指定

如果<img>後跟著<h1>、<p>等區塊元素,區塊(block)元素則會在圖片後另起一行
若跟著<b>、<em>、<img>等行內(inline)元素,則不會換行

圖片的格式選擇上
建議當使用一張有許多顏色(雪地、天空等也是,他們並非單色)的圖片時用JPEG
而當圖片顏色較少或單色較多時採用GIF或PNG
因多數桌上型電腦的網頁瀏覽器的解析度是72像素
使用較好解析度的圖片並不會有較好的效果,只會因為檔案變大而增加傳輸成本

HTML5中增加了<figure>元素,他組合了圖片及其解說(<figcaption>標籤)
其中的圖片可以放置一張以上,如果他們共用相同的說明的話
<figure>
    <img src="/new.jpg" alt="test" />
    <br />
    <figcaption>HTML5 feature!</figcaption>
</figure>


網頁的表格可以使用<table>標籤製作
基本的table結構大致如下
<table>
    <tr>
        <th scope="col">title1</th>
        <th scope="col">title5</th>
        <th scope="col">title3</th>
    </tr>
    <tr>
        <th scope="row">row title</th>
        <td>3</td>
        <td>4</td>
    </tr>
</table>

<tr> 標籤區分每一列的內容,<td>則表示儲存格,td就是table data的意思
這三種標籤就是表格最基本的組成

<th>的用法和<td>相同,但<th>標籤的意思是欄或列的標題,th=table heading
使用<th>標籤除了方便控制表格外觀外,對於搜尋引擎的檢索也有幫助
<th>可以指定scope屬性來標記他是欄或列的標題
瀏覽器通常會以粗體以及放置於儲存格中央的外觀顯示<th>
<th>或<td>均可指定 colspan (橫向)或 rowspan (縱向)屬性來做到儲存格合併的效果,例如:
<td colspan="2">...</td>
這個<td>標籤會佔據原本橫向<td>的寬度,而該位置原本的兩個<td>就不需要寫了
另外在表格裡面還有些標籤可以使用
<table>
   <colgroup>
        <col style="background-color:red">
        <col style="background-color:yellow">
    </colgroup>
    <thead>
        <tr>...</tr>
    </thead>
    <tbody>
        <tr>...</tr>
    </tbody>
    <tfoot>
        <tr>...</tr>
    </tfoot>
</table>

<colgroup>是個有趣的標籤
如果產出的Table要套用不能預先固定的CSS內容,例如依內容調整欄位寬度等
你可以在Table開頭使用這個標籤指定,table的後續欄位會套用<col>上的CSS指定

<thead>標籤放置表格的標題、<tbody>放置內容、<tfoot>放置註腳
製作長表格時可以利用這3種標籤
三者與<th>一樣不會對使用效果有影響,但區別出這些部位對於使用CSS控制外觀有所幫助


一個表單可能會使用多個表單控制項來收集資訊
所有的控制項必須位於<form>元素內
這個標籤的action屬性指定接收被送出資訊的網頁URL
method屬性能指定 get/post
target屬性則能設定回應的顯示方式,共有_self、_blank、_parent、_top、framename
_self是這個屬性的預設值,指定回應顯示在目前的頁面框架中
_blank指定回應顯示在新的視窗/分頁,_parent指定回應顯示在母視窗,_top指定回應顯示在網頁結構上層
其實這個屬性並不常使用,少數會用到的需求則是將此屬性指定為iframe的名稱
這樣一來就可以讓表單送出的回應內容顯示在 iframe 中,有些特殊技巧需藉此達成

表單及其內的控制項通常會指定 id 及 name 屬性
name屬性能讓server side辨識表單及控制項

method指定get時,表單的值會被加到action屬性指定的URL,也因此特性的安全考量
get方法適用於不涉及修改資料庫內容的處理
post方法則會透過HTTP header傳送資料,適用於檔案上傳、有安全需求的處理

需要注意一點的是,雖然控制項能獨立存在,並發揮輸入等功能
但部分功能,特別是HTML5中新增的validation等功能,需要控制項存在於form元素中才能生效
而瀏覽器自動記憶登入過的帳號、密碼也是如此
當然如果是刻意讓登入用的輸入框不會記憶輸入過的資料,則可以讓目標控制項獨立存在
所以如果沒什麼特殊目的的話,撰寫輸入控制項時最好還是將其放在form元素中

<input> 元素經指定其type屬性,能製作幾種不同的表單控制項,<input> 本身是個空白元素

type="text" - 單行的文字輸入欄位
                     maxlength屬性能限制使用者可輸入的文字數,而size屬性能設定欄位寬度

type="password" -  製作一個顯示上會遮蔽內容的文字輸入欄位,它能使用的屬性同 "text"

type="radio" - 製作單選控制項,name屬性值相同的radio控制項會被視為同一個選項組合
                      value屬性設定了要送到server的值
                      checked屬性可以設定"checked"值,表示預先選好的選項
                      同一組中只能有一個單選按鈕使用這個屬性

注意單選按鈕一旦選取後就無法取消選取,除非選取同一組的其他單選按鈕
所以若只提供一個選項時,使用勾選按鈕會是比較好的做法

type="checkbox" - 勾選按鈕和單選按鈕的使用相同
                             差別在於它能用來選取同一選項組中的多個選項

type="file" - 製作上傳檔案用的欄位,注意使用時form的method屬性需指定為post
                   選擇上傳檔案時用的視窗依作業系統而定,無法控制

type="button" - 跟下面提到的<button>標籤可以相互替代,製作一顆沒有功能的按鈕

type="submit" - 按下按鈕會送出表單到server,其value屬性可以設定按鈕上的文字

type="image" - 製作一個使用圖片作為外觀的 submit 按鈕
                       它能使用src、alt、width、height等<image>標籤能用的屬性

type="reset" -   製作一個清除表單中已輸入的資料的按鈕

type="hidden" - 製作一個隱藏的表單控制項,此控制項不會顯示在頁面上
                         透過指定其value屬性可以讓我們暗中紀錄並送出某些值

<textarea>元素能製作多行文字的輸入區塊
位在開始標籤和結束標籤之間的文字會出現在文字區塊內
文字區塊內的文字會再送出表單時一併被送到server端

<select>標籤能製作下拉選項
name屬性指定了和被選取的選項值一起送到server的控制項名稱
下拉選項須搭配<option>標籤製作的選項使用,如:
<select name="s">
    <option value="op1">option1</option>
    <option value="op1">option1</option>
</select>

<option>的起始標籤和結束標籤間的文字會被顯示在下拉選單中
<option>元素使用value屬性指定在該選項被選取時,送到server的值
selected屬性能設定"selected"值指定預先選取的選項
如果沒用selected屬性指定選取的選項,預設會是第一個選項

<select>可另外指定size屬性轉變為多重選擇區塊
size指定的值便是一次顯示出來的選項項目
須注意瀏覽器對此屬性的支援可能不夠好,特別是Mac上的版本
multiple屬性指定為"multiple"值後則能讓使用者能選擇多重選項
選擇時在PC上需按住ctrl鍵,Mac則是command鍵

<button>元素的設計用意是讓使用者自行控制按鈕外觀
其type屬性共有三種值 button、submit、reset,預設是submit
所以對於開發人員比較麻煩的是,如果你的button element不打算做submit,一定要設定type屬性
使用上相當於<input>元素,差別在於允許其他元素放置在<buton>元素裡,如:
<button><img src="test.gif" /> test</button>   //this sample is almost the same as <input type="image" />


<label>元素如同其名,正是做為控制項的說明標籤存在
<label>元素的for屬性值搭配表單控制項的id屬性更是好用,如:
<input id="demo" type="checkbox" value="r" /><label for="demo">click me!</label>
將label的for屬性指定為控制項的id後就形同一組,點擊label也同時會有點擊checkbox的效果
具有擴大點擊區域、增加使用者易用度的效果在
在JavaScript中要指定for屬性須改用label.htmlFor = "..." 這樣的形式以避免與for關鍵字重複

<fieldset>可以集結相關的表單控制項,大部分的瀏覽器看來fieldset的四周會是以線條包著
在表單內容較長時,很適合讓區域的劃分更明確
<legend>元素放在<fieldset>開始標籤後,做為整組fieldset的標題存在,使用如下:
<fieldset>
    <legend>demo fieldset</legend>
    <input id="demo" type="checkbox" value="r" />
    <label for="demo">click me!</label>
</fieldset>

以上這些用來提交資訊的元素有些共通屬性,大部分是針對表單內的處理
設定 readonly 屬性可以讓元素保持唯讀狀態,無法修改其內容
設定 disabled 屬性會讓元素無法被操作,在大部分瀏覽器看到的效果會套上灰色的區別色
disabled屬性有一個特點滿有趣的,該元素不會跟著表單被送出去,所以常搭配JavaScript使用


<iframe>標籤能製作 inline frame ,能將其他頁面的內容鑲到目前頁面
其中的屬性有 src 指定顯示於框內的頁面URL 、height指定iframe高度、width指定寬度
seamless則是HTML5新增的屬性,能套用到不需要卷軸的iframe上

html5 對表單裡的input控制項增加了許多新特性
以往的一些需要用JavaScript或server端達成的功能可以轉移用html5做
當然考量目前還須對舊瀏覽器相容,還沒辦法完全倚賴html5
各家瀏覽器對於使用上增加了不少協助,對於表單驗證、使用者體驗有很大的提升
以下用一個表單做示範

<form name="html5" action="" method="post">
    <fieldset>
        <legend>demo fieldset</legend>
        <label for="pw1">Password:</label>
        <input type="password" name="pw1" id="pw1" required onchange="checkPasswords();" />
        <br />
        <label for="pw2">Confirm Password:</label>
        <input type="password" name="pw2" id="pw2" required onchange="checkPasswords();">
        <br />
        <button onclick="document.html5.pw1.checkValidity();">Check Validity</button>
        <br />
        <label for="pd">patternDemo</label>
        <input id="pd" type="text" autofocus pattern="[0-9]+" />
        <br />
        <label for="search">search</label>
        <input id="search" type="search" placeholder="enter word" autocomplete="on" />
        <br />
        <label for="number">number</label>
        <input id="number" type="number" min="1" max="13" step="2" value="3" />
        <br />
        <label for="range">range</label>
        <input id="range" type="range" min="1" max="13" step="2" value="3" />
        <br />
        <label for="url">url</label>
        <input id="url" type="url" />
        <br />
        <label for="color">color</label>
        <input id="color" type="color" />
        <br />
        <label for="mail">email</label>
        <input id="mail" type="email" />
        <br />
        <label for="date">Date</label>
        <input id="date" type="date" required />
        <br />
        <input type="submit" value="submit" />
    </fieldset>
</form>

<script>
  function checkPasswords() {
      var pass1 = document.getElementById("pw1");
      var pass2 = document.getElementById("pw2");

      if (pass1.value != pass2.value) pass1.setCustomValidity("密碼不同");
      else pass1.setCustomValidity("");
  }
</script>

首先第一部分先來觀察 password 組的情況
password裡增加了 required 特性
增加了此特性的欄位為必填欄位,瀏覽器會針對未填寫值的必填欄位做提醒
在HTML4的規範中,每種屬性值都必須有值
所以若要符合HTML4的標準也常看到 required = "required" 這樣的寫法
其餘HTML5新增的屬性也是依此類推

每當兩個password被鍵入文字時都會呼叫checkPasswords()比對
透過HTML5新增的 setCustomValidity() 設定驗證狀態的文字
當表單被送出或Check Validity按鈕按下時的 checkValidity() 這個HTML5方法均會觸發控制項的驗證
當然後者因只指定document.html5.password1做驗證,不影響其他控制項
以此例來說,會先驗證 required 值,若均無填寫密碼,則會優先提醒需輸入密碼
若有輸入密碼後才會跳出 setCustomValidity() 設定的驗證狀態
另外就是經過測試,控制項的<input type="button" />無法觸發checkValidity();
但<button>元素則可以,這點就當作測試時的小細節吧

要取得驗證結果的另一方法是藉由取得控制項的驗證物件後
再透過其valid屬性得知驗證結果,如下:
var pwCheck = document.getElementById("password").validity;
if(pwCheck.valid){....}

接著看 patternDemo
這裡設定了 autofocus ,一樣常見到 autofocus = "autofocus" 的寫法
表單中會自動focus在唯一被設定的元素上,若有複數的元素設定此屬性則無效
pattern裡可輸入正規表示法做驗證,例如此處便限制 pd 只能輸入數字

type="search" 製作一個搜尋輸入框
placeholder屬性為輸入框中的輸入提示文字,外觀多半為灰色,在使用者開始輸入後就消失了
autocomplete屬性則選擇是否讓自動完成功能開啟(on/off)

type="number" 和 type="range" 相近,均是讓使用者選定範圍內的數字
只是呈現方式有別,後者外觀是橫向的拖曳軸
min 和 max 可指定其上下限,step是一次變動的數值量,value屬性則能指定預設值

type="url" 會驗證輸入的內容是否為url
如果不是(猜測是不含.com結尾之類的)則瀏覽器會提示驗證失敗,需輸入正確格式後才能送出表單資訊

type="color" 製作一個顏色選擇器

type="email" 會驗證輸入內容是否為mail網址(推測是判斷@符號和.com之類的網址結尾)

type="date" 製作日期選擇器,個人認為這是各家瀏覽器實作上差異最多的部分
例如safari核心的瀏覽器可能會是一個很漂亮的轉輪選擇器


影片的播放已經在網路上的常見需求,而HTML5規格提出的時候也有相關的規定
現在已經可以透過<video>標籤來直接撥放影片,而不需要另外透過第三方外掛(如:Flash)
如果要讓舊瀏覽器支援,也有open source的video4all可以選擇
只是瀏覽器因編碼格式的專利規範或權利金等因素,而有不同的支援,使用時要特別注意
目前Chrome支援的編碼種類最廣;Firefox支援webM、Ogg;IE和Safari則支援mp4
使用時最好預先提供數種格式,使用如下:
<video controls preload="metadata" poster="images/test.png">
    <source src="test.mp4" type='video/mp4; codecs="avc1.42E01E, mp4a.40.2"' />
    <source src="test.webm" type='video/webm; codecs="vp8, vorbis"' />
    <source src="test.ogv" type='video/ogg; codecs="theora, vorbis"' />
    <p>test HTML video tag</p>
</video>

影片來源可以直接寫在video標籤的src屬性中
但如果有提供多種格式,也可以像範例一樣寫在<source>標籤裡
瀏覽器播放時會從從頭開始檢查,如果碰到支援的格式,就會設定播放該影片
假如<source>標籤沒有指定type,則瀏覽器會下載部分影片測試是否能撥放,如此會浪費一些頻寬
不支援<video>標籤的瀏覽器,會因此只顯示出標籤內的文字

video標籤有幾個屬性,controls會開啟瀏覽器提供的影片撥放控制器
preload屬性有三種設定值 -
"none"為在使用者按下撥放前,不預先載入影片,"auto"則是網頁載入時自動載入影片
"metadata"則是僅收集影片相關資訊,如片長、大小、撥放清單等
autoplay屬性則是設定後,影片會自動撥放
loop屬性則是設定撥放完畢後會重新撥放
poster設定播放前或影片還在下載時,預先展示的影像

<audio>標籤和<video>標籤類似,用途是撥放音樂,如:

<audio controls="controls" autoplay loop>
    <source src="/sound/test.mp3" type="audio/mp3" />
    <source src="/sound/test.ogg" type="audio/ogg" />
    <source src="/sound/test.aac" type="audio/aac" />
    <source src="/sound/test.wav" type="audio/x-wav" />
</audio>

preload、autoplay、loop、controls等屬性用途也幾乎同<video>



有些元素在使用上會在瀏覽器裡另起一行,被稱為區塊層級元素(block level)
包含了<h1>、<p>、<ul>、<li>等
有些元素則會和鄰近元素保持在同一行,被稱為行內元素(inline)
包含了<a>、<b>、<em>、<img>等

HTML裡提供了<div><span>兩種標籤來進行元素的群組分類
<div>可以將一組元素組合成一個區塊層級的方塊
使用上會將裏頭的內容另起一行,而透過id和class屬性的使用也會讓管理及外觀操作更加方便
<span>則是<div>的行內版本,適用於1.區隔部分文字 2.容納數個行內元素

因為過往常見<div>的大量使用(濫用),HTML5提出了一些標籤讓元素的群組分類更明確
這些標籤待日後補上整理

留言