精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

HTML5中手勢原理分析與數學知識的實踐

開發 前端
在這觸控屏的時代,人性化的手勢操作已經深入了我們生活的每個部分。現代應用越來越重視與用戶的交互及體驗,手勢是最直接且最為有效的交互方式,一個好的手勢交互,能降低用戶的使用成本和流程,大大提高了用戶的體驗。

引言

在這觸控屏的時代,人性化的手勢操作已經深入了我們生活的每個部分?,F代應用越來越重視與用戶的交互及體驗,手勢是最直接且最為有效的交互方式,一個好的手勢交互,能降低用戶的使用成本和流程,大大提高了用戶的體驗。

近期,公司的多個項目中都對手勢有著較高的需求,已有的手勢庫無法完全cover,因此便擼了一個輕量、便于使用的移動端手勢庫。這篇博文主要是解析了移動端常用手勢的原理,及從前端的角度學習過程中所使用的數學知識。希望能對大家有一點點的啟發作用,也期待大神們指出不足甚至錯誤,感恩。

主要講解項目中經常使用到的五種手勢:

  • 拖動: drag
  • 雙指縮放: pinch
  • 雙指旋轉: rotate
  • 單指縮放: singlePinch
  • 單指旋轉: singleRotate

Tips :

因為 tap 及 swipe 很多基礎庫中包含,為了輕便,因此并沒有包含,但如果需要,可進行擴展;

實現原理

眾所周知,所有的手勢都是基于瀏覽器原生事件touchstart, touchmove, touchend, touchcancel進行的上層封裝,因此封裝的思路是通過一個個相互獨立的事件回調倉庫handleBus,然后在原生touch事件中符合條件的時機觸發并傳出計算后的參數值,完成手勢的操作。實現原理較為簡單清晰,先不急,我們先來理清一些使用到的數學概念并結合代碼,將數學運用到實際問題中,數學部分可能會比較枯燥,但希望大家堅持讀完,相信會收益良多。

基礎數學知識函數

我們常見的坐標系屬于線性空間,或稱向量空間(Vector Space)。這個空間是一個由點(Point) 和 向量(Vector) 所組成集合;

點(Point)

可以理解為我們的坐標點,例如原點O(0,0),A(-1,2),通過原生事件對象的touches可以獲取觸摸點的坐標,參數index代表第幾接觸點; 

 

向量(Vector)

是坐標系中一種 既有大小也有方向的線段,例如由原點O(0,0)指向點A(1,1)的箭頭線段,稱為向量a,則a=(1-0,1-0)=(1,1);

如下圖所示,其中i與j向量稱為該坐標系的單位向量,也稱為基向量,我們常見的坐標系單位為1,即i=(1,0);j=(0,1);

 

 

獲取向量的函數:

 

向量模

代表 向量的長度,記為|a|,是一個標量,只有大小,沒有方向;

幾何意義代表的是以x,y為直角邊的直角三角形的斜邊,通過勾股定理進行計算;

 

getLength函數:

 

向量的數量積

向量同樣也具有可以運算的屬性,它可以進行加、減、乘、數量積和向量積等運算,接下來就介紹下我們使用到的數量積這個概念,也稱為點積,被定義為公式:

當a=(x1,y1),b=(x2,y2),則a·b=|a|·|b|·cosθ=x1·x2+y1·y2;

共線定理

共線,即兩個向量處于 平行 的狀態,當a=(x1,y1),b=(x2,y2),則存在唯一的一個實數λ,使得a=λb,代入坐標點后,可以得到 x1·y2= y1·x2;

因此當x1·y2-x2·y1>0 時,既斜率 ka > kb ,所以此時b向量相對于a向量是屬于順時針旋轉,反之,則為逆時針;

旋轉角度

通過數量積公式我們可以推到求出兩個向量的夾角:

cosθ=(x1·x2+y1·y2)/(|a|·|b|);

然后通過共線定理我們可以判斷出旋轉的方向,函數定義為:

 

矩陣與變換

由于空間最本質的特征就是其可以容納運動,因此在線性空間中,

我們用向量來刻畫對象,而矩陣便是用來描述對象的運動;

而矩陣是如何描述運動的呢?

我們知道,通過一個坐標系基向量便可以確定一個向量,例如 a=(-1,2),我們通常約定的基向量是 i = (1,0) 與 j = (0,1); 因此:

a = -1i + 2j = -1(1,0) + 2(0,1) = (-1+0,0+2) = (-1,2);

而矩陣變換的,其實便是通過矩陣轉換了基向量,從而完成了向量的變換;

例如上面的栗子,把a向量通過矩陣(1,2,3,0)進行變換,此時基向量i由 (1,0)變換成(1,-2)與j由(0,1)變換成(3,0),沿用上面的推導,則

a = -1i + 2j = -1(-1,2) + 2(3,0) = (5,-2);

如下圖所示:

A圖表示變換之前的坐標系,此時a=(-1,2),通過矩陣變換后,基向量i,j的變換引起了坐標系的變換,變成了下圖B,因此a向量由(-1,2)變換成了(5,-2);

其實向量與坐標系的關聯不變(a = -1i+2j),是基向量引起坐標系變化,然后坐標系沿用關聯導致了向量的變化; 

[[200072]]

 

結合代碼

其實CSS的transform等變換便是通過矩陣進行的,我們平時所寫的translate/rotate等語法類似于一種封裝好的語法糖,便于快捷使用,而在底層都會被轉換成矩陣的形式。例如transform:translate(-30px,-30px)編譯后會被轉換成transform : matrix(1,0,0,1,30,30);

通常在二維坐標系中,只需要 2X2 的矩陣便足以描述所有的變換了, 但由于CSS是處于3D環境中的,因此CSS中使用的是 3X3 的矩陣,表示為:

 

其中第三行的0,0,1代表的就是z軸的默認參數。這個矩陣中,(a,b) 即為坐標軸的 i基,而(c,d)既為j基,e為x軸的偏移量,f為y軸的偏移量;因此上栗便很好理解,translate并沒有導致i,j基改變,只是發生了偏移,因此translate(-30px,-30px) ==> matrix(1,0,0,1,30,30)~

所有的transform語句,都會發生對應的轉換,如下:

  1. // 發生偏移,但基向量不變; 
  2.  
  3. transform:translate(x,y) ==> transform:matrix(1,0,0,1,x,y) 
  4.  
  5.   
  6.  
  7. // 基向量旋轉; 
  8.  
  9. transform:rotate(θdeg)==> transform:matrix(cos(θ·π/180),sin(θ·π/180),-sin(θ·π/180),cos(θ·π/180),0,0) 
  10.  
  11.   
  12.  
  13. // 基向量放大且方向不變; 
  14.  
  15. transform:scale(s) ==> transform:matrix(s,0,0,s,0,0)  

translate/rotate/scale等語法十分強大,讓我們的代碼更為可讀且方便書寫,但是matrix有著更強大的轉換特性,通過matrix,可以發生任何方式的變換,例如我們常見的鏡像對稱,transform:matrix(-1,0,0,1,0,0);

[[200074]] 

MatrixTo

然而matrix雖然強大,但可讀性卻不好,而且我們的寫入是通過translate/rotate/scale的屬性,然而通過getComputedStyle讀取到的 transform卻是matrix:

  1. transform:matrix(1.41421, 1.41421, -1.41421, 1.41421, -50, -50); 

請問這個元素發生了怎么樣的變化?。。這就一臉懵逼了。-_-|||

因此,我們必須要有個方法,來將matrix翻譯成我們更為熟悉的translate/rotate/scale方式,在理解了其原理后,我們便可以著手開始表演咯~

我們知道,前4個參數會同時受到rotate和scale的影響,具有兩個變量,因此需要通過前兩個參數根據上面的轉換方式列出兩個不等式:

  1. cos(θ·π/180)*s=1.41421; 
  2.  
  3. sin(θ·π/180)*s=1.41421;  

將兩個不等式相除,即可以輕松求出θ和s了,perfect!!函數如下:

 

手勢原理

接下來我們將上面的函數用到實際環境中,通過圖示的方式來模擬手勢的操作,簡要地講解手勢計算的原理。希望各位大神理解這些基礎的原理后,能創造出更多炫酷的手勢,像我們在mac觸控板上使用的一樣。

下面圖例:

圓點: 代表手指的觸碰點;

兩個圓點之間的虛線段: 代表雙指操作時組成的向量;

a向量/A點:代表在 touchstart 時獲取的初始向量/初始點;

b向量/B點:代表在 touchmove 時獲取的實時向量/實時點;

坐標軸底部的公式代表需要計算的值;

Drag(拖動事件)

 

上圖是模擬了拖動手勢,由A點移動到B點,我們要計算的便是這個過程的偏移量;

因此我們在touchstart中記錄初始點A的坐標:

  1. // 獲取初始點A; 
  2.  
  3. let startPoint = getPoint(ev,0);  

然后在touchmove事件中獲取當前點并實時的計算出△x與△y:

  1. // 實時獲取初始點B; 
  2.  
  3. let curPoint = getPoint(ev,0); 
  4.  
  5.   
  6.  
  7. // 通過A、B兩點,實時的計算出位移增量,觸發 drag 事件并傳出參數; 
  8.  
  9. _eventFire('drag', { 
  10.  
  11.     delta: { 
  12.  
  13.         deltaX: curPoint.x - startPoint.x, 
  14.  
  15.         deltaY: curPoint.y - startPoint.y, 
  16.  
  17.     }, 
  18.  
  19.     origin: ev, 
  20.  
  21. }); 

Tips: fire函數即遍歷執行drag事件對應的回調倉庫即可;

Pinch(雙指縮放)

 

上圖是雙指縮放的模擬圖,雙指由a向量放大到b向量,通過初始狀態時的a向量的模與touchmove中獲取的b向量的模進行計算,便可得出縮放值:

  1. // touchstart中計算初始雙指的向量模; 
  2.  
  3. let vector1 = getVector(secondPoint, startPoint); 
  4.  
  5. let pinchStartLength = getLength(vector1); 
  6.  
  7.   
  8.  
  9. // touchmove中計算實時的雙指向量模; 
  10.  
  11. let vector2 = getVector(curSecPoint, curPoint); 
  12.  
  13. let pinchLength = getLength(vector2); 
  14.  
  15. this._eventFire('pinch', { 
  16.  
  17.     delta: { 
  18.  
  19.         scale: pinchLength / pinchStartLength, 
  20.  
  21.     }, 
  22.  
  23.     origin: ev, 
  24.  
  25. });  

Rotate(雙指旋轉)

 

初始時雙指向量a,旋轉到b向量,θ便是我們需要的值,因此只要通過我們上面構建的getAngle函數,便可求出旋轉的角度:

  1. // a向量; 
  2.  
  3. let vector1 = getVector(secondPoint, startPoint); 
  4.  
  5.   
  6.  
  7. // b向量; 
  8.  
  9. let vector2 = getVector(curSecPoint, curPoint); 
  10.  
  11.   
  12.  
  13. // 觸發事件; 
  14.  
  15. this._eventFire('rotate', { 
  16.  
  17.     delta: { 
  18.  
  19.         rotate: getAngle(vector1, vector2), 
  20.  
  21.     }, 
  22.  
  23.     origin: ev, 
  24.  
  25. });  

singlePinch(單指縮放)

 

與上面的手勢不同,單指縮放和單指旋轉都需要多個特有概念:

操作元素(operator):需要操作的元素。上面三個手勢其實并不關心操作元素,因為單純靠手勢自身,便能計算得出正確的參數值,而單指縮放和旋轉需要依賴于操作元素的基準點(操作元素的中心點)進行計算;

按鈕:因為單指的手勢與拖動(drag)手勢是相互沖突的,需要一種特殊的交互方式來進行區分,這里是通過特定的區域來區分,類似于一個按鈕,當在按鈕上操作時,是單指縮放或者旋轉,而在按鈕區域外,則是常規的拖動,實踐證明,這是一個用戶很容易接受且體驗較好的操作方式;

圖中由a向量單指放大到b向量,對操作元(正方形)素進行了中心放大,此時縮放值即為b向量的模 / a向量的模;

  1. // 計算單指操作時的基準點,獲取operator的中心點; 
  2.  
  3. let singleBasePoint = getBasePoint(operator); 
  4.  
  5.   
  6.  
  7. // touchstart 中計算初始向量模; 
  8.  
  9. let pinchV1 = getVector(startPoint,singleBasePoint); 
  10.  
  11. singlePinchStartLength = getLength(pinchV1); 
  12.  
  13.   
  14.  
  15. // touchmove 中計算實時向量模; 
  16.  
  17. pinchV2 = getVector(curPoint, singleBasePoint); 
  18.  
  19. singlePinchLength = getLength(pinchV2); 
  20.  
  21.   
  22.  
  23. // 觸發事件; 
  24.  
  25. this._eventFire('singlePinch', { 
  26.  
  27.     delta: { 
  28.  
  29.         scale: singlePinchLength / singlePinchStartLength, 
  30.  
  31.     }, 
  32.  
  33.     origin: ev, 
  34.  
  35. }); 

 singleRotate(單指旋轉)

 

結合單指縮放和雙指旋轉,可以很簡單的知道 θ便是我們需要的旋轉角度;

  1. // 獲取初始向量與實時向量 
  2.  
  3. let rotateV1 = getVector(startPoint, singleBasePoint); 
  4.  
  5. let rotateV2 = getVector(curPoint, singleBasePoint); 
  6.  
  7.   
  8.  
  9. // 通過 getAngle 獲取旋轉角度并觸發事件; 
  10.  
  11. this._eventFire('singleRotate', { 
  12.  
  13.     delta: { 
  14.  
  15.         rotate: getAngle(rotateV1, rotateV2), 
  16.  
  17.     }, 
  18.  
  19.     origin: ev, 
  20.  
  21. });  

運動增量

由于touchmove事件是個高頻率的實時觸發事件,一個拖動操作,其實觸發了N次的touchmove事件,因此計算出來的值只是一種增量,即代表的是一次 touchmove事件增加的值,只代表一段很小的值,并不是最終的結果值,因此需要由mtouch.js外部維護一個位置數據,類似于:

  1. //    真實位置數據; 
  2.  
  3. let dragTrans = {x = 0,y = 0}; 
  4.  
  5.   
  6.  
  7. // 累加上 mtouch 所傳遞出的增量 deltaX 與 deltaY; 
  8.  
  9. dragTrans.x += ev.delta.deltaX; 
  10.  
  11. dragTrans.y += ev.delta.deltaY; 
  12.  
  13.   
  14.  
  15. // 通過 transform 直接操作元素; 
  16.  
  17. set($drag,dragTrans);  

初始位置

維護外部的這個位置數據,如果初始值像上述那樣直接取0,則遇到使用css設置了transform屬性的元素便無法正確識別了,會導致操作元素開始時瞬間跳回(0,0)的點,因此我們需要初始去獲取一個元素真實的位置值,再進行維護與操作。此時,便需要用到上面我們提到的getComputedStyle方法與matrixTo函數:

  1. // 獲取css transform屬性,此時得到的是一個矩陣數據; 
  2.  
  3. // transform:matrix(1.41421,1.41421,-1.41421,1.41421,-50,-50); 
  4.  
  5. let style = window.getComputedStyle(el,null); 
  6.  
  7. let cssTrans = style.transform || style.webkitTransform; 
  8.  
  9.   
  10.  
  11. // 按規則進行轉換,得到: 
  12.  
  13. let initTrans = _.matrixTo(cssTrans); 
  14.  
  15.   
  16.  
  17. // {x:-50,y:-50,scale:2,rotate:45}; 
  18.  
  19. // 即該元素設置了:transform:translate(-50px,-50px) scale(2) rotate(45deg);  

結語

至此,相信大家對手勢的原理已經有基礎的了解,基于這些原理,我們可以再封裝出更多的手勢,例如雙擊,長按,掃動,甚至更酷炫的三指、四指操作等,讓應用擁有更多人性化的特質。

基于以上原理,我封裝了幾個常見的工具:(求star -.-)

Tips: 因為只針對移動端,需在移動設備中打開demo,或者pc端開啟mobile調試模式!

  1. mtouch.js : 移動端的手勢庫,封裝了上述的五種手勢,精簡的api設計,涵蓋了常見的手勢交互,基于此也可以很方便的進行擴展。
  2. touchkit.js : 基于mtouch所封裝的一層更貼近業務的工具包,可用于制作多種手勢操作業務,一鍵開啟,一站式服務。
  3. mcanvas.js : 基于canvas 開放極簡的api實現圖片 一鍵導出等。

致謝

  • 張鑫旭: 獲取元素CSS值之getComputedStyle方法熟悉
  • 張鑫旭:理解CSS3 transform中的Matrix(矩陣)
  • AlloyTeam團隊的AlloyFinger
  • hcysunyangd: 從矩陣與空間操作的關系理解CSS3的transform
  • 線性代數的理解 學完再看覺得自己弱爆了
責任編輯:龐桂玉 來源: 前端大全
相關推薦

2018-03-22 19:48:47

前端HTML5數學知識

2017-09-27 15:17:54

HTML5Hybrid手勢

2017-03-27 08:36:08

2018-05-11 09:43:55

2012-08-30 16:24:04

HTML5歐朋W3C

2012-07-27 09:25:40

2015-04-30 11:26:38

HTML5與APP的抉

2009-07-24 13:54:39

MVVM模式

2014-03-20 10:50:44

HTML5 定位技術

2015-05-22 10:06:58

2015-06-10 10:18:27

WebAPP開發技巧

2012-03-29 09:18:47

HTML5WEB

2012-02-23 10:28:43

AppCanHTML5移動應用

2013-01-24 10:26:04

HTML5HTML 5HTML5的未來

2013-05-28 15:35:47

html5多線程

2012-06-25 11:49:17

ibmdw

2011-05-13 17:36:05

HTML

2021-01-06 15:29:54

數據科學數學知識數學工具

2023-03-16 09:00:00

HTML5HTML語言

2011-05-12 16:45:02

HTML5divsection
點贊
收藏

51CTO技術棧公眾號

亚洲午夜精品福利| 色综合天天综合网天天看片| 国产日韩欧美中文| 黄色片子在线观看| 性国裸体高清亚洲| 久久久国产午夜精品| 国产精品激情av在线播放| 四虎884aa成人精品| 2023国产精华国产精品| 欧美日韩激情小视频| 亚洲午夜久久久影院伊人| 亚洲爱爱综合网| 欧美一级久久| 久久成人国产精品| 波多野结衣一本| 99久久伊人| 亚洲一区二区欧美| 日本一区免费看| 久久99久久99精品免费看小说| 欧美日韩黄网站| 国产精品第13页| 精品产品国产在线不卡| 国产一级一级片| 精品国产一区一区二区三亚瑟| 91精品在线麻豆| 日韩精品视频久久| 青草在线视频| 中文字幕av在线一区二区三区| 999热视频在线观看| 国产情侣小视频| 99精品视频免费观看视频| www.欧美精品| 日韩一级免费片| 91超碰在线免费| 国产精品大尺度| 欧美资源一区| 天堂网av2014| 国产成人av自拍| 成人免费在线视频网址| 免费污污视频在线观看| 自拍欧美一区| 欧美不卡一区二区三区| 少妇大叫太大太粗太爽了a片小说| 国产三级在线免费观看| av不卡在线观看| 97中文在线| av一级黄色片| 国内不卡的二区三区中文字幕 | 四虎地址8848| 欧美一区二区三| 国产亚洲a∨片在线观看| 女同性恋一区二区三区| 都市激情久久| 欧美mv和日韩mv的网站| 中文字幕无码毛片免费看| 在线看一级片| 自拍av一区二区三区| 亚洲欧美日韩国产成人综合一二三区| 一区二区自拍偷拍| 日本中文在线一区| 国产精品久久久久77777| 超碰在线观看91| 日韩av一区二| 国产欧洲精品视频| 国产又黄又猛又爽| 国产精品夜夜嗨| 动漫3d精品一区二区三区| 午夜精品久久久久久久99 | 色婷婷综合久久久久中文| 18禁免费观看网站| 小早川怜子影音先锋在线观看| 激情久久av一区av二区av三区| xxxx18hd亚洲hd捆绑| 国产永久免费高清在线观看| 91首页免费视频| 欧美日韩国产一二| 国产人妖在线播放| 国产乱码精品一区二区三区av| 成人网在线视频| www日本高清视频| 成人精品小蝌蚪| 蜜桃在线一区二区三区精品| 国产小视频在线播放| 国产精品久线观看视频| 日韩精品一区二区三区电影| 人人澡人人添人人爽一区二区| 亚洲国产精品一区二区www在线 | 三级在线看中文字幕完整版| 日韩欧美亚洲成人| 一个色综合久久| 香蕉免费一区二区三区在线观看 | 欧美日韩国内自拍| 午夜免费高清视频| 水蜜桃在线视频| 欧美在线制服丝袜| 三上悠亚 电影| 天天久久夜夜| 日韩日本欧美亚洲| 日韩成人免费在线观看| 日本人妖一区二区| 不卡日韩av| 国产天堂素人系列在线视频| 亚洲男人都懂的| 久久久免费视频网站| 青青伊人久久| 亚洲国产成人在线视频| 日本美女黄色一级片| 999在线观看精品免费不卡网站| 日本精品久久久久影院| www日本在线| 亚洲国产精品精华液ab| 男人天堂av片| 99er精品视频| 亚洲天堂av女优| 国产亚洲精品成人| 欧美国产91| 日本久久久久久| 黄色aaa毛片| 中文字幕在线不卡| 日本精品久久久久中文字幕| 欧美经典影片视频网站| 中文字幕亚洲图片| 五月婷婷亚洲综合| 国产成人精品免费| 亚洲在线不卡| 波多野结衣亚洲| 精品成人佐山爱一区二区| av资源在线免费观看| 美女黄色成人网| 国产麻豆日韩| 羞羞视频在线观看免费| 欧美精品在欧美一区二区少妇| 国产一级二级在线观看| 要久久爱电视剧全集完整观看 | 在线日韩国产网站| 三级成人在线视频| 精品国产一二| 丁香高清在线观看完整电影视频| 亚洲图片欧美综合| 黄色三级视频在线播放| 日韩毛片视频| 国产精品久久久久久久美男| 精品欧美不卡一区二区在线观看 | 99re热视频| 91啪亚洲精品| 国产91在线免费| 国产精品自在| 久久久久久久成人| 嫩草影院一区二区| 亚洲一区二区偷拍精品| 中文字幕制服丝袜| 狠狠爱综合网| 日本人成精品视频在线| 免费看黄网站在线观看| 亚洲大片在线观看| 朝桐光av一区二区三区| 亚洲精一区二区三区| 清纯唯美日韩制服另类| 伊人久久成人网| 久久久五月婷婷| 欧美少妇性生活视频| 久久成人av| 国产v综合v亚洲欧美久久 | 久久精品在线视频| 国产在线视频在线观看| 国产suv一区二区三区88区| 日韩中文字幕在线不卡| 2023国产精华国产精品| 午夜欧美不卡精品aaaaa| 日本福利片高清在线观看| 欧美视频中文在线看| 精品少妇一区二区三区免费观| 丝袜美腿亚洲一区二区图片| 3d动漫啪啪精品一区二区免费| 爆操欧美美女| 亚洲大尺度美女在线| 中文字幕亚洲精品一区| 日本一区二区三区久久久久久久久不| 色综合手机在线| 亚洲影视一区二区三区| 国产伦精品一区二区三区照片| 中文字幕资源网在线观看免费| 亚洲欧美中文字幕在线一区| 一区不卡在线观看| 亚洲一区二区三区在线播放| 国产精品三级在线观看无码| 男女男精品视频| 91大学生片黄在线观看| 偷拍自拍亚洲色图| 国产视频福利一区| 波多野结衣久久| 这里只有精品视频| 亚洲伦理在线观看| 欧美中文一区二区三区| 精国产品一区二区三区a片| 91网址在线看| 亚洲第一成肉网| 99日韩精品| 成年人免费观看的视频| 国产三级精品三级在线观看国产| 国产成人精品在线视频| 新版中文在线官网| 亚洲人成电影网站| www精品国产| 欧美亚日韩国产aⅴ精品中极品| 欧美xxxx黑人xyx性爽| 久久色.com| 农村末发育av片一区二区| 日日欢夜夜爽一区| 三上悠亚久久精品| 国产精品久久久久一区二区三区厕所| 精品久久久久久乱码天堂| 日本免费在线一区| 国产成人综合亚洲| a国产在线视频| 久热精品视频在线观看| 国产小视频免费在线观看| 精品日韩欧美一区二区| 中文字幕在线观看你懂的| 亚洲成人777| 午夜激情福利网| 欧美极品美女视频| 手机av免费看| 成人av在线播放网站| 妖精视频在线观看| 精品一区中文字幕| 四虎永久免费网站| 精品视频久久| 超碰在线最新| 欧美日韩久久| 成人有码在线视频| 精品日本视频| 奇米4444一区二区三区| 在线观看wwwxxxx| 久久精品国产精品| 幼a在线观看| 国产一区二区三区在线观看网站| 国产香蕉在线观看| 欧美va亚洲va| 性色av蜜臀av| 日韩女优视频免费观看| 国产巨乳在线观看| 欧美精品久久一区| 亚洲一级视频在线观看| 欧美在线不卡视频| 伊人久久中文字幕| 欧美综合欧美视频| 波多野结衣人妻| 在线观看一区不卡| 欧美一级淫片免费视频黄| 欧美性xxxx极品hd欧美风情| 久久国产视频播放| 色综合久久中文字幕综合网| 国产专区第一页| 欧美日韩中文字幕日韩欧美| wwwxxx亚洲| 91福利国产成人精品照片| 亚洲婷婷在线观看| 丁香天五香天堂综合| 中文字幕99页| 99久久99久久综合| 亚洲av综合一区二区| 国产性天天综合网| 欧美高清精品一区二区| 国产精品一区二区视频| 精品国产免费久久久久久婷婷| 成人做爰69片免费看网站| 欧美一区二区免费在线观看| 91免费看`日韩一区二区| 天堂久久精品忘忧草| 久久精品视频网| 精品一区二区在线观看视频| 亚洲免费观看高清完整版在线| 欧美成人三级视频| 亚洲成国产人片在线观看| 欧美特黄aaaaaa| 欧美视频一区二区三区在线观看| 亚洲专区在线播放| 精品剧情v国产在线观看在线| 亚洲精选一区二区三区| 精品视频久久久久久| 国产情侣激情自拍| 亚洲成**性毛茸茸| 黄色av网址在线免费观看| 中文字幕亚洲图片| 亚洲国产精品精华素| 538国产精品一区二区在线| 成人爽a毛片免费啪啪| 国产日韩在线精品av| 999久久精品| 欧美精品在线一区| 91精品国产调教在线观看| 欧美日韩天天操| 日韩在线不卡| www精品久久| 免费高清成人在线| 色欲无码人妻久久精品| 91视频在线观看免费| www.97视频| 色综合色狠狠综合色| av中文字幕免费在线观看| 亚洲精品理论电影| 欧美激情二区| 欧美亚洲成人精品| 榴莲视频成人app| 青青草原成人| 国内自拍一区| 三上悠亚在线一区二区| 波多野结衣亚洲一区| 97精品在线播放| 欧美视频专区一二在线观看| 国产av无码专区亚洲av| 亚洲欧美日韩中文在线制服| 欧美videosex性极品hd| 国产男人精品视频| 偷拍亚洲色图| 久久这里只有精品18| 老司机午夜精品99久久| 在线 丝袜 欧美 日韩 制服| 亚洲乱码精品一二三四区日韩在线| 无码人妻av一区二区三区波多野| 日韩欧美色综合网站| 成人免费视频| 欧美一区二区三区精品电影| 天堂av一区| 警花观音坐莲激情销魂小说| 日韩**一区毛片| 91网站免费视频| 五月婷婷久久综合| 国产富婆一级全黄大片| 久久精品视频网站| 国产福利亚洲| 婷婷久久伊人| 日韩国产在线一| 99久久久久久久久久| 亚洲高清视频中文字幕| 午夜精品久久久久久久99| 久久久极品av| 亚洲91在线| 亚洲一区二区三区免费观看| 日韩中文字幕麻豆| 欧美性猛交xxxx乱| 欧美性色xo影院| 亚洲色图欧美视频| 97福利一区二区| 久久久久观看| 久久综合色视频| www.日韩在线| 亚洲精品视频在线观看免费视频| 日韩精品中文字幕在线不卡尤物| а天堂中文在线官网| 亚洲精品免费一区二区三区| 久久久久免费av| 日韩不卡的av| 亚洲伊人伊色伊影伊综合网| 成人久久精品人妻一区二区三区| 九九热在线精品视频| 深夜成人在线| 久久精品成人一区二区三区蜜臀| 国产一区二区三区成人欧美日韩在线观看 | 亚洲午夜av在线| 免费看日韩av| 欧美一区二三区| 精品毛片免费观看| wwwwwxxxx日本| 亚洲乱码国产乱码精品精可以看| 精品区在线观看| 国内偷自视频区视频综合| 久久综合五月婷婷| 日本精品www| 国产精品久久久久久久久动漫| 国产一区二区三区三州| 欧美老女人在线视频| 九色丨蝌蚪丨成人| 日本xxxxxxx免费视频| 国产精品高清亚洲| 亚洲精品久久久久久动漫器材一区| 欧美激情一级欧美精品| 久久99视频| 国产女同无遮挡互慰高潮91| 99re热视频精品| 高潮毛片又色又爽免费 | 国产亚洲精品自拍| 亚洲成人黄色av| 91精品国产一区二区三区蜜臀| 欧美黑人猛交| 日本一区二区精品| 国模大尺度一区二区三区| 精国产品一区二区三区a片| 亚洲美女黄色片| 亚洲网站三级| 成人性免费视频| 国产欧美va欧美不卡在线| 国产探花精品一区二区| 91精品国产高清自在线| 97精品国产福利一区二区三区| av天堂一区二区| 欧美日韩在线亚洲一区蜜芽| 日本aa在线| 婷婷五月色综合|