webView 之 webapp在ios中簡單實現滑動,回彈,加速等效果
webkit-overflow-scrolling來自safari原生控制元件的實現,工作原理是:在有這個屬性的容器上,系統會建立了一個uiscrollview,應用於該元素並將之作為渲染物件,從而為我們實現體驗流暢的觸屏滑動
在Ios上的表現結果令人十分滿意,並且網頁滑動和區域滑動的衝突同樣解決的很好
要實現這個效果很簡單,只需要加一行css程式碼即可:
- -webkit-overflow-scrolling : touch;
-
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <metacharset="utf-8"/>
- <title>scroll</title>
- <styletype="text/css">
- .container {
- width : 300px;
- height : 50%;
- -webkit-box-sizing : border-box;
-
position : relative;
- overflow-y : auto;
- background-color : cyan;
- -webkit-overflow-scrolling : touch; /* liuhx:可以把這整行註釋掉對比差別 */
- }
- ul {
- height: 50px;
- }
- </style>
- </head>
- <body>
-
<
- <navclass="container">
- <ul>1</ul>
- <ul>2</ul>
- <ul>3</ul>
- <ul>4</ul>
- <ul>5</ul>
- <ul>6</ul>
- <ul>7</ul>
- <ul>8</ul>
- <ul>9</ul>
- <ul>10</ul>
- <ul>11</ul>
- <ul>12</ul>
- <ul>13</ul>
- <ul>14</ul>
- <ul>15</ul>
- <ul>16</ul>
- <ul>17</ul>
- <ul>18</ul>
- <ul>19</ul>
- <ul>20</ul>
- </nav>
- </div>
- </body>
- </html>
實際上,Safari真的用了原生控制元件來實現,對於有-webkit-overflow-scrolling的網頁,會建立一個UIScrollView,提供子layer給渲染模組使用。建立時的堆疊如下:
- Thread 1, Queue : com.apple.main-thread
- #0 0x00086723 in -[UIScrollView initWithFrame:] ()
- #1 0x004ec3bd in -[UIWebOverflowScrollView initWithLayer:node:webDocumentView:] ()
- #2 0x001f1769 in -[UIWebDocumentView webView:didCreateOrUpdateScrollingLayer:withContentsLayer:scrollSize:forNode:allowHorizontalScrollbar:allowVerticalScrollbar:] ()
- #3 0x01d571bd in __invoking___ ()
- #4 0x01d570d6 in -[NSInvocation invoke] ()
- #5 0x01d5724a in -[NSInvocation invokeWithTarget:] ()
- #6 0x027fb6a1 in -[_WebSafeForwarder forwardInvocation:] ()
- #7 0x027fb8ab in __44-[_WebSafeAsyncForwarder forwardInvocation:]_block_invoke_0 ()
- #8 0x04ac753f in _dispatch_call_block_and_release ()
- #9 0x04ad9014 in _dispatch_client_callout ()
- #10 0x04ac97d5 in _dispatch_main_queue_callback_4CF ()
- #11 0x01d09af5 in __CFRunLoopRun ()
- #12 0x01d08f44 in CFRunLoopRunSpecific ()
- #13 0x01d08e1b in CFRunLoopRunInMode ()
- #14 0x01cbd7e3 in GSEventRunModal ()
- #15 0x01cbd668 in GSEventRun ()
- #16 0x00032ffc in UIApplicationMain ()
- #17 0x00002ae2 in main at /Users/liuhx/Desktop/UIWebView_Research/WebViewResearch/main.mm:16
- @class DOMNode, UIWebDocumentView, UIWebOverflowContentView, UIWebOverflowScrollListener;
- @interface UIWebOverflowScrollView : UIScrollView
- {
- UIWebDocumentView *_webDocumentView;
- UIWebOverflowScrollListener *_scrollListener;
- UIWebOverflowContentView *_overflowContentView;
- DOMNode *_node;
- BOOL _beingRemoved;
- }
- @property(nonatomic, getter=isBeingRemoved) BOOL beingRemoved; // @synthesize beingRemoved=_beingRemoved;
- @property(retain, nonatomic) DOMNode *node; // @synthesize node=_node;
- @property(retain, nonatomic) UIWebOverflowContentView *overflowContentView; // @synthesize overflowContentView=_overflowContentView;
- @property(retain, nonatomic) UIWebOverflowScrollListener *scrollListener; // @synthesize scrollListener=_scrollListener;
- @property(nonatomic) UIWebDocumentView *webDocumentView; // @synthesize webDocumentView=_webDocumentView;
- - (void)setContentOffset:(struct CGPoint)arg1;
- - (void)_replaceLayer:(id)arg1;
- - (void)prepareForRemoval;
- - (void)fixUpViewAfterInsertion;
- - (id)superview;
- - (void)dealloc;
- - (id)initWithLayer:(id)arg1 node:(id)arg2 webDocumentView:(id)arg3;
- @end
UIWebOverflowContentView的宣告為:
- @interface UIWebOverflowContentView : UIView
- {
- }
- - (void)_setCachedSubviews:(id)arg1;
- - (void)_replaceLayer:(id)arg1;
- - (void)fixUpViewAfterInsertion;
- - (id)superview;
- - (id)initWithLayer:(id)arg1;
- @end
以上兩個類都是UIKit層的實現,需要WebCore有硬體加速的支援才有實際意義,相關的邏輯被包含在
ACCELERATED_COMPOSITING
這個巨集裡。從SVN log看,在WebKit 108400版本左右才支援,所以iOS Safari應該是需要5.0。Android只在4.0以上支援。
從前端開發的角度講,只需要知道CSS的屬性-webkit-overflow-scrolling是真的建立了帶有硬體加速的系統級控制元件,所以效率很高。但是這相對是耗更多記憶體的,最好在產生了非常大面積的overflow時才應用。
相關推薦
webView 之 webapp在ios中簡單實現滑動,回彈,加速等效果
webkit-overflow-scrolling來自safari原生控制元件的實現,工作原理是:在有這個屬性的容器上,系統會建立了一個uiscrollview,應用於該元素並將之作為渲染物件,從而為我們實現體驗流暢的觸屏滑動 在Ios上的表現結果令人十分滿意,並且網頁
webapp在ios中簡單實現滑動,回彈,加速等效果
-webkit-overflow-scrolling來自safari原生控制元件的實現,工作原理是:在有這個屬性的容器上,系統會建立了一個uiscrollview,應用於該元素並將之作為渲染物件,從而為我們實現體驗流暢的觸屏滑動 在Ios上的表現結果令人十分滿意,並且網
Socket程式設計之TCP的簡單實現
Client import java.io.*; import java.net.Inet4Address; import java.net.InetSocketAddress; import java.net.Socket; public class Client { pub
Android中簡單實現DrawerLayout
<android.support.v4.widget.DrawerLayout xmlns:android=“http://schemas.android.com/apk/res/android” xmlns:app=“http://schemas.android.com/apk/re
pathon爬蟲中簡單的請求頭fake_useragent庫,處理反爬問題
安裝 pip3 install fake_useragent 各瀏覽器User-Agent的值 from fake_useragent import UserAgent ua = UserAgent() # ie瀏覽器的user agent print(ua.ie) Mozill
設計模式之代理模式簡單實現
簡介 代理模式通常用於達到對原有系統功能進行擴充的目的,比如:你剛接手一個別人沒有完成的專案,這時你不想動別人原來的程式碼,還需要新增新功能。這時代理模式,這時代理模式會很好的幫我們解決問題 代理模式一般分為靜態代理,動態代理兩種 靜態代理 靜態代理一般是
入門 之 js中axios實現與後臺互動入口
格式略 寫不進去 !!! <script src="js/axios.min.js"></script> <script> window.onload = function(){ // 1.第一種 axios
TensorFlow之神經網路簡單實現MNIST資料集分類
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist=input_data.read_data_sets("MNIST_data",one_hot=True) ba
C# TreeView 拖拽節點到另一個容器Panel中簡單實現
C# TreeView 拖拽節點到另一個容器Panel中簡單實現 用了這麼久C#拖拽功能一直沒有用到也就沒用過,今天因為專案需要,領導特地給我簡單講解了下拖拽功能,真是的大師講解一點通啊。特地寫一篇部落格記錄下,分享給大家!也方便以後自己檢視。 1.拖拽功能分析 拖拽功能分析其實就三個字:選-->
SSM整合系列之 整合Quartz簡單實現任務排程
1.摘要:Quartz是Java領域的開源任務排程工具,是一個任務排程框架,通過觸發器設定作業的定時執行規則,來執行定時任務。在專案中使用頻繁,本文將在SSM整合專案上整合Quartz框架實現任務排程。 基礎專案的搭建參考文章:https://blog.csdn.net/caiqing1
vue簡單實現滑動到底部載入更多
思路: 如果可視區的高度域dom元素的getBoundingClientRect().bottom高度相同說明已經到了底部,可以實現載入了 template: <template> <div class="content"> <d
帶滑動條的導航欄(中)---jQuery實現滑動效果
前言 本節利用jQuery實現最終的滑動效果。文件示例程式碼下面有下載連結。 網頁程式碼 navigator2.html <!DOCTYPE html> <html> <head> <meta charset="u
ASP.NET中怎樣實現圖片驗證碼功能,並且點選圖片會重新整理
------ 基本思路: 圖片的src=後臺的一個函式,此函式返回按照一定規則生成的圖片檔案流。 然後此圖片即可生成。 那麼怎樣重新整理驗證碼呢,這是個問題。 因為給圖片的src賦了值之後,想要更換一個圖片,那麼src的那個函式必須再執行一次才行。 <img src=
安卓介面之Viewpager和Tablayout實現滑動介面
摘要:六部實現選項卡介面 一. 在gradle檔案新增以下程式碼: implementation 'com.android.support:design:28.0.0' 在gradle檔案新增以上程式碼後,才能使用Tablayout(版本號28.0.0是我做實驗時
安卓界面之Viewpager和Tablayout實現滑動界面
多個 ces listt man bind tle find you 安卓 摘要:六部實現選項卡界面 一. 在gradle文件添加以下代碼: implementation ‘com.android.support:design:28.0.0‘ 在gradle文件添
hive中簡單介紹分割槽表(partition table),含動態分割槽(dynamic partition)與靜態分割槽(static partition)
hive> insert overwrite table partition_test partition(stat_date='20110527',province='liaoning') select member_id,name from partition_test_input; WARNING
微信中如何實現APP分享連結判斷,實現在預設瀏覽器開啟
要做app的分享到微信的頁面,如果手機已經安裝了這個APP就顯示“開啟應用”按鈕,如果手機沒有安裝app就顯示“下載應用”按鈕。但是 如果使用者是在微信環境中打開了這個連結是無法進行下載和喚醒APP的,所以要價格判斷 如果使用者在微信打開了,需要跳到瀏覽器開啟下載連結或者喚醒APP! 現在可以實現安卓手機的
Java Web中簡單實現自動登陸功能。
Java 對自動登陸功能的簡單實現,僅用到了servlet和一個filter。第一次寫博文,如有不足的地方,敬請指正,謝謝。 登陸介面 <%@ page language="java" import="java.util.*" pageEncoding="UTF
JavaWeb之Servlet的簡單實現
上篇文章學習了Servlet的概念、技術功能、技術特點、生命週期和工作過程。如果對Servlet不瞭解的可以去檢視JavaWeb學習之Servlet。瞭解了Servlet是什麼之後,就開始程式碼實踐,
安卓開發之使用ViewDragHelper簡單實現Activity左滑返回
一、ViewDragHelper 在另一篇部落格裡介紹了ViewDragHelper,這裡就不再介紹了。 二、Activity左滑返回的簡單實現 基本思路是使用ViewDragHelper自定義一個ViewGroup(命名為Swipe