**前言:**
? ? ? LinkedIn 5月2日發布了新的iPad版本,它基于HTML5制作,在體驗和界面上非常出色,在使用中可以發現它和原生應用基本沒有任何差別。

? ? ??關于這個版本,有兩篇文章非常有價值,深入的介紹了Mobile Web App和HTML5移動開發的原理和方法。
? ? ??第一篇《[你絕對想不到的](http://venturebeat.com/2012/05/02/linkedin-ipad-app-engineering/#s:profile_ipad_frame)LinkedIn如何構建iPad新應用》主要包括三個方面的內容:
- **LinkedIn and themobile web**
? ? ??LinkedIn開始越來越多的采用HTML5來開發移動Web應用。
- **Now, with more Node.js**
? ? ??大量使用了node.js。
- **“Responsive design” just doesn’t work**
? ? ??他們認為[響應式網頁設計](http://blog.csdn.net/hfahe/article/details/7082718/)對簡單的、一次性的網站很有用,但是對應用或者社交網絡來說,它沒有那么好。
? ? ? -------- --------?--------?--------?華麗的分隔線
? ? ??而下面一篇文章講述了LinkedIn是如何使用HTML5在iOS中實現平滑無限滾動以及內存和性能優化的。
**LinkedIn iPad版:用HTML5的5項技術實現無限平滑滾動**
**作者:[TrunalBhanse](http://www.linkedin.com/in/trunal)**
譯者:蔣宇捷
這是在一系列博客文章中的第二篇,我們將聊聊[LinkedIn新的iPad應用](http://itunes.apple.com/us/app/linkedin/id288429040?mt=8)。在第一篇文章中,我們談到了[如何使用](http://engineering.linkedin.com/mobile/linkedin-ipad-using-local-storage-snappy-mobile-apps)HTML5本地存儲建立敏捷的移動體驗,而這篇文章我要講講當實現一個無限翻頁的列表時所面臨的挑戰。
### 什么是“流”?
? ? ??當iPad項目開始時,我們考慮過如何才能為用戶創造一個引人入勝的內容消費體驗。我們決定以“流”的方式來展示文章、網絡更新,以及其他類似的內容:一個可以無限翻頁的界面。這里是頁面流的第一頁:

### 移動設備上無限列表的挑戰
? ? ??和臺式機相比,移動設備具有更少的內存和更低的CPU主頻。如果在HTML頁面中渲染很長的列表,你會面臨運行設備崩潰的危險。這使得在移動設備上構建大型的HTML5互動應用成為一個挑戰。Native技術提供了[UITableViewController](http://developer.apple.com/library/ios/#documentation/uikit/reference/UITableViewController_Class/Reference/Reference.html)來建立長的,無限滾動的列表。UITableView包含可復用的UITableViewCells來優化內存,性能以及響應。而針對HTML5我們沒有任何現成解決方案。因此,我們將自己實現一個!
### 技巧1:移除圖像
? ? ??UIWebView或者移動Safari瀏覽器對[圖像有嚴格限制](http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/CreatingContentforSafarioniPhone/CreatingContentforSafarioniPhone.html)。我們的頁面流里鋪滿了大尺寸圖像,所以很快就會達到上限。一種選擇是使用[HTML5Canvas](http://www.w3.org/TR/html5/the-canvas-element.html#the-canvas-element)繪制圖像,[不會](http://roblaplaca.com/blog/2010/05/05/ipad-safari-image-limit-workaround/)帶來內存問題。然而我們發現在畫布上繪制非常大的圖像相當緩慢,所以我們不得不采取另一種方法:當一副圖像完全“流”出屏幕時,用另一副非常小的圖像替換img標簽的“SRC”屬性。這能確保渲染大型圖像所使用的內存被定期釋放。此外,我們保證并沒有引入[圖像空src屬性的錯誤](http://www.nczonline.net/blog/2009/11/30/empty-image-src-can-destroy-your-site/)。
### 技巧2:隱藏頁面
? ? ??釋放圖像并沒有回收足夠的內存來防止崩潰。因此,我們開始通過將CSS?的visibility屬性設置為hidden?來隱藏流的獨立頁面(圖2表示“隱藏”的頁面)。經過這種調整,我們不僅看到了更多的內存被回收(這樣應用程序就不會崩潰),而且渲染速度也更快,因為瀏覽器不會為界面上“隱藏”的頁面進行繪制。
### 技巧3:刪除頁面
? ? ??采用隱藏的頁面可以覆蓋80%的情況。但是余下的20%仍然會導致應用程序崩潰!我們更進一步,開始刪除不需要的頁面。作為副作用,如果我們刪除當前頁面左側的頁面,頁面流會左移,而用戶將失去所在位置。為了保持滾動位置,我們不得不在移除頁面時(即DOM節點)用同樣高度和寬度的空白頁面來取代(圖2中示意的“占位符”)。例如,如果用戶正在瀏覽第5頁,我們刪除第0頁,并用占位符取而代之。
? ? ??采用了上述的3種技術,我們的流開始類似于下面圖里的樣子。?正如你可以在圖1中看到的一樣,如果用戶正在查看第3頁,前一頁和后一頁將完全加載。而當用戶決定向前或者向后翻頁時,他可以看到完全呈現的頁面。當用戶試圖滾動時,我們開始加載圖像并渲染頁面。它可以在iPad模擬器上完美運行,但在實際設備上,你可以看到滾動性能的下降。

圖1

圖2
? ? ??正如圖2所示,當用戶翻動到第5頁,第0和第1頁將會被刪除,第2頁將會隱藏,而第3頁移除了所有圖像。此時,用戶可以繼續向前翻頁,其它頁面將根據它們和可見頁面之間的距離來決定是移除圖像、隱藏還是刪除自身。
? ? ??我們不得不為不同版本的iPad使用一個可變大小的“窗口”。例如,iPad1內存最少,所以我們不得不給它一個非常小的窗口:
~~~
getConfig : function() {
//默認設置
var config = {
size : 3,
maxVisibleOnOneSide : 1,
};
//根據設備更新設置
if($isDesktop || $native.isNative() && $os.ipad) {
//檢測是ipad1還是ipad2
if($isDesktop || $native.getDeviceVersion() > 1) {
config.size = 7;
config.maxVisibleOnOneSide = 2;
}
}
return config;
}
~~~
### 技巧4:避免縮放和盒陰影
? ? ??按照之前的經驗,我們使用兩個HTML / CSS的優化技巧來改善性能:
- 通過HTML?IMG標簽中指定寬度和高度屬性來避免客戶端縮放圖像
- 避免CSS盒陰影:它在[WebKit下很慢](https://bugs.webkit.org/show_bug.cgi?id=22102%60)
### 技術5:減少DOM節點
? ? ??經過上述優化,你是否預期應用再也不會崩潰?錯了!在測試過程中,上述技巧讓應用程序運行的時間更長,但一段時間后它仍然會崩潰。
? ? ??根據之前[iPhone應用](http://itunes.apple.com/us/app/linkedin/id288429040?mt=8)的經驗,我們知道保持DOM節點最少是平滑滾動和保證足夠內存的關鍵點。?記住這一點后,我們將所有占位所用的節點合并為一個虛擬的,相同大小的節點。結果是:不管我們滑動到多少頁,頁面流不會在任何設備上崩潰!最終機制如圖3所示:

圖3
### 技術實現的視頻
? ? ??[這里](http://www.youtube.com/embed/Zc0tCMLRVWU)有一個當用戶滑動翻頁時,DOM所表現出來行為的視頻。左邊我們在Chrome窗口中加載頁面流。而在右邊,我們通過Chrome的開發者工具來展示如何添加或刪除節點和通過虛擬頁面的寬度來填補被刪除的網頁。?請注意DOM節點是如何保持在一個恒定的數量的,以及UL?的第一個li節點(“虛擬”節點)大小是如何增長的(你可能需要全屏播放視頻來看)。
### 失敗的嘗試
? ? ??我們并沒有在第一時間得到正確的結果,所以必須要列出我們一些曾經失敗的嘗試。我們最開始使用多個UIWebViews來各自渲染一個頁面并用UISwipeGestureRecognizer來翻頁。?然而我們很快就意識到,在本地應用程序使用多個Web視圖在內存和性能方面是一種糟糕的方式。
? ? ??隨后我們嘗試了和[3-DIV](http://cubiq.org/swipeview)類似的方法。它可以工作,但是我們對滑動翻頁的性能并不滿意。?有時如果用戶在翻頁,我們同時在渲染一個頁面,單線程的UIWebView?將無法添加到頁面流里面。
### 致謝
? ? ??感謝[Akhilesh Gupta](http://www.linkedin.com/in/guptaakhilesh),?[AarthiJayaram](http://www.linkedin.com/in/aarthijayaram),?[AshitGandhi](http://www.linkedin.com/in/atlgandhi),?[KiranPrasad](http://www.linkedin.com/in/kiranprasad)和[Ganesh Srinivasan](http://www.linkedin.com/in/gan3sh)。
? ? ? 此外,特別感謝?[Ryan](http://www.linkedin.com/in/ryanblunden)幫我為這篇文章錄制視頻。
? ? ??原文鏈接:《[LinkedIn for iPad: 5 techniques for smooth infinite scrolling in HTML5](http://engineering.linkedin.com/linkedin-ipad-5-techniques-smooth-infinite-scrolling-html5)》
? ? ??轉載請注明:來自[蔣宇捷的博客](http://blog.csdn.net/hfahe)
- 前言
- 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跨設備超聲波通信方案