Posted on

ant 腳本編寫 – 關鍵元素

1. project元素

project 元素是 Ant 構件檔的根項目, Ant 構件檔至少應該包含一個 project 元素,否則會發生錯誤。在每個 project 元素下,可包含多個 target 元素。接下來向讀者展示一下 project 元素的各屬性。
  1. name 屬性
    用於指定 project 元素的名稱。
  2. default 屬性
    用於指定 project 默認執行時所執行的 target 的名稱。
  3. basedir 屬性
    用於指定基路徑的位置。該屬性沒有指定時,使用 Ant 的構件檔的附目錄作為基準目錄。
<?xml version="1.0" ?>
<project name ="antPro" default ="getBaseDir" basedir ="C:/ThinkInJAVACode">
<target name="getBaseDir">
<echo message="The base dir is: ${basedir}"/>
</target>
</project>
從上例可以看出,在這裏定義了default 屬性的值為getBaseDir ,即當運行ant 命令時,如果沒有指明待執行的target,則將執行默認的target–getBaseDir 。此外,還定義了basedir 屬性的值為 “C:/ThinkInJAVACode” ,進入”C:/ThinkInJAVACode” 後運行ant 命令,得一下結果:

Buildfile: C:\ThinkInJAVACode\build.xml
sayBaseDir:
[echo] The base dir is: C:\ThinkInJAVACode
BUILD SUCCESSFUL
Total time: 0 seconds

2. target 元素

target為Ant的基本執行單元,它可以包含一個或多個具體的任務。多個target 可以存在相互依賴關系。它有如下屬性:
  1. name 屬性
    指定 target 元素的名稱,這個屬性在一個 project 元素中是唯一的。我們可以通過指定 target 元素的名稱來指定某個 target 。
  2. depends 屬性
    用於描述 target 之間的依賴關系,若與多個 target 存在依賴關系時,需要以「,」間隔。 Ant 會依照 depends 屬性中 target 出現的順序依次執行每個 target 。被依賴的 target 會先執行。
  3. if 屬性
    用於驗證指定的屬性是否存在,若不存在,所在 target 將不會被執行。
  4. unless 屬性
    該屬性的功能與 if 屬性的功能正好相反,它也用於驗證指定的屬性是否存在,若不存在,所在 target 將會被執行。
  5. description 屬
    性該屬性是關於 target 功能的簡短描述和說明。
舉例說明如下:
<?xml version="1.0" ?>
<project name ="targetPro" default="targetB">
<target name="targetA" if ="ant.java.version">
<echo message ="JAVA Version: ${ant.java.version}"/>
</target>
<target name="targetB" depends ="targetA" unless ="philander">
<description>
a depend example!
</description>
<echo message ="The base dir is: ${basedir}"/>
</target>
</project>
從以下結果後可以看到,我們運行的是名為 targetB 的target ,由於它依賴於targetA ,所以 targetA 將首先被執行,同時因為系統配置了JDK,所以 ant.java.version 屬性存在,執行了targetA,輸出資訊:”[echo] JAVA Version: 1.6 “,targetA 執行完畢後,接著執行 targetB ,因為philander不存在,而unless屬性是在不存在時進入所在target 的,由此可知 targetB 得以執行,輸出資訊:

 

[echo] The base dir is: C:\ThinkInJAVACode”。
Buildfile: C:\ThinkInJAVACode\build.xml
targetA:
[echo] JAVA Version: 1.6
targetB:
[echo] The base dir is: C:\ThinkInJAVACode
BUILD SUCCESSFUL
Total time: 0 seconds

 

3. property 元素

property元素可看作參量或者參數的定義,project 的屬性可以通過 property 元素來設定,也可在 Ant 之外設定。若要在外部引入某檔,例如 build.properties 檔,可以通過如下內容將其引入:

<property file="build.properties"/>

property 元素可用作 task 的屬性值。在 task 中是通過將屬性名放在「 ${ 」和「 } 」之間,並放在 task 屬性值的位置來實現的。
Ant 提供了一些內置的屬性,它能得到的系統屬性的清單與 JAVA 文檔中 System.getPropertis() 方法得到的屬性一致,這些系統屬性可參考 sun 網站的說明。同時, Ant 還提供了一些它自己的內置屬性,如下:

  1. basedir:project 基目錄的絕對路徑;
  2. ant.file:buildfile的絕對路徑,上例中ant.file值為C:\ThinkInJAVACode\build.xml;
  3. ant.version:Ant 的版本資訊,本文為1.8.1 ;
  4. ant.project.name:當前指定的project的名字,即前文說到的project的name屬性值;
  5. ant.java.version:Ant 檢測到的JDK版本,本文為 1.6 。

舉例說明如下:

<? xml version="1.0" ?>
<project name ="propertyPro" default ="example">
<property name ="name" value ="philander"/>
<property name ="age" value ="25"/>
<target name ="example">
<echo message ="name: ${name}, age: ${age}"/>
</target>
</project>

上例中用戶設置了名為name 和age的兩個屬性,這兩個屬性設置後,在下文中可以通過 ${name}${age} 分別取得這兩個屬性值。

Posted on

上課筆記(一) – 專案運作流程、c語言概論、指標與物件

課程資訊

  1. 上課教師:潘聖文 Michael Pan ( scentsome@gmail.com) > 認真好老師推!
  2. 課程名稱:資策會IPhone應用軟體開發入門篇

運作流程

  1. main function為固定進入點
  2. 在iphone app開發裡面,一個一整頁的畫面是Scene,會有對應一個Controller
  3. 切換不同Scene的叫做View Controller,跳出如輸入框或選取框的這種(非整頁切換),則不需View Controller
  4. Navigation Controller是只有上面的Bar(用以控制頁面切換),會將View Controller塞進裡面。
  5. 所有Object特有的類別都會加上NS開頭(因為是某個縮寫為NS的公司開發的)
  6. Objective-C可以在執行時動態產生Code。
  7. 整個Design Flow圖如下
    螢幕快照 2013-08-02 下午4.18.20

開始之前

    1. 變數:代表記憶體的編號,型別決定占記憶體多大的位置,變數則是存放記憶體起始位置。
      NSLog(@"%d",varA); //只要是OBJ C型別的東西都要加@來存取(物件則用%@)
    2. Function宣告
      cal(int a, int b);
      int main(int argc, const char * argv[]){
        int a=5;
        float b=6;
        cal(a,b); //呼叫函數
        return 0;
      }
      cal(int a,int b){
        printf("a+b=%d",(a+b));
      }
    3. ios程式的基本組成是由三個frameworks:
      (a) UIKit:給特殊樣式的ui
      (b) Core Graphics:畫圖
      (c) Foundation:C和OBJ C用的
      ps:要自己加可以按Target=>Summary=>Linked Frameworks and Libraries=>+
    4. 副檔名:表頭檔.h和內容檔.m及.mm(要用view一定要用.m;要像視訊則可用.mm)

Pointer & Object 指標與物件

  1. Pointer在C裡面代表存放的是一個記憶體位置
    int a = 5;
    int * pa;//因此所有obj c裡面所有的物件,只要他是存放記憶體位置,都需要用指標型態去寫
    pa = &amp;a;//放的是一個記憶體位置
  2. Struct是型別,也就是class(類別)
    struct Date{
       int day;
       int month;
       int year;
       void ( * formatedDate ) (struct Date date);
    }
    void formatedFunction(struct Date date){
       printf("The day is %d, %d/%d",date.year, date.month, date.day);
    }
    struct Date date = {3,10,1970};
    today.formatedDate = formatedFunction;
    today.formatedDate(today);
  3. Function是存放動作,其記憶體是存在stack裡
  4. 所以Objective C程式的記憶體位置配置這樣的
    螢幕快照 2013-08-02 下午5.01.06
    Stack的部份是不用管理的,因為用完就沒了,而在Object C裡需要去做記憶體管理的部份則為Heap的區塊。
    所以當我們在Obj C裡宣告了某個物件,必需用

    a = malloc(sizeof(int));//會產生在heap,產生記憶體位置,可做記憶體管理。
  5. Static variable(靜態變數),會放在Data Segment。
  6. 所有的View Object都會對應到一個型別(Custom Class那邊去設定)
    螢幕快照 2013-08-02 下午5.17.09
Posted on

AS3.0小數運算BUG

今天處理帶錢問題時,發現AS3的Number相減的一個問題
討論串如下
http://zengrong.net/post/1186.htm
http://blog.csdn.net/bill1315/article/details/8574109

因此在撰寫程式時,

應盡量避免直接將兩個帶小數點的NUMBER做運算
而應該以整數型態做運算,運算完後再做小數點的位移

或許對一些人而言這是已知的事
但還是希望能夠分享一些自己曾遇到的錯誤以避免大家再發生相同問題~

看下面的代碼:

1
2
3
4
var n1:Number = 0.7;
var n2:Number = 0.4;
trace(n1 - n2);
//輸出 0.29999999999999993

簡單說,就是兩個一位小數相減,差為何不是一位小數?
經測試,乘法也有同樣的問題。

GOOGLE找到了Flex團隊的一個回覆:http://old.nabble.com/Float-number-calculation-in-AS3-td18447329.html

從回覆看,AS3的Number與JAVA或C++的double類似,採用二進制分數而非十進制分數保存浮點部分,因此會導致不夠精確。這是語言的設計思路所致。當然,從另一個思路看,它也是個BUG。

Posted on

WordPress Plugins開發分享

wordpress簡報下載

上面的是我分享的Wordpress套版開發的PowerPoint

其內容截錄如下:

1. WordPress簡介

• 一個以PHP和MySQL為平台的自由開源的部落格軟體和內容管理系統。
• 使用者可以安裝和切換主題。主題可讓使用者不改變部落格內容和結構的情況下更改介面和WordPress站點的功能。
• WordPress非常流行的一個特性是它豐富的外掛模組架構,外掛模組能使使用者和開發者擴充功能WordPress程式的功能。當前WordPress外掛模組資料庫中有超過18000個外掛模組,包括SEO、控制項等等。

2. WordPress基本介紹

• 在WordPress裡,網頁分文章及頁面。
• 頁面: 網頁中的固定頁面,不經常更新,例如關於我們、聯絡資訊。
• 文章: 網頁中的經常性變更頁面,常更新,例如最新資訊、我的作品。
• 每一篇文章及頁面都可以設定是否開啟迴響,迴響是類似留言版的地方,會顯示在網頁的下方。
• 外掛及佈景主題皆可以在官網下載或尋找免費支援,許多免費外掛或主題也有提供功能較完整的付費版本,此為WordPress的主要營收來源。

3. WordPress的佈景檔案有

• style.css 佈景CSS樣式
• header.php 各頁共用的網頁頭部
• footer.php 各頁共用的網頁底部
• sidebar.php 邊欄模組
• index.php 首頁
• single.php 單頁文章
• page.php 網誌分頁
• comments.php 迴響模版
• functions.php 佈景設定
• archive.php 文章彙整
• 404.php 找不到頁面
• search.php 站內搜尋結果

4. 頁面層級結構

• WordPress的頁面有層級的結構存在,當12個php檔案並沒有全部都存在時,便會自動尋找前一層級的來替代。
• 一個佈景主題裡至少要有style.css及index.php
2013-07-01_143700

 

Posted on

製作WordPress的第一個Plugins開發

1. 在wp-content\plugins下隨意新增一資料夾,建立一隻php檔案,在這邊我是命名為Claire.php
2. 在Claire.php裡加入下列程式碼

<?php
/*
Plugin Name: Claire's PlugIn
Version: 0.1
Description: 小佳的第一個插件
Author: ClaireChang
Author URI: http://claire-chang.com
Plugin URI: http://claire-chang.com
*/

/* 版本檢查 */
global $wp_version;
$exit_msg='小佳的插件適用於wordpress2.5以上';
if (version_compare($wp_version,"2.5","<")){
	exit($exit_msg);
}

/*產生FB按讚連結*/
function claireLink()
{
	global $post;
	$link=urlencode(get_permalink($post->ID));
	$title=urlencode($post->post_title);
	$text=urlencode(substr(strip_tags($post->post_content),
	0, 350));

	return '<div id="fb-root"></div>
	  <script src="http://connect.facebook.net/zh_TW/all.js#appId=&amp;xfbml=1"></script>
	  <fb:like href="'.$link.'" send="false" width="450" show_faces="true" font=""></fb:like>';
}

/* 將按讚連結加至文章底下 */
function claireFilter($content){
	return $content.claireLink();
}

/* 增加hook */
add_filter('the_content', 'claireFilter');
?>

然後至後台的=>外掛,就可以看到剛剛新增的外掛的資訊了!
2013-03-29_122704
將之啟用,變可以在文章的底下,看到fb的按讚連結了!

Posted on

初探OSMF的plugs-in開發

這篇文章是我看完下面的網頁後,所寫的中文心得:
http://osmf.org/dev/osmf/OtherPDFs/osmf_plugin_dev_guide.pdf

建立一個plug-in的方式

1. 建立一個PluginInfo物件,並且寫一個下面的函數讓OSMF去取得PluginInfo的物件

public function get pluginInfo():PluginInfo
{
	return _pluginInfo;
}

2. 建立一個物件繼承PluginInfo,然後建立一個Vector.執行super(items)

public function HelloWorldPluginInfo()
{
	var items:Vector.<mediaFactoryItem> = new Vector.<mediaFactoryItem>();
	// Create the MediaFactoryItem and add to our list of items.
	var item:MediaFactoryItem = new MediaFactoryItem
	("com.example.helloworld", canHandleResourceFunction, mediaElementCreationFunction);
	items.push(item);
	// Pass the list to the base class.
	super(items);
}

ps: 在建立MediaFactoryItem時會傳入三個參數
第一個參數是一串string,這個MediaFactoryItem的id
第二個參數是一個函數,當有任何資源被指定給MediaFactory.createMediaElement時,這函數會被呼叫,
傳入被指定的資源,回傳一個布林值代表是否要呼叫第三個參數所傳入的函數

private function canHandleResourceFunction(resource:MediaResourceBase):Boolean

第三個參數也是一個函數,當有任何資源被指定給MediaFactory.createMediaElement且第二個參數傳回的值為true時會被呼叫
不會傳入東西,然後要傳回一個MediaElement

private function mediaElementCreationFunction():MediaElement

那建立plugin的方式有兩種:
1. 靜態建立(把plugin用includes進src裡或加進lib庫裡的方式去呼叫)

mediaFactory.loadPlugin(new PluginInfoResource(new HelloWorldPluginInfo()));

2. 動態建立(把plugin用載入swf檔的方式去呼叫)

mediaFactory.loadPlugin(new URLResource("http://example.com/HelloWorldPlugin.swf"));

下載osmf的資料夾裡面有一個sample,裡面有許多plugin的範例
可以研究其使用方式

Plug-in 種類有三種

1. Standard Plug-in (必須指定為 MediaFactoryItemType.STANDARD)
	用來建立與回傳單一 MediaElement
	Standard Plug-in 有兩種子類型,客製化的與 OSMF 內建的 Plug-in


2. Proxy Plug-in (必須指定為 MediaFactoryItemType.PROXY)
	必須回傳一個空的 ProxyElement 或子類物件
	用來代理其他已經建立好的 Element

	可以讓開發者以非侵入的方式改變 MediaElement 的行為
	譬如一個 Proxy Plug-in 可以關閉任何 VideoElement Seeking 功能而不需要改變 Player 程式

	Proxy Plug-in 會產生一個空的 ProxyElement
	MediaFactory 在前一個 MediaElement 回傳之前,將 MediaElement 注入到 ProxyElement
	因為 ProxyElement 與 MediaElement 具有相同的介面
	Player 程式可以與之互動而不需要知道它是 ProxyElement
	所有個方法與屬性呼叫都會從代理的 MediaElement 返回,除非 ProxyElement 想要修改行為


3. Reference Plug-in
	Plug-in 會取得一或多個 MediaElement 參考進行操作
	大多數情況 Ref. Plug-in 也會產生一個自己的 MediaElement

	譬如 Reference Plug-in 封裝 SWF 壓在 VideoElement 上並取得該參考
	然後 SWF Overlay 可以控制 VideoElement
	或者封裝某些追蹤的邏輯,監聽 VideoElement 並送出報告

	建立 Reference Plug-in 必須要提供 PluginInfo.mediaElementCreationNotificationFunction 方法
	每次當 MediaFactory 建立 MediaElement 時候都會呼叫該方法
Posted on

OSMF簡介

OSMF是一個開源且免費的Action Script框架,用以建置多媒體播放器。

現今的播放器很多時候不止是播放器,它們可能需要連接至CDN、呈現廣告、補捉使用者事件給伺服器分析、在使用者介面上提供社交功能等…。每個功能可能都會需要該方面的專業人士去專門開發,而OSMF就是為了解決這個狀況,降低開發成本而產生的,在OSMF裡,開發人員所開發的播放器,可以透過一套標準的API,與第三方所開發的plug-in功能整合。

簡單來說,可能今天我的播放器想要與聊天功能整合、或特定事件引發特定廣告,我們可以用OSMF所提供的標準API去開發相關功能,第三方程式不需要關心播放器相關議題,只需透過OSMF所提供的API來做,以提高程式的重用性。

OSMF的開發核心思想是『hooks』,每一個插件都是可被動態加載的功能,可被宣告為動態或靜態載入。靜態載入是指編譯時就被編譯進去、而動態載入則是在播放時再動態載入SWF插件。

Plug-ins分成可視與非可視的元件,可視元件可在載入swf時覆蓋原本的使用者介面(或一個暫停按鈕),非可視元件可將使用者操作紀錄和分析資料傳送給分析伺服器。

在OSMF裡,plug-in是declarative(宣告性)的。plug-in的功能是經由OSMF的API去做宣告,framework只負責檢查插件的功能,然後建立插件與媒體播放器之間的關係。plug-in無法直接存取任何播放器的內容,而OSMF則是扮演著plug-in和media player之間的溝通者。這可以確定播放器和插件之間的溝通是有標準化的。

MediaFactory是處理media和plug-in之間的溝通者,開發player的developer用MediaFactory去載入plug-in並產生MediaElements。雖然我們也可以直接創建MediaElements,但使用MediaFactory產生的MediaElements可讓我們用載入的插件影響原來的輸出結果。

Posted on

OSMF相關資源

介紹

  1. OSMF第一步
  2. Open Source Media Framework中文介紹
  3. 開源媒體框架(OSMF)的介紹和概況:上 [譯]
  4. Open Source Media Framework – Plug-in Developer’s Guide
  5. Open Source Media Framework Developer’s Guide

簡報

  1. Almer Blank – OSMF Slides and Code from FITC SF
  2. David Hassoun – 360 Flex Going Deep with OSMF
  3. OSMF Presentation

教學

  1. DZone – Open Source Media Framework Building Simple Custom Video Players
  2. ADC – Tag Search – OSMF
Posted on

CDN – 內容傳遞網路

CDN(內容傳遞網路)

在wiki上的解釋是:
內容傳遞網路(Content delivery network或Content distribution network,常簡寫成CDN)是指一種透過網際網路互相連接的電腦網路系統,提供高效能、可擴展性、及低成本的網路將內容傳遞給使用者。

簡單來說,CDN就是在全球各地怖署節點,讓使用者可以就近從最近節點取得快取檔案,像是我們架網站時,可把一些共用的如JQuery函式庫、靜態圖片等檔案放置到CDN伺服器(如這篇文章: [JQuery]使用CDN來載入JQuery)來加快網站的讀取速度。也可以避免被攻擊者使用DDos的方式來癱瘓伺服器。

CDN的功能及優點包括

  1. 高效能:CDN可以讓使用者「就近取得檔案」,內容提供者事先將檔案推到全球的 CDN 節點,在台灣的下載者儘量從台灣取得檔案,在日本或香港的下載者也儘量從當地的伺服器取得檔案。並且因為下載者透過 CDN 下載靜態元件,可以減少原始 server 的負荷。
    ps: 要決定使用者到那個節點要決定使用者應該要到哪組 server 通常有這些方法:

    1. GeoDNS
    2. Anycast
    3. HTTP Redirect (會比較差)
  2. 高可靠度:當今天主要網站當機了,使用者可以從CDN的備援網站去讀取檔案,不至於讓整個網站癱瘓。也可以避免DDos的大量機器人攻擊來癱瘓網站。
  3. 低成本:因為內容提供者不需要在一個 data center 上建立非常粗的水管。舉例來說,如果傳遞需要 100Gbps 的流量,利用 CDN 架構(將資料提供者分散在世界各地),每個 data center 也許只需要 5Gbps 的流量。由於十個 10Gbps 網路與 100Gbps 網路的成熟度不同,成本也會不相同。

CDN提供的服務者包括Akamai、Amazon CloudFront等等(請見下圖)


這是我從別的網站找來的CDN運作示意圖
原本我們讀取網站的模式如下圖,我們會先去和DNS從網址要到伺服器ip,
再去用ip和我們的網頁伺服器讀取網頁內容

clip_image010
使用CDN的架構後,使用者用網址和DNS伺服器要ip位置時,
CDN的DNS伺服器會從使用者所傳來的資訊,去判別離使用者最近的CND節點,
然後使用者再去和該CDN伺服器要取檔案,
因此當某個節點壞掉時,網站還是可以藉有其他節點去正常運作

clip_image012

下面有一些我找的資源

  1. 淺談私有 CDN(內容傳遞網路)佈署 :http://blog.lyhdev.com/2012/02/cdn.html
  2. 免費的雲端加速代理網路-CloudFlare:http://blog.soft.idv.tw/?p=1110
  3. 內容傳遞網路 :http://zh.wikipedia.org/wiki/內容傳遞網路
  4. Amazon CloudFront (CDN) – 內容傳遞網路 : http://ten2.tw/blog/amazon-cloudfront-cdn/
  5. CDN服務提供者:http://blog.gslin.org/archives/2009/03/09/1965
Posted on

CSS Vertical Align(用純CSS解決div垂直置中)

本文出處:http://blog.yam.com/hanasan/article/35806444

本次要介紹的是CSS垂直置中(Vertical Align with css)的完整解決整理。
說實話這並不太容易,雖然不像水平置中 {margin:0 auto;} 那樣單純, 但仍有幾種方式可以作到,以下共有五種方式一一介紹。

每種使用方式各有其優、缺點,端看自己要置中的內容是「區塊」或是「文字」來取捨。

方法一

使用CSS table-cell屬性來完成,什麼是table-cell?簡單說就是針對一些html object附于它table的屬性(詳見此), 如果曾經使用過table來排版的網頁開發者,應該知道td的既有屬性valign,古早以前根本不會有垂直置中的問題,因為td下個 valign=”middle”就行了。 而table-cell即是可以將div模擬成表格(table)的儲存格(td),讓原本不存在vertical-align的div可以使用。

Sample Code

HTML

<div id="wrap">
    <div id="cell">
        <div id="content">
            要被置中的內容
        </div>
    </div>
</div>

CSS

#wrap { display:table; }
#cell { display:table-cell; vertical-align:middle; }

優點:

  1. 因為是CSS2.1釋出的標準屬性,正規的解決方法。
  2. 被置中的內容增加後,垂直置中的block會自動調整。

缺點:

  1. 支援性不佳,IE8以上才支援(IE7以下不支援display:table語法)
  2. 太多巢狀標籤(有種回到過去table排版的fu)

方法二

此方法適用在定義了絕對定位(absolute)的div, 將其top設置為50%, 再設置與div高度一半的「負」值margin-top,意謂著使用本方法必須固定div的高度。

Sample Code

HTML

<div id="center">
    要被置中的內容
</div>

CSS

#center {
    position:absolute; height:400px; top:50%; margin-top:-200px; /* div高度的一半 */
}

優點:

  1. 程式碼簡短,且無需為了「垂直置中」的目的多寫巢狀標籤
  2. 所有browser都支援,泛用性高

缺點:

  1. div高度需固定,若是動態資料有可能超過的話需要加上overflow:scroll讓溢出的內容可以看見

方法三

 

在需要被垂直置中的div前放置另一個div,設置為height:50%,margin-bottom:-contentHeight(目標高度的負值)

Sample Code

HTML

<body>
    <div id="floater"></div>
    <div id="middle">
        要被置中的div
    </div>
</body>

CSS

html, body {
    margin:0; padding:0; height:100%;
}
#floater { float:left; height:50%; margin-bottom:-200px;
    width:1px; /* only for IE7 */
}
#middle {  clear:both; height:400px; position:relative; }

優點:

  1. 所有browser都支援(Note:IE7必須在#floater追加width:1px才work!)
  2. 當內容增加時,垂直置中的div不會被切掉,而是會自動出現scroll-bar

缺點:

  1. 沒甚麼缺點,真要說就是一樣高度得固定。另外若置中物件的父層是body, 即使視窗被USER拖曳拉小了,div也一樣會唯持置中(笑)

方法四

本法使用在同樣是絕對定位(absolute)的div上,固定高度,並定義top:0; bottom:0; 和廣為被應用的
{ margin:0 auto; }作div水平置中原理類似

Sample Code

HTML

<div id="middle">
    我要被置中啦~
</div>

CSS

#middle {
    position:absolute; width:70%; height:280px;
    top:0; bottom:0; left:0; right:0; margin:auto;
}

優點:

  1. 簡單

缺點:

  1. 不支援IE7(含)以下
  2. 如果容器不夠裝內文, 也不會有scrollbar自動出現…

方法五

此方法適用於「單行」文字的垂直置中(EX:要作英文網站大Slogan時), container除了設置高度之外,同時也將行距(line-height)設置與高度相等。

Sample Code

HTML

<div id="content">
    一行文字要被置中啦
</div>

CSS

#content { font-size:32px; text-align:center; height:150px; line-height:150px; }

優點:

  1. 簡單
  2. 所有browser都支援(even IE6!)
  3. 即使內容溢出也不會被切掉

缺點:

  1. 只有單行文字適合
  2. 若div寬度固定,一當有長文字爆行時會很醜,務必小心使用。

以上列出五種使用純CSS(不加js)達成div vertical align(垂直置中)的藥方,可以綜合搭配使用,也可視情況單獨使用…