九宮格,也叫做快速撥號(Speed dial),是現代瀏覽器一個非常重要的功能,用戶可以在空白頁上定制和放置自己喜愛的網站,這樣可以方便的打開所需的網站,無需輸入和記憶網址。

?????? 九宮格頁面一般由9個格子到16格子組成,每個格子可以自由的拖動以交換位置。下面我們來實現一個簡單的3*3九宮格。
????? 我們先定義一個容器來放置3*3個格子,定義它的寬度為3個格子的寬度之和再加中間的間距。然后在上面放置9個浮動的格子。

????? 為格子添加一些表現效果:
????? background: -webkit-gradient(linear, 0% 0, 0% 100%, from(rgba(255, 255, 255, 0.75)), to(rgba(222, 231, 233, 0.7))); /* 半透明漸變背景 */
????? border: 1px rgba(0, 0, 0, 0.24) solid; /* 半透明邊框 */
????? -webkit-border-radius: 3px; /* 邊框圓角 */
????? box-sizing: border-box; /* 盒子模型 */
????? -webkit-box-shadow: rgba(0, 0, 0, 0.25) 0px 1px 7px;????? /* 盒陰影 */
????? 效果如下圖所示:
????? 
????? 設置透明度的原因是可以為九宮格添加背景設置功能,如下圖所示:
????? 
????? 下面為格子添加hover效果,我們可以利用jQuery的animate API為hover效果添加淡入淡出的支持。淡入淡出的原理是讓hover的效果綁定在一個容器上,這個容器和格子完全重疊,在鼠標mouseover時讓這個容器的透明度從0變為1,mouseout時透明度從1變為0。核心代碼如下:
~~~
*??? $('.hover', this).stop().animate({*
*??????? 'opacity': 0*
*}, 150);*
~~~
然后初始化一些數據。

下面我們來實現最重要的拖拽功能。jQuery的插件jQuery UI提供了元素拖拽和排序的支持,可以極大的減少我們的工作量。
~~~
*?????? $('#start-nine-box').sortable({*
*????????????? zIndex: 30, // **拖拽總在最上***
*????????????? revert: true, // **拖拽的元素未排序時放置后平滑回到原位置***
*?????? });*
~~~
這樣可以很方便的實現九宮格的位置交換功能,但是帶來一個問題。拖拽交換序號為6和9的格子后如下圖所示:

6移到9的位置后,7、8、9格子都向前移動了一位,而不是6和9進行交換。使用原生的sortable函數帶來的排序是填位排序,而不是交換排序。所以我們不能直接使用sortable函數,我們考慮使用控制拖拽的draggable和控制拖放的droppable函數實現。
首先設定拖拽。
~~~
*?????? $(selector).draggable({*
*????????????? zIndex: 30, // **拖拽總在最上***
*????????????? revert: true, // **拖拽的元素未排序時放置后平滑回到原位置***
*????????????? containment: 'window'*
*?????? });*
~~~
然后設定拖放:
~~~
*?????? $(selector).droppable({ *
*????????????? drop: function(event, ui) { // **拖拽放下時***
*???????????????????? var dropElement = $(this).get(0); // drop element*
*???????????????????? var dragElement = ui.draggable[0]; // drag element*
*????????????? },*
*?????? });*
~~~
交換排序的處理可以有很多方式,最簡單的一種是完全交換兩個元素的內容:
~~~
*?????? // **交換兩個元素的內容***
*????? var dropElementHTML = dropElement.outerHTML; *
*????? var dragElementHTML = dragElement.outerHTML;? *
*???????????????????? *
*????? dropElement.outerHTML = dragElementHTML;*
*????? dragElement.outerHTML = dropElementHTML;*
~~~
這樣會造成一個問題,綁定在元素上的所有事件都會失效,包括draggable和droppable事件,所以需要重新綁定。
~~~
*????? setDroppable('#' + dropElementId + ', #' + dragElementId); // **重用上面的方法***
~~~
????? 最后還可以添加一些界面效果來讓九宮格更加完美,例如拖動格子hover時的界面提示,我們可以讓下層的drop元素有一個顏色淡入淡出的效果,只需在droppable的over和out事件里設定相應的處理。
~~~
*???????over: function(event, ui) { // **拖到元素上時***
*???????????? $(this).stop().animate({*
*???????????????? 'opacity': 0.5*
*????????????? }, 150); // **設置**drop**的**opacity*
*???????? },*
*??????? out: function(event, ui) { // **拖出元素時***
*???????????? $(this).stop().animate({*
*????????????????? 'opacity': 1*
*???????????? }, 150); // **設置**drop**的**opacity*
*??????? },*
~~~
效果如下:

如此我們實現了一個簡單的九宮格,不過剩下還需要考慮很多細節問題,例如格子的resize,編輯功能。

另外作為瀏覽器默認頁面的九宮格是必須要進行性能測試和優化的,盡可能的減少加載時間和提高響應速度,這個和瀏覽器的交互都不在本文的討論范圍之內,會在后面的文章里闡述。
- 前言
- AutoPager的簡單實現
- 利用CSS3特性巧妙實現漂亮的DIV箭頭
- IE9在Win7下任務欄新特性簡介
- 瀏覽器九宮格的簡單實現
- Raphael js庫簡介
- 使用CSS3構建Ajax加載動畫
- 用CSS3創建動畫價格表
- 用CSS3實現瀏覽器的縮放功能
- 用純CSS3實現QQ LOGO
- 用CSS3創建旋轉載入器
- 使用Javascript開發移動應用程序
- 用HTML5創建超酷圖像灰度漸變效果
- 使用CSS3創建文字顏色漸變(CSS3 Text Gradient)
- 僅用CSS創建立體旋轉幻燈片
- 如何創建跨瀏覽器的HTML5表單
- 用CSS3實現動畫進度條
- HTML5 Guitar Tab Player
- 奇妙的HTML5 Canvas動畫實例
- 談HTML5和CSS3的國際化支持
- 實現跨瀏覽器的HTML5占位符
- 前端開發必備工具:WhatFont Bookmarklet-方便的查詢網頁上的字體
- 使用HTML5和CSS3來創建幻燈片
- HTML5之美
- 如何使用HTML5創建在線精美簡歷
- 以小見大、由淺入深-談如何面試Javascript工程師
- 快速入門:HTML5強大的Details元素
- 用CSS3實現圖像風格
- HTML5視頻字幕與WebVTT
- 用純CSS3實現Path華麗動畫
- 用3個步驟實現響應式網頁設計
- 遇見CSS3濾鏡
- 關于CSS3濾鏡的碎念
- 用純CSS3繪制萌系漫畫人物動態頭像
- CSS3新的鼠標樣式介紹
- 用HTML5獻上愛的3D玫瑰
- 對HTML5 Device API相關規范的解惑
- 如何使用HTML5實現拍照上傳應用
- 2012第一季度國外HTML5移動開發趨勢
- HTML5新特性:范圍樣式
- 百度開發者大會-《用HTML5新特性開發移動App》PPT分享
- Chrome 19對于HTML5最新支持的動態:電池狀態API,全屏API,震動API,語音API
- 遇見Javascript類型數組(Typed Array)
- 用HTML5 Audio API開發游戲音樂
- 用HTML5實現人臉識別
- 用Javascript實現人臉美容
- Chrome 20對于HTML5最新支持的動態:顏色輸入,網絡信息API,CSS著色器
- 用HTML5實現手機搖一搖的功能
- 用HTML5實現iPad應用無限平滑滾動
- 用非響應式設計構建跨端Web App
- 了解SVG
- HTML5圖像適配介紹
- HTML5安全:內容安全策略(CSP)簡介
- HTML5安全:CORS(跨域資源共享)簡介
- 用CSS3 Region和3D變換實現書籍翻頁效果
- 談談移動App的思維誤區
- Chrome新特性:文件夾拖拽支持
- 《關注HTML5安全》
- HTML5安全風險詳析之一:CORS攻擊
- HTML5安全風險詳析之二:Web Storage攻擊
- HTML5圖像適配最新進展:響應式圖片規范草案
- HTML5移動Web App相關標準狀態及路線圖
- HTML5安全風險詳析之三:WebSQL攻擊
- Chrome引入WebRTC支持視頻聊天App
- HTML5安全風險詳析之四:Web Worker攻擊
- HTML5安全風險詳析之五:劫持攻擊
- HTML5安全風險詳析之六:API攻擊
- HTML5安全攻防詳析之七:新標簽攻擊
- 在iOS Safari中播放離線音頻
- 使用WebRTC實現遠程屏幕共享
- Firefox、Android、iOS遇見WebRTC
- HTML5光線傳感器簡介
- HTML5安全攻防詳析之八:Web Socket攻擊
- HTML5安全攻防詳析之完結篇:HTML5對安全的改進
- 激動人心!在網頁上通過語音輸入文字 - HTML5 Web Speech API介紹
- Web滾動性能優化實戰
- 用CSS3設計響應式導航菜單
- 用HTML5構建高性能視差網站
- 漫談@supports與CSS3條件規則
- HTML5下載屬性簡介
- 如何開發優秀的HTML5游戲?-迪斯尼《尋找奧茲之路》游戲技術詳解(一)
- 如何開發優秀的HTML5游戲?-迪斯尼《尋找奧茲之路》游戲技術詳解(二)
- 趨勢:Chrome為打包應用提供強大新特性
- 從HTML5移動應用現狀談發展趨勢
- 基于HTML5的Web跨設備超聲波通信方案