顯示具有 CSS 標籤的文章。 顯示所有文章
顯示具有 CSS 標籤的文章。 顯示所有文章

2010/11/13

Firefox 4 的 HTML5 表單

WW1 Certificate Of Employment - Army Form Z.18- Part I

(廣義的)HTML5 除了絢麗的各種 CSS3 及新 JavaScript API 組合技之外,還有一個十分實用、卻比較容易忽略的 HTML5 Forms。Firefox 4 實作了其中不少東西,這篇文章將大致介紹一下這玩意。

本文編譯自 Mozilla Hacks 的文章:Firefox 4: HTML5 Forms。原文亦採 CC:BY-SA 3.0 釋出。要實際試用文中的表單效果,你需要以支援 HTML5 表單的瀏覽器觀看此頁。關於各瀏覽器的支援程度,文末將略提一下目前的概況,可逕自參考。


輸入欄位新型態

HTML5 中新增了不少 INPUT 元素 的 type 屬性值,可以表達我們希望使用者輸入哪一類的資料,從而在語意甚至互動呈現方式上獲得更好的結果。

舉例而言,手機上虛擬鍵盤的輸入一向受限於顯示區域、經常得在各種模式(中文、英文、數字)間切換。假若一開始就擺明了要輸入電話號碼、那麼瀏覽器就可以自動呼叫數字鍵盤出來,節省時間也增進體驗;又或者,如果這個欄位就是要輸入 URL,那麼或許也可以跟瀏覽器的瀏覽紀錄互相結合以節省使用者記憶的功夫。

Firefox 4 Beta 7 裡新增了以下幾種 type

<input type="search">
<input type="tel">
<input type="url">
<input type="email">

其中 urlemail 會自動驗證使用者是否確實輸入了網址或電子郵件地址格式的資料,等下會再提一下這個部份。

輸「出」欄位

還有一個新的 OUTPUT 元素,用來表達某個區域的內容是因應表單的輸入而改變的。例如,你填了出生年月日後,就在此顯示你幾歲那類的。寫法如下:

<output for="i1 i2">

for 屬性中是以空白字元分隔的、「構成這個輸出結果」的表單元素 ID 清單。使用這個元素主要是可以讓補助工具(如螢幕閱讀軟體)了解該區域的語意並提供對應服務,但 OUTPUT 裡的內容並不會「自動」計算出來,你還是得用 JavaScript 算好後填進去。畢竟,瀏覽器怎麼知道你想如何計算呢?

輸入欄位的備選清單

長久以來,網頁世界裡一直缺乏「ComboBox」這樣的元件:一方面能接受使用者自由輸入、二方面也能提供預選的清單,讓使用者更方便。過去我們可以利用 JavaScript 「做」出類似的效果,而以後則可以使用 DATALIST這個新元素來處理。在DATALIST 中所有的 OPTION元素,都會被視為是這份清單裡的備選答案。在清單定義完畢之後,則可在 INPUT 裡加上 list 來使用。範例如下:


<label>輸入所在城市:<input list="cities"></label>
<datalist id="cities">
  或
  <label>從清單中挑選
    <select>
      <option value="Taipei">台北</option>
      <option value="Tainan">台南</option>
      <option value="Taichung">台中</option>
      <option value="Taidong">台東</option>
      <option value="Taihsi">台西</option>
    </select>
  </label>
</datalist>

以這個方式書寫的話,如果訪客的瀏覽器不支援這個功能,也會直接略過 DATALIST 而將當中的 SELECT 選單顯示出來,所以不必擔心使用者就因此無法使用。你可以另外拿一個不支援這個標籤的瀏覽器來看本頁試試。

輸入元素新屬性

autofocus

不必再仰賴 JavaScript 將輸入焦點移到使用者第一個要輸入的表單欄位了!只要在要搶輸入焦點的 INPUT 元素上加入 autofocus 屬性即可:

<input autofocus>

placeholder

在使用者未輸入文字前,要在欄位裡顯示的東西。可以用來提示使用者該輸入些什麼,例如:

<label>電話:<input placeholder="02-22223333#311"></label>
<label>意見:<textarea placeholder="請輸入您對本產品的意見。"></textarea>

解構式表單

現在表單元素的書寫方式將有更多靈活的變化。

form 屬性

INPUT 不再需要放在 FORM 元素中了,現在放在任何地方都行,只要加上 form 屬性指明要歸屬的 FORM id,此部份的資料就會隨該表單一併送出。

舉個實用的例子:你想在網頁頁首放一個簡單的搜尋欄位,又想在頁尾另外提供更進階的搜尋功能選項。那麼,頁首可以這麼寫:

<input type="search" name="search_field" form="search_form">

而頁尾可以這麼寫:

<form id="search_form" action="search.php" method="post">
  <fieldset>
    <legend>進階選項</legend>
    <input type="checkbox">也搜尋私人內容
    <!-- 其他內容 -->
  </fieldset>
</form>

這麼一來,兩個部份就屬於同一個表單,而你可以更自由地隨意擺放。

欄位中的各種表單選項

FORM 元素中定義的屬性,都可以視情況、由表單欄位中的設定來推翻。目前表單的送出按鈕(包括 BUTTONtype="submit"FORM)支援的相關屬性有:formenctypeformactionformmethodformtarget

有個可能的使用情境是,若表單尾附上「預覽」及「送出」兩個按鈕,則按下去後的表單行為不見得要都相同:

<form action="new_post.php" method="post">
<label>標題:<input type="text"></label>
<label>內文:<textarea></textarea></label>
<input type="submit" formaction="preview.php" formmethod="get" value="預覽">
<input type="submit" value="送出">
</form>

若使用者按下「預覽」鈕,則表單送出的方式會從 POST 改為 GET,且傳送目標也從 new_post.php 改為 preview.php。

表單驗證

我們經常需要驗證表單中的資料,確定使用者輸入了正確資訊。我們可以在表單送出前用 JavaScript 驗證資料,也可以在表單送出後以 PHP 等後端語言驗證。一般來說我們都希望使用者盡早知道自己輸入錯誤的地方,所以前端的 JavaScript 多少是會做的,那麼如果瀏覽器就可以處理這塊,不是很好?

必填資訊 required

在表單元素中加上 required 屬性,就代表要求使用者一定要填寫這個欄位。以 Checkbox (多選方塊)來說就代表這個格子一定要勾,而 Radio button (單選鈕)的情況則代表這群按鈕中要選一個。

直接試試以下範例吧!

<input type="text" required>

<input type="checkbox" required>

<input type="radio" name="radiogroup" required>
<input type="radio" name="radiogroup" required>
<input type="radio" name="radiogroup" required>

網址 url

自動驗證是否為 URL。

<input type="url" value="mozilla">
<input type="url" value="http://mozilla.org">

電子郵件地址 email

自動驗證是否為電子郵件地址。如果再加上 multiple 屬性的話,就可以驗證以逗號分隔的多個郵件地址。(multiple 屬性也適用於 type="file" 的欄位。)

<input type="email" value="foo">
<input type="email" value="foo@bar.org">

<input type="email" multiple value="foo@bar.org, spongebob">
<input type="email" multiple value="foo@bar.org, spongebob@squarepants.org">

這種驗證方式並不會排除有「+」號的 email 地址,所以 Gmail 那類可以在帳號上另外指定標籤(如 bobchao+spam@gmail.com)的方式也適用。

進階驗證 API

如果你想進一步控制驗證方式,可以使用 setCustomValidity 方法撰寫 JavaScript 來驗證表單。傳入字串就代表未通過驗證的錯誤訊息,以 tooltip 方式顯現(且,該表單元素會被標為未通過驗證);傳入空字串則表示驗證通過。

<label>請輸入密碼:<input type="password" id="password1" oninput="checkPasswords()"></label>
<label>請再輸入一次密碼:<input type="password" id="password2" oninput="checkPasswords()"></label>
<script>
function checkPasswords() {
  var password1 = document.getElementById('password1');
  var password2 = document.getElementById('password2');
  if (password1.value != password2.value) {
    password2.setCustomValidity('您這兩次輸入的密碼不同,請再次確認!');
  } else {
    password2.setCustomValidity('');
  }
}
</script>

若表單中有任何元素被標為未通過驗證,則送出表單前就會被擋下來、將輸入焦點自動移至第一個未通過驗證的表單元素、顯示錯誤訊息。若你想自訂這樣的行為,可以在 FORM 元素上設定 novalidate 屬性,或於送出表單的按鈕加上 formnovalidate 屬性。

關於驗證表單這點,Mounir 寫了另一篇文章,可參考。我(柏強)可能也會翻譯那篇,資訊很豐富。

新的 CSS 選取符

因應這些新增的表單功能,CSS 部份也有些新的選取符。

:required:optional

預設情形下,所有的元素都屬於 :optional 的影響範圍。如果你為某元素加上 required 屬性中是以空白字元分隔的,則該元素會改套用 :required 的樣式。以下是自訂樣式的必填資訊輸入欄位:

:-moz-placeholder

這個擬似類別可以調整 placeholder 的樣式。這種設定方法還沒進入 CSS 標準,這麼寫就只有 Gecko 相關瀏覽器看得到了。WebKit 瀏覽器也有一個一樣的東西,以下為兩類瀏覽器都能看到效果的範例:

<style>
#selectors2 :-moz-placeholder {
  font-style: italic;
}
#selectors2 ::-webkit-placeholder {
  font-style: italic;
}
</style>
<form id="selectors2">
  <input placeholder="Style me">
</form>

瀏覽器相容性與標準制定

HTML5 Forms 還算比較新的功能,各瀏覽器的支援程度也大不相同。Opera 在 HTML5 Forms 還叫做 Webforms 2 時就實做了部份規格草案內容,所以雖然支援情形良好,但有些行為反而與後來的規格修訂結果有些出入;WebKit 的瀏覽器也已經支援了部份規格,所以也可以實際試試看。

Firefox 4 已經不會再加上更多表單相關功能,而要完整支援 HTML5 Forms 則還有一段路要走:還有些新的欄位型態(數字、色彩、日期)、屬性(數字變動間距、最大值、最小值)、事件(onforminputonformchange)等等,尚未實做。在未來的版本中,我們會一步步加上去。

這篇文章只是表單功能的概括介紹。Mozilla Developer Network 上還有更詳細的資訊,歡迎參考。

2009/7/24

顛覆網路 35 天:SVG + Video = 滾筒洗衣機!

這一篇,我們將再度見識混搭網際標準時可以展現的效果,先來看看範例:

View the Demo in Firefox 3.5 tristan

這個範例中,我們在 SVG 文件裡塞了個 HTML 5 的 VIDEO 標籤。以下是精簡過的程式碼:

<svg:svg xmlns:svg="http://www.w3.org/2000/svg"
               width="194" height="194">
  <svg:foreignObject x="1" y="1" width="192" height="192">
    <html:video src="tristan3.ogv" ontimeupdate="rotateMePlease()"/>
  </svg:foreignObject>
</svg:svg>

播放鈕什麼的也是用 SVG 做的喔!此外這範例裡也利用了 Firefox 3.5 中的 CSS 套用 SVG 濾鏡功能,如下:

#video {
    filter: url(#filter);
    clip-path: url(#circle);
}

這個 clip-path 特性能為任何元素 (html、svg 等) 定義裁切路徑,可以是任何以 SVG 繪製好的路徑,超強的喔!例如本例裡的 #circle 路徑原始碼如下:

<svg:clipPath id="circle" clipPathUnits="objectBoundingBox">
   <svg:circle cx="0.5" cy="0.5" r="0.5"/>
</svg:clipPath>

而 filter 特性則能定義 SVG 濾鏡,本例裡我們採用的是 feColorMatrix

<svg:filter id="filter">
  <svg:feColorMatrix values="0.3 0.3 0.3 0 0 0.3 0.3 0.3 0 0 0.3 0.3 0.3 0 0 0 0 0 1 0"/>
</svg:filter>

影片播放後,我們利用 transformation 來讓影片元素旋轉:

function rotateMePlease() {
    // Sure
    if (!video) return;
    video.style.MozTransform='rotate(' + i + 'deg)';
    i += 3;
}

作者 Paul 把所有程式定義在 XHTML 文件中,並且處處使用良好的 XML 語法及名稱空間,不過你可能會想在 HTML 文件中使用一樣的效果。Firefox 3.5 裡可以參照外部 SVG 文件,你就不必把原本的 HTML 整個轉化為 XHTML 了:

.target { clip-path: url(resources.svg#c1); }

從這個範例裡你可以看到混搭 SVG、HTML、VIDEO 及 CSS 的威力,好好玩喔!

2009/6/20

顛覆網路 35 天 (8a): CSS 3D 效果

這篇有一個用 Firefox 3.5 新增之 -moz-transform 所製作出來的範例,非常有趣 (強烈建議要看啦),一例勝千文,看了再說:

當然,-moz-transform 目前還是個 2D 效果的玩意,製作出來的「3D」也是可稱為 2.5D 的視覺效果而已。目前要做到真正的 3D,用這個特性還辦不到。

來看程式碼:首先以 DIV 標籤圍出立方體的三個顯示面:

<div class="cube">
    <div class="face top">
    </div>
    <div class="face left">
    </div>
    <div class="face right">
    </div>
</div>
.cube {
    position: absolute;
}
 
.face {
    position: absolute;
    width: 200px;
    height: 200px;
}

接著把這 3 個 div 都轉為平行四邊形:

.top {
    -moz-transform: rotate(-45deg) skew(15deg, 15deg);
}
 
.left {
    -moz-transform: rotate(15deg) skew(15deg, 15deg);
}
 
.right {
    -moz-transform: rotate(-15deg) skew(-15deg, -15deg);
}

至此,三個方塊已經以平行四邊形的樣子排成正六芒星,接著我們只要調整位置即可。你可以用方程式算出三個面所應該排列的座標點,或者慢慢一步步調整到正確的地方也行。下方的陰影其實就是 top 那一面的位移複製品,只是設定了 opacity: 0.5 的背景色。另一個方塊也是把樣式與標籤直接再複製一份做出來的,並以 translate(600px, 400px) 位移、以 scale(0.5) 將尺寸縮小 50%

方塊中間要填入什麼都行,其中有一面以 HTML5 Video 標籤放入了影片,你可以看到影片也被調整成平行四邊形的樣子 :P

除了 Firefox 3.5 之外,Safari 3.1+ 與 Google Chrome 亦以 -webkit-transform 的型態支援。相關文件可參考 https://developer.mozilla.org/En/CSS/CSS_transform_functions

2009/6/18

顛覆網路 35 天 (7b): Firefox 3.5 media query 簡介

原文出處,篇數太多不曉得怎麼開頭了 orz 反正大家看這系列下來應該都知道我是重點節譯。

現在可以上網看網頁的裝置越來越多,大家對網頁的期待也因裝置限制或功能而有所不同。CSS2 因此加上了媒體類別相關的設定,讓你可以指定某 CSS 宣告適用的裝置,像這樣:

<link rel="stylesheet" media="print" href="print.css">

這樣的確有效解決某些問題,不過網頁設計師要面對的不只是裝置的不同:即便是同一類型的裝置,也有可能有直放、橫擺、螢幕大小、解析度等等各式各樣的問題。Firefox 3.5 開始支援 CSS3 草案的 media query (媒體型態查詢) 機制,提供因應裝置各項特性而套用不同樣式的能力,讓各式裝置可以更適切地套用相應的樣式。以範例網頁來說,如果顯示範圍高大於寬 (直式),則「all and (orientation:portrait) 成立、套用 portrait.css 樣式:

<link rel="stylesheet" media="all and (orientation:portrait)"
 href="portrait.css">

而如果顯示範圍寬大於高 (橫式),則套用 landscape.css:

<link rel="stylesheet" media="all and (orientation:landscape)"
 href="landscape.css">

最棒的是,每次螢幕狀況有所轉換時,都會重新計算、套用一次樣式,所以當你以橫式的視窗開啟範例後,不妨慢慢調整視窗大小;一旦高大於寬 (變成直式),套用的樣式會立即變更。

如果你打開 landscape.css 瞧瞧,會發現其中的某些樣式也採用 media query 來調整。例如網頁文字尺寸預設為 14px,但若顯示範圍寬度至少有 600px,則改用16px 字體顯示:

@media all and (min-width: 600px) {
  body {
    font-size: 16px;
  }
}

倘若顯示範圍再大一點、至少有 700px 寬的話,則採用 20px 的字體尺寸顯示文字:

@media all and (min-width: 700px) {
  body {
    font-size: 20px;
  }
}

還有另一條規則讓 800px 以上寬度的顯示介面擁有更大的字體,不另贅述。總之,當你調整視窗大小,就可以馬上發現變化。有一個不錯的應用點子,是隨著螢幕寬度調整內容欄數 — 越寬的的螢幕,分成越多欄來呈現。

目前 Firefox 3.5、Safari 3、Opera 7 以上的瀏覽器都媒體型態查詢,一般來說新版本瀏覽器是加上更多型態或查詢方式。Firefox 的相關文件請參考 MDC,而 Opera 9.5 的相關說明則在這篇接近最後的地方。目前沒有找到 WebKit 的相關資料。

無論使用者用哪樣的裝置瀏覽你的網站,利用媒體型態查詢功能、可以讓你做出更方便他閱讀的網頁。我的網誌應該會採用相應的技術來製作邊欄,你也試試吧!

2009/6/17

顛覆網路 35 天 (6b): 動態字體與 CSS 範例

今天 (好吧,又是大前天…) 的顛覆網路 35 天綜合前面所說的 @font-face 及一些 Firefox 3.5 新支援的 CSS,組合成一個有趣的範例。直接看一下:

以下分別簡單說明所用到的東西:

圓角邊框與方塊陰影

首先是整個「工具列」的樣式。我們使用 -moz-border-radius 將左上及右下的邊框設定為圓弧:

-moz-border-radius:10px 0px 10px 0px;

接著利用之前提過的 -moz-box-shadow 設定這個方塊的陰影,分別向右向下位移 5 像素、且柔邊為 6 像素:

-moz-box-shadow: #9BD1DE 5px 5px 6px;

接下來是其中的按鈕,我們也會用到 -moz-border-radius,但額外使用 -moz-box-shadow 來區分按鈕目前狀態。一般的按鈕是普通陰影,不過滑鼠游標移上 (hover) 時則利用 inset 關鍵字設定內部陰影、文字本身也套用 text-shadow 陰影效果。點選按鈕後保持內部陰影狀態,但加深色彩、加大範圍:

#superbox button {
    -moz-border-radius: 5px;
    -moz-box-shadow: #000 0px 0px 8px;
}
 
#superbox button:hover {
    -moz-box-shadow: inset #989896 0 0 3px;
    text-shadow: red 0px 0px 8px;
}
 
#superbox button:active {
    -moz-box-shadow: inset #1C1C1C 0 0 5px;
}

動態連結字體

在此以 @font-face 設定每個按鈕個別的字體,舉第一個按鈕為例:

@font-face {
    font-family: Brock Script;
    src: url("BrockScript.ttf");
    font-style: normal;
    font-weight: normal;
}

.first {
    font-family: Brock Script;
}

@font-face 的說明可以看先前的文章,另外這個範例裡也利用一點 JavaScript 技巧動態替換下方文字段落的類別,以便在你點選按鈕時以相應字體顯示。

利用這些效果,我們就做出了「很像圖片,但不是圖片」的按鈕囉!大家可以試試看。

2009/6/15

@font-face 的問題?

之前就在實驗 @font-face 動態連結字型的問題,中文會遇到的問題比英文多,略列如下:

  1. 中文字型檔好肥,多在 8MB 之譜,加上
  2. 自由的字型也超少,還有
  3. 據說 Safari 目前的實作方式是,等下載完動態連結字體才顯示出來,請想像使用者在開啟網頁、另外開小遊戲玩了十來分鐘以後終於看到網頁文字的感覺。

第二個問題無解,要就自己刻,不然就去談;第三個問題目前無解,我覺得這樣實作很詭異… 完全沒考慮字型檔很大的情況要怎樣讓使用者「接受」;第一個問題目前看起來解法有二:

  • 用小一點的字體,例如 Droid Sans Fallback 大概是 3-4MB,「或許」你可以接受… 吧
  • 使用unicode-range指定要下載的範圍,僅下載需要的文字
  • 用不知道何年何月會出現的動態組字技術,不是為了拼罕見字、而是為了拼出字型

Safari 已經支援 unicode-range,所以至少我們有個瀏覽器可以試試看效果如何(我還沒試)。有另一個問題是,我怎麼知道我用了哪些字範圍要從哪裡到哪裡?unicode-range 規格上可以指定多個不連續範圍、而不是笨笨的只能從 A 到 B,所以我的想法是可以弄個小程式動態去掃自己網頁上的文字,指定一個最佳範圍給你。

不過這樣在 Safari 裡好像還會有一個要測試的問題:假設要這樣搞,我勢必要利用 JavaScript 在網頁讀取完畢後掃描網頁文章、escape 後判斷出範圍,接著也以 JavaScript 指定 @font-face 需下載範圍。但剛才說 Safari 要讀完字型才給看文字… 這樣會不會發生我指定完範圍結果套不上去的慘劇?

結果到最後好像還是要利用 Flash 或 圖片 (爆炸)

2009/6/14

顛覆網路 35 天 (6a): DOM 選取符 API

我終於趕上今天該有的進度了 XD 這一篇的重點我想是相容性與效能比較,重點節譯如下:

W3C 的萬年草案之一 DOM 選取符 (Selector) API 可以幫 JavaScript 程式設計師以 CSS 選取符方式輕鬆選取文件中的 DOM 元素,而且大部分的新瀏覽器,包括 IE8、Chrome、Safari 及即將 (?) 現身的 Firefox 3.5 都已經有基本支援了。

querySelectorAll

選取符 API 提供 querySelector 與 querySelectorAll 兩種方式協助你選取 DOM 元素,差別在於 querySelector 僅傳回第一個符合條件的元素、而 querySelectorAll 會以元素陣列的方式全部傳回。例如下面的 HTML 碼:

<div id="id" class="class">
    <p>First paragraph.</p>
    <p>Second paragraph.</p>
</div>

你可以用下列程式輕輕鬆鬆把 id 為「id」之 DIV 中的兩個 P 元素背景設為紅色:

var p = document.querySelectorAll("#id p");
for ( var i = 0; i > p.length; i++ ) {
    p[i].style.backgroundColor = "red";
}

也可以用這樣的方式讓類別為「class」之 DIV 中的第一段套用「first」類別:

  document.querySelector("div.class < p:first-child")
    .className = "first";

這類的條件在早期都蠻麻煩的,有了選取符 API 後就方便多了!不過有個瀏覽器方面的問題:大部分的瀏覽器 (Firefox、Opera、Safari、Chrome) 都可以用 CSS3 選取符 來選取元素,IE8 則沒支援那麼多、大多還落在 CSS2 選取符的範疇內。雖然一些比較複雜的選取條件可能受限於相容性問題而無法利用 CSS3 選取符,但至少還是挺有用的。

而對於開發人員,問題可能就是怎麼選用適當的選取符組合。你可以看這些文件增進對選取符的相關知識:

實作狀況

其實就算瀏覽器並非全都完整支援,Web 開發者用選取符 API 也早已用得很兇了:已經有不少 JavaScript 函式庫時做出類似的東西:

當然,用這類函式庫「模擬」出來的 API,效能跟原生的還是有差。下面這張圖是先前測試的結果,供您參考:

由這張圖可以明顯看出,原生支援此 API 亦可能大幅提升網際應用程式的執行效率。

顛覆網路 35 天 (5a): -moz-box-shadow 方塊陰影

今天 (是昨天吧?對不起我富奸化了…) 討論的是 box-shadow 方塊陰影。box-shadow 是 CSS3 草案的一部份,Firefox 3.5 在此以 -moz-box-shadow 實驗性支援、待規格定案後則會繼續以 box-shadow 出現。這個特性可以繪製一個區塊的陰影,我們直接看幾個範例來說明。以下的範例都會先秀程式碼、接著是 Live demo、再為您提供 Mac OS X 上的螢幕截圖:

-moz-box-shadow: 1px 1px 10px #00f;

 

simple box shadow

如你所見,頭兩個值是設定陰影位移點數,接著是柔邊、陰影色彩。事實上你還可以在最前面加上「inset」來製作內部陰影:

-moz-box-shadow: inset 1px 1px 10px #888;

 

inset box shadow

接著,你還可以用第四個數值「延展距離」來調整陰影的大小,可以向外延展(正值)也可以向內縮減(負值):

-moz-box-shadow: 0px 20px 10px -10px #888;

 

box shadow with spread radius

跟 text-shadow 一樣,這裡也可以設定多重陰影 (感謝 Markus Stange):

-moz-box-shadow: 0 0 20px black, 20px 15px 30px yellow, -20px 15px 30px lime, -20px -15px 30px blue, 20px -15px 30px red;

 

multiple box shadows

四層陰影疊起來,形成彩虹一般的效果。如同 text-shadow 一樣,Firefox 3.5 在這邊跟的是 CSS3 的規格,也就是先定義的陰影會放在最上層,在定義多層陰影時請記得這點。

最後一個範例裡,我們將色彩值以 RGBA 格式指定,這跟 RGB 方式類似、只是最後加上了代表可以製作半透明效果的 alpha channel 值。這個例子的透明度為 .5 (50%):

-moz-box-shadow: inset 5px 5px 0 rgba(0, 0, 0, .5);

 

box shadow with RGBA

看不太出來?按一下加上背景圖應該會更明顯。圖片感謝eschipul提供,CC:by-sa。

相容性問題

box-shadow 算是草案中晚近出現的特性,瀏覽器的支援程度也不算很廣:

  • Firefox 3.5,如本篇文章所說,以 -moz-box-shadow 的方式支援,同時也支援 inset 及延展距離。
  • Safari 與 Firefox 類似、也以 -webkit-box-shadow 方式支援。4.0 版開始支援多重陰影,不過目前還不支援 inset 及延展距離。
  • Opera 與 IE 目前則尚未支援,IE 有古早的 DropShadow 可以參考一下。

所以如果現在就要用,那最好把三條都列上去。下面這個範例可以讓支援此特性的瀏覽器都看得到效果,而不支援的也不過是以原本無陰影的面貌出現而已:

 -moz-box-shadow: 1px 1px 10px #00f;
 -webkit-box-shadow: 1px 1px 10px #00f;
 box-shadow: 1px 1px 10px #00f;

其他資訊

文件

範例

顛覆網路 35 天 (4b): 以 @font-face 使用你喜歡的字體

這篇提到的非技術問題點其實不少,我盡可能大幅翻譯。當然還是要付註:請別要求精準翻譯,那不是我的本意。

Firefox 3.0 已經在許多方面添上讓網頁字體看起來更美觀的技術,而 3.5 版加上的 CSS @font-face 技術則是要幫網頁設計師逃離系統預設字體的苦痛。以 @font-face 將 TrueType 或 OpenType 字體檔案「連」進網頁,就像連結外部 CSS 檔、JavaScript 檔一樣輕鬆愉快,而且 Safari 從 3.1 起已經支援、Opera 也打算在第 10 版支援這項技術。

要動態連結自訂字體,只要在 CSS 中以 @font-face 指定名稱就可以了。瀏覽器會視需求下載必要字體、所以你可以列舉一堆字型名稱也無妨:

/* Graublau Sans Web (www.fonts.info) */
 
@font-face {
  font-family: Graublau Sans Web;
  src: url(GraublauWeb.otf) format("opentype");
}
 
body {
  font-family: Graublau Sans Web, Lucida Grande, sans-serif; 
}

支援 @font-face 的瀏覽器會使用 Graublau Sans Web 字體顯示文字,不支援的就用 Lucida Grande 或系統預設的無襯線字體了。請見範例

更進一步

大部分的字體設計時都只考慮一般、粗體、斜體、粗斜體這些情況,你可以使用 font-weight 與 font-style 來定義某特定情況要使用的字體,若沒特別指定則視為「一般」。

/* Gentium by SIL International   */
/* http://scripts.sil.org/gentium */
 
@font-face {
  font-family: Gentium;
  src: url(Gentium.ttf);
  /* font-weight, font-style ==> default to normal */
}
 
@font-face {
  font-family: Gentium;
  src: url(GentiumItalic.ttf);
  font-style: italic;
}
 
body { font-family: Gentium, Times New Roman, serif; }

這個範例顯示起來如下:

可別以為就是這樣而已,@font-face 常被忽視的特點、就是可以讓同組字體處理多達九段的字體粗細設定。日文開放字體 M+ Fonts 專案共有七段的粗細,範例如此頁

有時我們可能會希望儘量使用使用者電腦上已安裝的字體、僅在沒有安裝時才從網路上動態下載。此時可以在 @font-face 裡的 src 特性以 local() 方式指定字體名稱。瀏覽器會依序試圖採用 src 列出的各個字體、直到其中一組讀取成功。

/* MgOpen Moderna                      */
/* http://www.zvr.gr/typo/mgopen/index */
 
@font-face {
  font-family: MyHelvetica;
  src: local("Helvetica Neue"), 
       local("HelveticaNeue"), 
       url(MgOpenModernaRegular.ttf);
}
 
@font-face {
  font-family: MyHelvetica;
  src: local("Helvetica Neue Bold"), 
       local("HelveticaNeue-Bold"), 
       url(MgOpenModernaBold.ttf);
  font-weight: bold;
}
 
body { font-family: MyHelvetica, sans-serif; }

下面的圖分別是此範例在 Mac OS X、Windows 及 Linux 上的顯示模樣。Helvetica Neue 在 Mac OS X 系統上很常見,不過 Windows 和 Linux 通常就沒裝,所以此範例在 Mac OS X 執行時會使用系統中的 Helvetica Neue、不會下載任何字體檔。在 Windows 與 Linux 中、瀏覽器發現本機上沒有相關字體後,終究會下載、使用 MgOpen Moderna 字體。MgOpen Moderna 原先就是為了當作 Helvetica 的代用品而生,所以看起來會很像。這樣設計師就可以在必要時才下載字體檔。

指定字體名稱時使用的是字體全名,這一般來說是字體名加上樣式名 (好比「Helvetica Bold」這樣)。Mac OS X 裡,可以在 FontBook 先選取字體後按下 Preview 選單的「Show Font Info」來查閱字體全名:

Linux 裡也有類似的工具,而 Windows 使用者可以到微軟網站上下載 Font properties extension,安裝後字體檔的「內容」就會顯示很多資訊,字體全名就在「Name」頁籤的「Font Name」裡。

僅有 Mac OS X 裡的 Safari 才支援 PostScript 名稱,所以 Mac OS X 下也可以使用 PostScript 名稱;而若字體格式為 OpenType PS (通常附檔名為 .otf),則在 Windows 裡全名與 PostScript 名稱。綜上所述,設計師採用這類字體時最好把全名與 PostScript 名稱都寫進去以確保相容性。

多國語言文字

即便使用 Unicode,大部分的語言還是會遇到缺字問題,少數民族語還更嚴重。有了這個動態連結字體的功能,就可以讓訪客看到這些特殊語言文字:

@font-face {
  font-family: Scheherazade;
  src: url(fonts/ScheherazadeRegAAT.ttf) format("truetype-aat"), 
       url(fonts/ScheherazadeRegOT.ttf) format("opentype");
}
 
body { font-family: Scheherazade, serif; }

阿拉伯文這類的字體,文字的顯示方式與相鄰的文字有很大關係。不同作業系統有各自的技術來處理這類情形,在 Mac OS X 上需採用 AAT 字體、而 Windows 和 Linux 則需要 OpenType 字體。如果不為個別作業系統提供適當的字體格式,就無法正確顯示這個範例。範例裡由於 Windows 跟 Linux 平台不支援 AAC 格式,所以就會轉而下載 OpenType 格式字體;因此各平台各取所需,便可正常顯示:

跨站字體檔

Firefox 3.5 預設無法跨站取用字體檔。如有此類需求,必須依據 Firefox 3.5 支援的檔頭存取控制資訊格式、調整存字體檔伺服器的 HTTP 檔頭相關設定:

# example Apache .htaccess file to add access control header
 
<FilesMatch "\.(ttf|otf)$">
<IfModule mod_headers.c>
Header set Access-Control-Allow-Origin "*"
</IfModule>
</FilesMatch>

字體授權問題

要動態連結字體檔時,請先確認授權相關問題。若字體授權中用了什麼看不懂的字眼,則小心為妙。要是你確定授權沒問題,也建議可以在 CSS 的註解中註明授權方式以備存。

你電腦中大部分的字體檔都不見得能以這類連結的方式使用,畢竟這項技術還在應用初期,很多作業系統內建的字體也規定只能在單機上使用,或許日後對相關的方式會有更進一步的授權系統也難說。

另外,並不是免費的字體就一定可以用,有的字體規定不可再散佈,所以檢查一下比較好。

那,IE 呢?

其實 IE 也早已支援字體連結,只是、格式用的是獨門的 EOT 檔。你可以用 (只有 Windows 上有的) MS WEFT Tool 將 TrueType 或 OpenType TT 字體轉為 EOT,OpenType PS (.otf) 則無法使用。

又,IE 只認 @font-face 中的 font-family 及 src,我們可以利用這點來寫跨瀏覽器的設定:

/* Internet Explorer 用 */
/*         (*一定*要擺第一個)             */
@font-face {
  font-family: Gentium;
  src: url(Gentium.eot) /* 不可用 format() */;
}
 
/* 其他瀏覽器用 */
@font-face {
  font-family: Gentium;
  src: url(Gentium.ttf) format("opentype");
}

接下來呢?

Firefox 3.5 還不支援 font-stretchunicode-range,也不支援 SVG 文件中的字體定義。這些都會在未來的版本慢慢支援,一如往常、我們歡迎您的幫忙喔!

其他資源

文件
範例
字體資源
字體政策討論

2009/6/11

顛覆網路 35 天 (3a): text-shadow

這一篇挺有意思,也大致翻一下全文。

text-shadow 原先在 CSS2 規格中出現,到 CSS2.1 被打入冷宮、而 CSS3 捲土重來,Firefox 3.5 正式開始支援。此 CSS 特性人如其名,就是拿來展現文字的陰影效果,不過咱們總是熱情無限創意奔放,不會這麼簡單就放過這個有趣的特效 :P 直接看本文最有趣的範例吧 (你需要支援 text-shadow 的瀏覽器,例如 Firefox 3.5):

看那七彩的霓虹燈,它的發明者是愛迪生

這個範例同時展示了 text-shadow 的許多功能:你可以設定陰影色彩、位移、柔邊等等,而一段文字也可以同時賦與數個陰影效果。

基本語法

CSS3 規格中的 text-shadow 值定義如下:

none | [<shadow>, ] * <shadow>,

即是「可以指定為 none、無陰影」或「指定一組 (以上) 的 shadow 型態值」。而所謂的 shadow 型態值則定義如下:

[ <color>? <length> <length> <length>? | <length> <length> <length>? <color>? ],

白話說就是:至少要輸入兩個數量值分別代表水平與垂直位移,可視需求加入第三個數量值調整柔邊效果,也可視需求於最前或最後方加上陰影色彩設定。講這麼多其實還是看依些範例比較快,以下所有範例都會搭配圖片、如此一來即便您使用不支援 text-shadow 的瀏覽器也可以了解意思。首先是簡單的陰影:

text-shadow: 2px 2px 3px #000;
A simple shadow

你是熱血硬派?那來看看不用柔邊的例子:

text-shadow: 2px 2px 0 #888;
I don’t like blurs

光暈效果、多重應陰影

加點創意,就可以變化出有趣的效果,例如極具神祕感的移動光暈:

text-shadow: 1px 1px 5px #fff;
Glowing text

又或者是單純的模糊文字:

text-shadow: 0px 0px 5px #000;
Blurry text

另外,剛說過也可以設定多組陰影:

text-shadow: 0 0 4px white, 0 -5px 4px #FFFF33, 2px -10px 6px #FFDD33, -2px -15px 11px #FF8800, 2px -25px 18px #FF2200
Multiple shadows are hot

在 Opera 9.x 已知可以設定 6 組陰影,而理論上你在 Firefox 3.5 裡可以為文字設定無限組 —— 當然還是控制一下比較好,太花俏也不美觀。

效能、可及性、相容性

用文字替代圖片 (或 Flash) 展現陰影效果好處多多,一方面不用圖片可以節省頻寬、二方面對利用語音瀏覽器的人及搜尋引擎都更好。使用文字,在縮放網頁尺寸的時候也可以獲得比較好的效果。

大部分的瀏覽器都已經支援 text-shadow:

  • Opera 從 9.5 版開始支援。
  • Safari 從 1.1 版開始支援,當然也包括使用 WebKit 為核心的瀏覽器,如 Google Chrome。
  • IE 目前還不支援,但即便如此也至少顯示得出文字。另外如果想在 IE 中達成一樣效果,可以利用微軟專屬的 shadow 及 dropShadow 特性

另外值得一提的是,Opera 9.x 以 CSS2 規格的方式、將先定義的陰影繪於最底層,而 Firefox 3.5 則依據 CSS3 的規格、將先定義的陰影繪於最上層。如果你想定義多重陰影,或許要考慮一下這個效果的影響。

text-shadow 很明顯將成為廣泛流行的樣式,不過當然這類 eye candy 都該注意不要太濫用就是。也請參考其他相關文件:

以及範例:

2009/6/10

顛覆網路 35 天 (2b): 為影片添點情調

為影片添點情調,我略譯一下:

這個範例利用了 Canvas、Video 標籤以及 SVG 遮罩,計算影片的色彩平均值後動態調整邊框顏色。整個看起來還挺有意思的。不過,在觀賞範例前有幾項事情要先說明:

  1. 這個範例吃 CPU 吃很大,電腦心臟不強的可以考慮直接觀看 mov 影音檔瞧瞧效果就好
  2. 你需要安裝 Firefox 3.5 preview (beta99) 以上的版本才能正確瀏覽,Beta 4 中有個 Bug 會讓影音資料無法複製到 Canvas 上。如果你有了 Beta 4、請點選「說明 > 檢查更新」以便更新

準備好了嗎?Go!

怎麼做到的呢?開頭其實就描述過原理,首先要把影格畫到 canvas 上,並順手計算色彩的平均資料:

var canvas = document.getElementById('canvas');
var video = document.getElementById('video');
var context = canvas.getContext('2d');
 
// push frame to canvas
context.drawImage(video, 0, 0, canvas.width, canvas.height);
 
// get image data for color calculation
var data = context.getImageData(0, 0, canvas.width, canvas.height);

接著以 YUI animation 動態變更計算後的色彩值就完成變化的部份。

為什麼影片周圍可以有柔邊的效果?事實上 Firefox 3.5 允許你將 SVG 遮罩特效套用到某個網頁元素上 ,在此我們先於同一網頁中定義 SVG 遮罩 (當然,也可以用另一個檔案來完成),然後利用這樣的 CSS 規則即可:

#video {
    mask: url(index.html#m1);
}

這就是混合使用網際標準的有趣之處 :) 連影片都被當成網頁的一部份對待,不需要透過外掛就可以直接操作、與網頁其他部份互動。

2009/6/9

顛覆網路 35 天:Hack Mozilla!

Mozilla 發表了「 Upgrade the web in 35 days」活動,在 35 天中以每天兩篇的速度、要跟你談談 Firefox 3.5 在技術上所代表的意義。

你可能已經知道 Firefox 3.5 加上代號為「Tracemonkey」的 JavaScript 引擎,速度飛快;你或許也知道對一般使用者、Firefox 3.5 提供了更進階的隱私保護功能,讓你輕鬆「處理」自己的隱私資料。不過 Firefox 3.5 在內裡其實更代表全球資訊網的大躍進:作為網頁設計師,你手上的工具越來越多樣了,包括不需外掛就能以 JavaScript 控制影音播放的 HTML 5 Audio / Video 標籤、多執行緒 JavaScript、設計師等好久的 CSS 字形動態下載、行動商務不可或缺的地理位置資訊揭露等等。更重要的是,這些當然不只是 Firefox 3.5 才有的功能,他們都已經、或即將是網際網路上風行的開放標準,主流瀏覽器例如 Safari、Opera、Google Chrome 或甚至 IE 都有可能 (或已經) 在不遠的將來支援這些玩意。因此你更應該看看他們能帶給你多少想像、能完成多少以前全球資訊網難以完成的事情。

所有文章都會附上有趣的程式範例,也都以十分自由的「創用 CC 姓名標示」方式授權他人再利用。打今日起的 35 天,別忘了緊盯 http://hacks.mozilla.org/,看看 Firefox 3.5 能帶給你的東西。我會就能力範圍,在此重點翻譯部份文章。

2009/4/9

今天衣服要脫光 -- CSS Naked Day

第一次參與響應 CSS Naked Day,也順道重新檢視一下自己網站的狀況。如果您覺得網站衣服脫光光後其實並不太妨礙閱讀,那主要得力於良好的 HTML 結構;又或許您覺得這樣很難閱讀… 那就表示我寫網頁的習慣不好,哈!

2008/12/5

Google Sites 裡的背景圖

答案就是很難做。

樂生快活 小卡圖 因為要改造某個網頁下方的圖文,改為在關掉圖時依然可見文字的方式做,所以需要在 Google Sites 的版面上實作「背景圖」這玩意。很可惜,Google Sites 會濾掉 CSS 裡的 background-image 特性:在編輯模式內看得到,但實際存檔後會消失;縮寫模式 (background: ) 有圖的話也會濾掉。這對已經習慣用 CSS 的我著實是個麻煩。

我想到的第二種方法:雙 div「套印」、也就是讓文字 div 浮動在圖層 div 上的方法,依然宣告失敗,因為 Google Sites 也會過濾掉 position 等相關 CSS 特性。

沒輒,只好又回到表格… 好久沒用「<tr background="…"」這種玩意了 XD 實在很蠢,但是沒辦法。Google Sites 方便歸方便,限制實在過份多,我想目前對熟悉網頁技術的人來說最好的免費 Wiki 或許還是 Wikidot。

附帶一提:這種「套印」法通常還要注意的事情是,萬一使用者關掉圖 (我用手機上網時通常會關掉),白色的前景字會消失在白色的背景裡,因此要記得也設定背景色—這麼一來圖片沒關就會顯示圖片、關了就會顯示背景色,前景文字一樣看得見。

2007/12/21

你的 Firefox 3 過不了 Acid2 了?

前天 Firefox 3 Beta 2 發布、而昨天 IE team 說他們的 IE 8 內部測試版過了 Acid2。大夥拿 Firefox 3 B2 一測居然過不了,甚是一驚。查閱 Bugzilla 發現原來是 Acid2 網站出了錯,原作之一的 Hixie 順手貼了他主機上的測試網址,亦可一試。

只是 FYI,這篇是給測試者的。

2007/2/3

Web 標準專案國際聯絡團隊

hlb 是台灣區目前的成員,詳情可參考他的 blog postWaSP 的新聞稿。說到這我欠某篇心得報告好久了,先講結果:我會每個月會去挖一下看有什麼事情,丟出來跟大家講。說實在我還沒去想 MozTW 「可能」可以做什麼事情,能做的儘量做;我也不是什麼技術高手,不過也一直在找自己該扮演的角色。

Technorati Tags: ,

2007/1/14

世界最長網頁 (update!)

長約十九公里的網頁(放心點選,裡面啥也沒有,不會很吃資源),用的 CSS 是這樣: div#whws { font-size: 100cm; height: 18939em; line-height: 1.0; }

文字大小為一公尺、總高度 18939 文字高,所以光那個 div 就可以有 18.939 公里... 這代表什麼?代表要認真耍白爛的話,不用半秒鐘他就不是最長的了 :P 補充:啊... 我沒有認真看最下面的說明才這麼說,翻譯一下:

有趣的現存問題:
  • Gecko 核心瀏覽器(如 Firefox)在碰上更長(長過 18.939583 公里)的網頁時會「縮小」 container。
  • Internet Explorer 則不讓你使用超過真正內容高度的連結錨點(所以你沒辦法從頁首的連結直接跑到頁尾),而我們也不確定真有那麼長網頁時它會怎麼處理(那實在太長了)。

如果有解決方案的話,請寄到 info at worlds-highest-website.com 我們「應該」會有獎勵,而且會將你的解決方案應用到此站上。