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

實現Web端自定義截屏(原生JS版)

開發 前端
前幾天我發布了一個web端自定義截圖的插件,在使用過程中有開發者反饋這個插件無法在vue2項目中使用,于是,我就開始找問題,發現我的插件是基于Vue3的開發的,由于Vue3的插件和Vue2的插件完全不兼容,因此插件也就只能在Vue3項目中使用。

[[381668]]

本文轉載自微信公眾號「神奇的程序員K」,作者神奇的程序員K。轉載本文請聯系神奇的程序員K公眾號。

前言

前幾天我發布了一個web端自定義截圖的插件,在使用過程中有開發者反饋這個插件無法在vue2項目中使用,于是,我就開始找問題,發現我的插件是基于Vue3的開發的,由于Vue3的插件和Vue2的插件完全不兼容,因此插件也就只能在Vue3項目中使用。

經過一番考慮后,我決定用原生js來重構這個插件,讓其不依賴任何庫,這樣它就能運行在任意一臺支持js的設備上,本文就跟大家分享下我重構這個插件的過程,歡迎各位感興趣的開發者閱讀本文。

運行結果視頻:(請看原文)

使用Vue實現Web端的自定義截屏,效果如視頻所示,文章,教程,體驗地址明天和大家分享[壞笑] #Vue #截屏 #自定義截屏 #Web前端

寫在前面

本文不講解插件的具體實現思路,對插件實現思路感興趣的開發者請移步:實現Web端自定義截屏

搭建開發環境

我想使用ts、scss、eslint、prettier來提升插件的可維護性,又嫌麻煩,不想手動配置webpack環境,于是我決定使用Vue CLI來搭建插件開發環境。

本文不細講Vue CLI搭建插件開發環境的過程,對此感興趣的開發者請移步:使用CLI開發一個Vue3的npm庫。

移除vue相關依賴

我們搭建好插件的開發環境后,CLI默認會在package.json中添加Vue的相關包,我們的插件不會依賴于vue,因此我們把它刪除即可。

  1. "vue""^3.0.0-0"
  2. "vue-class-component""^8.0.0-0" 

創建DOM

為了方便開發者使用dom,這里選擇使用js動態來創建dom,最后將其掛載到body中,在vue3版本的截圖插件中,我們可以使用vue組件來輔助我們,這里我們就要基于組件來使用js來創建對應的dom,為其綁定對應的事件。

部分實現代碼如下,完整代碼請移步:CreateDom.ts

  1. import toolbar from "@/lib/config/Toolbar"
  2. import { toolbarType } from "@/lib/type/ComponentType"
  3. import { toolClickEvent } from "@/lib/split-methods/ToolClickEvent"
  4. import { setBrushSize } from "@/lib/common-methords/SetBrushSize"
  5. import { selectColor } from "@/lib/common-methords/SelectColor"
  6. import { getColor } from "@/lib/common-methords/GetColor"
  7.  
  8. export default class CreateDom { 
  9.   // 截圖區域canvas容器 
  10.   private readonly screenShortController: HTMLCanvasElement; 
  11.   // 截圖工具欄容器 
  12.   private readonly toolController: HTMLDivElement; 
  13.   // 繪制選項頂部ico容器 
  14.   private readonly optionIcoController: HTMLDivElement; 
  15.   // 畫筆繪制選項容器 
  16.   private readonly optionController: HTMLDivElement; 
  17.   // 文字工具輸入容器 
  18.   private readonly textInputController: HTMLDivElement; 
  19.  
  20.   // 截圖工具欄圖標 
  21.   private readonly toolbar: Array<toolbarType>; 
  22.    
  23.     constructor() { 
  24.     this.screenShortController = document.createElement("canvas"); 
  25.     this.toolController = document.createElement("div"); 
  26.     this.optionIcoController = document.createElement("div"); 
  27.     this.optionController = document.createElement("div"); 
  28.     this.textInputController = document.createElement("div"); 
  29.     // 為所有dom設置id 
  30.     this.setAllControllerId(); 
  31.     // 為畫筆繪制選項角標設置class 
  32.     this.setOptionIcoClassName(); 
  33.     this.toolbar = toolbar; 
  34.     // 渲染工具欄 
  35.     this.setToolBarIco(); 
  36.     // 渲染畫筆相關選項 
  37.     this.setBrushSelectPanel(); 
  38.     // 渲染文本輸入 
  39.     this.setTextInputPanel(); 
  40.     // 渲染頁面 
  41.     this.setDomToBody(); 
  42.     // 隱藏所有dom 
  43.     this.hiddenAllDom(); 
  44.   } 
  45.    
  46.   /** 其他代碼省略 **/ 
  47.    

插件入口文件

在開發vue插件時我們需要暴露一個install方法,由于此處我們不需要依賴vue,我們就無需暴露install方法,我的預想效果是:用戶在使用我插件時,直接實例化插件就能正常運行。

因此,我們默認暴露出一個class,無論是使用script標簽引入插件,還是在其他js框架里使用import來引入插件,都只需要在使用時new一下即可。

部分代碼如下,完整代碼請移步:main.ts

  1. import CreateDom from "@/lib/main-entrance/CreateDom"
  2. // 導入截圖所需樣式 
  3. import "@/assets/scss/screen-short.scss"
  4. import InitData from "@/lib/main-entrance/InitData"
  5. import { 
  6.   cutOutBoxBorder, 
  7.   drawCutOutBoxReturnType, 
  8.   movePositionType, 
  9.   positionInfoType, 
  10.   zoomCutOutBoxReturnType 
  11. from "@/lib/type/ComponentType"
  12. import { drawMasking } from "@/lib/split-methods/DrawMasking"
  13. import { fixedData, nonNegativeData } from "@/lib/common-methords/FixedData"
  14. import { drawPencil, initPencil } from "@/lib/split-methods/DrawPencil"
  15. import { drawText } from "@/lib/split-methods/DrawText"
  16. import { drawRectangle } from "@/lib/split-methods/DrawRectangle"
  17. import { drawCircle } from "@/lib/split-methods/DrawCircle"
  18. import { drawLineArrow } from "@/lib/split-methods/DrawLineArrow"
  19. import { drawMosaic } from "@/lib/split-methods/DrawMosaic"
  20. import { drawCutOutBox } from "@/lib/split-methods/DrawCutOutBox"
  21. import { zoomCutOutBoxPosition } from "@/lib/common-methords/ZoomCutOutBoxPosition"
  22. import { saveBorderArrInfo } from "@/lib/common-methords/SaveBorderArrInfo"
  23. import { calculateToolLocation } from "@/lib/split-methods/CalculateToolLocation"
  24.  
  25. export default class ScreenShort { 
  26.   // 當前實例的響應式data數據 
  27.   private readonly data: InitData; 
  28.  
  29.   // video容器用于存放屏幕MediaStream流 
  30.   private readonly videoController: HTMLVideoElement; 
  31.   // 截圖區域canvas容器 
  32.   private readonly screenShortController: HTMLCanvasElement | null
  33.   // 截圖工具欄dom 
  34.   private readonly toolController: HTMLDivElement | null
  35.   // 截圖圖片存放容器 
  36.   private readonly screenShortImageController: HTMLCanvasElement; 
  37.   // 截圖區域畫布 
  38.   private screenShortCanvas: CanvasRenderingContext2D | undefined; 
  39.   // 文本區域dom 
  40.   private readonly textInputController: HTMLDivElement | null
  41.   //  截圖工具欄畫筆選項dom 
  42.   private optionController: HTMLDivElement | null
  43.   private optionIcoController: HTMLDivElement | null
  44.   // 圖形位置參數 
  45.   private drawGraphPosition: positionInfoType = { 
  46.     startX: 0, 
  47.     startY: 0, 
  48.     width: 0, 
  49.     height: 0 
  50.   }; 
  51.   // 臨時圖形位置參數 
  52.   private tempGraphPosition: positionInfoType = { 
  53.     startX: 0, 
  54.     startY: 0, 
  55.     width: 0, 
  56.     height: 0 
  57.   }; 
  58.   // 裁剪框邊框節點坐標事件 
  59.   private cutOutBoxBorderArr: Array<cutOutBoxBorder> = []; 
  60.   // 當前操作的邊框節點 
  61.   private borderOption: number | null = null
  62.  
  63.   // 點擊裁剪框時的鼠標坐標 
  64.   private movePosition: movePositionType = { 
  65.     moveStartX: 0, 
  66.     moveStartY: 0 
  67.   }; 
  68.  
  69.   // 鼠標點擊狀態 
  70.   private clickFlag = false
  71.   private fontSize = 17; 
  72.   // 最大可撤銷次數 
  73.   private maxUndoNum = 15; 
  74.   // 馬賽克涂抹區域大小 
  75.   private degreeOfBlur = 5; 
  76.  
  77.   // 文本輸入框位置 
  78.   private textInputPosition: { mouseX: number; mouseY: number } = { 
  79.     mouseX: 0, 
  80.     mouseY: 0 
  81.   }; 
  82.   constructor() { 
  83.     // 創建dom 
  84.     new CreateDom(); 
  85.     this.videoController = document.createElement("video"); 
  86.     this.videoController.autoplay = true
  87.     this.screenShortImageController = document.createElement("canvas"); 
  88.     // 實例化響應式data 
  89.     this.data = new InitData(); 
  90.     // 獲取截圖區域canvas容器 
  91.     this.screenShortController = this.data.getScreenShortController() as HTMLCanvasElement | null
  92.     this.toolController = this.data.getToolController() as HTMLDivElement | null
  93.     this.textInputController = this.data.getTextInputController() as HTMLDivElement | null
  94.     this.optionController = this.data.getOptionController() as HTMLDivElement | null
  95.     this.optionIcoController = this.data.getOptionIcoController() as HTMLDivElement | null
  96.     this.load(); 
  97.   } 
  98.    
  99.   /** 其他代碼省略 **/ 

對外暴露default屬性

做完上述配置后我們的插件開發環境就搭建好了,我執行build命令打包插件后,在vue2項目中使用import形式正常運行,在使用script標簽時引入時卻報錯了,于是我將暴露出來的screenShotPlugin變量打印出來后發現他還有個default屬性,default屬性才是我們插件暴露出來的東西。

求助了下我朋友@_Dreams找到了解決方案,需要配置下webpack中的output.libraryExport屬性,我們的插件是使用Vue CLI開發的,有關webpack的配置需要在需要在vue.config.js中進行配置,代碼如下:

  1. module.exports = { 
  2.     // 自定義webpack配置 
  3.   configureWebpack: { 
  4.     output: { 
  5.       // 對外暴露default屬性 
  6.       libraryExport: "default" 
  7.     } 
  8.   } 

這一塊的配置在Vue CLI文檔中也有被提到,感興趣的開發者請移步:build-targets.html#vue-vs-js-ts-entry-files

使用webrtc截取整個屏幕

插件一開始使用的是html2canvas來將dom轉換為canvas的,因為他要遍歷整個body中的dom,然后再轉換成canvas,而且圖片還不能跨域,如果頁面中圖片一多,它會變得非常慢。

在上一篇文章的評論區中有位開發者 @名字什么的都不重要 建議我使用webrtc來替代html2canvas,于是我就看了下webrtc的相關文檔,最終實現了截屏功能,它截取出來的東西更精確、性能更好,不存在卡頓問題也不存在css問題,而且它把選擇權交給了用戶,讓用戶決定來共享屏幕的那一部分內容。

實現思路

接下來就跟大家分享下我的實現思路:

  • 使用getDisplayMedia來捕獲屏幕,得到MediaStream流
  • 將得到的MediaStream流輸出到video標簽中
  • 使用canvas將video標簽中的內容繪制到canvas容器中

有關getDisplayMedia的具體用法,請移步:使用屏幕捕獲API

實現代碼

接下來,我們來看下具體的實現代碼,完整代碼請移步:main.ts

  1. // 加載截圖組件 
  2.   private load() { 
  3.     // 設置截圖區域canvas寬高 
  4.     this.data.setScreenShortInfo(window.innerWidth, window.innerHeight); 
  5.     // 設置截圖圖片存放容器寬高 
  6.     this.screenShortImageController.width = window.innerWidth; 
  7.     this.screenShortImageController.height = window.innerHeight; 
  8.     // 顯示截圖區域容器 
  9.     this.data.showScreenShortPanel(); 
  10.     // 截取整個屏幕 
  11.     this.screenShot(); 
  12.   } 
  13.  
  14.   // 開始捕捉屏幕 
  15.   private startCapture = async () => { 
  16.     let captureStream = null
  17.  
  18.     try { 
  19.       // eslint-disable-next-line @typescript-eslint/ban-ts-ignore 
  20.       // @ts-ignore 
  21.       // 捕獲屏幕 
  22.       captureStream = await navigator.mediaDevices.getDisplayMedia(); 
  23.       // 將MediaStream輸出至video標簽 
  24.       this.videoController.srcObject = captureStream; 
  25.     } catch (err) { 
  26.       throw "瀏覽器不支持webrtc" + err; 
  27.     } 
  28.     return captureStream; 
  29.   }; 
  30.  
  31.   // 停止捕捉屏幕 
  32.   private stopCapture = () => { 
  33.     const srcObject = this.videoController.srcObject; 
  34.     if (srcObject && "getTracks" in srcObject) { 
  35.       const tracks = srcObject.getTracks(); 
  36.       tracks.forEach(track => track.stop()); 
  37.       this.videoController.srcObject = null
  38.     } 
  39.   }; 
  40.  
  41.   // 截屏 
  42.   private screenShot = () => { 
  43.     // 開始捕捉屏幕 
  44.     this.startCapture().then(() => { 
  45.       setTimeout(() => { 
  46.         // 獲取截圖區域canvas容器畫布 
  47.         const context = this.screenShortController?.getContext("2d"); 
  48.         if (context == null || this.screenShortController == nullreturn
  49.  
  50.         // 賦值截圖區域canvas畫布 
  51.         this.screenShortCanvas = context; 
  52.         // 繪制蒙層 
  53.         drawMasking(context); 
  54.         // 將獲取到的屏幕截圖繪制到圖片容器里 
  55.         this.screenShortImageController 
  56.           .getContext("2d"
  57.           ?.drawImage( 
  58.             this.videoController, 
  59.             0, 
  60.             0, 
  61.             this.screenShortImageController?.width, 
  62.             this.screenShortImageController?.height 
  63.           ); 
  64.         // 添加監聽 
  65.         this.screenShortController?.addEventListener( 
  66.           "mousedown"
  67.           this.mouseDownEvent 
  68.         ); 
  69.         this.screenShortController?.addEventListener( 
  70.           "mousemove"
  71.           this.mouseMoveEvent 
  72.         ); 
  73.         this.screenShortController?.addEventListener( 
  74.           "mouseup"
  75.           this.mouseUpEvent 
  76.         ); 
  77.         // 停止捕捉屏幕 
  78.         this.stopCapture(); 
  79.       }, 300); 
  80.     }); 
  81.   }; 

插件地址

至此,插件的實現過程就分享完畢了。

  • 插件在線體驗地址:chat-system
  • 插件GitHub倉庫地址:screen-shot
  • 開源項目地址:chat-system-github

 

責任編輯:武曉燕 來源: 神奇的程序員k
相關推薦

2021-11-04 09:37:31

Android截屏實現方式監聽截屏

2023-03-26 08:41:37

2022-02-21 15:16:30

HarmonyOS鴻蒙操作系統

2021-09-15 10:19:15

鴻蒙HarmonyOS應用

2022-09-09 14:47:50

CircleArkUI

2022-05-18 07:44:13

自定義菜單前端

2009-09-07 22:00:15

LINQ自定義

2022-02-16 15:25:31

JS代碼Canvas鴻蒙

2022-02-16 16:09:12

鴻蒙游戲操作系統

2021-11-01 10:21:36

鴻蒙HarmonyOS應用

2020-12-21 16:35:51

JavaScript網頁截屏代碼

2015-02-12 15:33:43

微信SDK

2009-07-06 16:20:50

JSP自定義標簽

2022-04-01 15:59:22

SQLPostgreSQL審計

2015-07-29 10:31:16

Java緩存算法

2022-12-07 08:56:27

SpringMVC核心組件

2023-01-03 07:40:27

自定義滑塊組件

2022-03-01 16:09:06

OpenHarmon鴻蒙單選組件

2009-06-17 16:00:03

Hibernate自定

2009-09-03 13:34:03

.NET自定義控件
點贊
收藏

51CTO技術棧公眾號

精品国产综合区久久久久久| 成人国产亚洲欧美成人综合网| 91国偷自产一区二区三区观看| 91美女高潮出水| 老女人性淫交视频| 玖玖玖免费嫩草在线影院一区| 欧美午夜女人视频在线| 亚洲激情电影在线| www.毛片.com| 欧美疯狂party性派对| 日韩免费高清视频| 久久久久久久久久久久久久国产| 91高清在线| 成人亚洲一区二区一| 日本欧美黄网站| 青青草原在线免费观看| 亚洲精品**不卡在线播he| 欧美剧情片在线观看| 一二三四视频社区在线| 午夜视频在线观看免费视频| 亚洲女优在线| 久久色精品视频| 美国黄色a级片| 亚洲精品v亚洲精品v日韩精品| 在线视频你懂得一区二区三区| 97在线免费视频观看| 国产精品高潮呻吟av| 亚洲欧美日本日韩| 欧美黑人巨大精品一区二区| 欧美丰满老妇熟乱xxxxyyy| 在线观看视频一区二区三区| 欧美色视频一区| 欧美色图色综合| 中文字幕免费高清电视剧网站在线观看| 久久网这里都是精品| 欧美最猛黑人xxxx黑人猛叫黄| 在线观看亚洲网站| 国产伦精品一区二区三区千人斩| 精品久久五月天| www.com久久久| 日本一道高清亚洲日美韩| 午夜视频在线观看一区| 国产91视频一区| 久热国产在线| 国产精品视频你懂的| 欧美aaaaa喷水| 日本中文字幕电影在线观看| 国产毛片精品一区| 91麻豆国产精品| 一级黄色大片免费| 日av在线不卡| 国产成人精品日本亚洲| 午夜精品久久久久久久久久久久久蜜桃| 亚洲激情中文在线| 米奇精品一区二区三区在线观看| 欧美成人久久久免费播放| 国产欧美一区| 亚洲午夜久久久影院| 久久精品老司机| 午夜先锋成人动漫在线| 精品一区二区三区三区| 国产嫩草在线观看| 日韩福利一区| 在线日韩一区二区| 色七七在线观看| 国产成人精品一区二三区在线观看 | 伊人色综合久久天天| 国产a级片免费看| av软件在线观看| 一区二区免费视频| 99久久国产综合精品五月天喷水| 视频一区二区三区在线看免费看| 日韩精品五月天| 国产精欧美一区二区三区| 无码aⅴ精品一区二区三区| 久久亚洲电影| 国产日韩精品在线| 99久久亚洲精品日本无码| 国产一区二区三区综合| 99精彩视频| 天天干,夜夜操| 久久久五月婷婷| 亚洲午夜精品久久| 视频在线这里都是精品| 亚洲成a天堂v人片| 中文字幕第80页| 亚洲国产91视频| 精品剧情在线观看| www在线观看免费视频| 婷婷久久综合| 91精品国产乱码久久久久久久久 | 欧美三级中文字幕| 黑人无套内谢中国美女| 四虎884aa成人精品最新| 中国人与牲禽动交精品| 久久久久久久久久久久国产| 久久久国产亚洲精品| 欧美另类极品videosbest最新版本| 奇米精品一区二区三区| 日本一区二区精品视频| 亚洲第一区av| 国产精品亚洲成人| 欧美日韩一区二| gogo在线观看| 色婷婷国产精品| 人妻换人妻仑乱| 精品国产一区二区三区香蕉沈先生| 久久激情视频免费观看| 全部毛片永久免费看| 国内国产精品久久| 欧洲亚洲一区二区三区四区五区| 久cao在线| 一本到高清视频免费精品| 亚洲成人av免费观看| 国产一区二区三区网| 久久久这里只有精品视频| 一级视频在线播放| 91蜜桃免费观看视频| 蜜臀在线免费观看| 日韩精选视频| 日韩av最新在线观看| 亚洲 欧美 变态 另类 综合| 日欧美一区二区| 国产在线精品一区二区三区》| 天堂а√在线资源在线| 欧美日韩亚洲视频一区| 精人妻一区二区三区| 图片区亚洲欧美小说区| 国产精品久久久久福利| 亚洲色图另类小说| 亚洲综合视频在线| 亚洲一区二区三区三州| 91精品久久久久久久蜜月| 国产成人涩涩涩视频在线观看| 蜜桃91麻豆精品一二三区| 中文字幕一区在线观看| 九九久久99| av片在线观看| 欧美精品少妇一区二区三区| 51妺嘿嘿午夜福利| 免费日韩av片| 久久一区二区精品| 日本黄色免费在线| 亚洲国产中文字幕久久网| 久久久久久久蜜桃| 国产精品夜夜嗨| 国产精品一区在线免费观看| 婷婷激情成人| 精品久久国产精品| 一区二区三区黄| 中文字幕亚洲视频| 嫩草视频免费在线观看| 欧美成人milf| 成人激情视频在线| caopen在线视频| 欧美不卡一区二区三区| 久久久久久久福利| 成人国产免费视频| 阿v天堂2017| 免费精品国产| 国产不卡精品视男人的天堂| 国产精品二线| 88在线观看91蜜桃国自产| 美国一级片在线观看| 国产一区二区三区久久久| 激情视频小说图片| 91综合久久爱com| 亚洲欧美福利视频| 欧美一级淫片免费视频黄| 久久天堂av综合合色蜜桃网| www.xxx亚洲| 久久视频在线| av一区二区三区免费| а√在线中文在线新版| 亚洲欧美日韩国产中文专区| 欧美另类高清videos的特点| 中文字幕亚洲不卡| 日本泡妞xxxx免费视频软件| 日韩午夜激情| 无码免费一区二区三区免费播放 | 亚洲成年人在线播放| 欧美日韩一级大片| 波多野结衣亚洲一区| 能在线观看的av| 欧美a级成人淫片免费看| 国产一区欧美二区三区| 国产三线在线| 伊人久久久久久久久久久久久| 在线视频 91| 亚洲高清视频在线| 欧美激情 一区| 国产成人在线看| 青青在线视频观看| 在线精品小视频| 欧美精品一区二区三区久久| www.成人在线.com| 2019中文字幕免费视频| 免费在线看黄网站| 日韩av中文字幕在线免费观看| 在线观看黄色网| 午夜精品福利一区二区三区蜜桃| 尤物视频最新网址| 国产成人免费在线视频| 麻豆传传媒久久久爱| 伊人成人在线| 中文字幕久久一区| 神马电影久久| 国产欧美丝袜| 国产va免费精品观看精品| 青青草原成人在线视频| 亚洲丝袜精品| 最好看的2019年中文视频| 天堂中文网在线| 日韩欧美一二三四区| 欧美激情一区二区三区免费观看| 亚洲一区中文在线| 91久久久久久久久久久久久久| 99r精品视频| 免费黄色a级片| 精品综合免费视频观看| 免费av网址在线| 亚洲人体大胆视频| 91视频成人免费| 成人a'v在线播放| 欧美激情乱人伦| av在线天堂播放| 欧美日韩亚洲综合一区二区三区| 国产一级片免费| 亚洲欧美在线另类| 亚洲高潮女人毛茸茸| 91麻豆国产香蕉久久精品| 黄页网站在线看| 国产精品亚洲成人| 青娱乐国产精品视频| 久久国产精品区| 狠狠躁狠狠躁视频专区| 久久久噜噜噜久久狠狠50岁| 国产精品久久久久9999爆乳| 欧美另类专区| 黄色小视频大全| 欧美/亚洲一区| www.黄色网址.com| 99精品电影| 椎名由奈jux491在线播放| 久久国产影院| 一区二区免费在线视频| 日韩一区电影| 亚洲一区二区不卡视频| 久久精品国产亚洲夜色av网站| 日韩不卡av| 欧美不卡在线观看| 92看片淫黄大片欧美看国产片| 成人在线视频免费| 国产精品综合久久久| 欧美xxxx性| 91久久久久久久久久| 综合久草视频| 91一区二区三区| 日本免费一区二区三区四区| 日韩女优在线播放| 国产综合色在线观看| 国产精品一二区| 精品视频成人| 国产精品有限公司| 国产极品一区| 国产综合香蕉五月婷在线| 国产日韩在线观看视频| 超碰97在线播放| 综合干狼人综合首页| 色之综合天天综合色天天棕色 | 国产精品综合av一区二区国产馆| 欧美性受xxxx黒人xyx性爽| 成人免费毛片aaaaa**| avtt香蕉久久| 国产精品视频看| 久草成人在线视频| 日韩欧美在线视频日韩欧美在线视频 | 亚洲观看高清完整版在线观看| 精品人妻在线播放| 色噜噜夜夜夜综合网| 国产又黄又猛又爽| 亚洲精品在线观看视频| 嫩草在线播放| 久久午夜a级毛片| 麻豆免费版在线观看| 国产精品丝袜视频| 伊人www22综合色| 欧美视频1区| 一区二区三区国产精华| 又粗又黑又大的吊av| 另类小说欧美激情| 欧美性生交xxxxx| 亚洲国产成人午夜在线一区| 亚洲欧美日韩偷拍| 国产二区国产一区在线观看| 催眠调教后宫乱淫校园| 国产欧美一区二区三区在线看蜜臀 | 国产成人精品视频在线观看| 99久久这里有精品| 免费看成人片| 欧美日韩午夜| 日本三级黄色网址| 97国产一区二区| 欧洲猛交xxxx乱大交3| 色综合久久久久久久久久久| 99久久久久久久| 中文字幕亚洲欧美在线| 午夜影院在线播放| 国产精品免费一区二区三区四区 | 一本色道久久综合狠狠躁篇的优点 | 亚洲 欧美 自拍偷拍| 久久视频在线观看免费| **欧美日韩在线观看| 成人黄动漫网站免费| 欧美aaaa视频| 亚洲免费av一区二区三区| 99久久99久久久精品齐齐| 1024手机在线视频| 欧美日韩高清在线| 国产在线一二| 欧美一区第一页| 国产ts一区| 国产乱码精品一区二区三区中文 | 91成人一区二区三区| 亚洲精品一区久久久久久| ririsao久久精品一区| 91久久在线视频| 91精品在线观看国产| 久久久精品麻豆| 国产欧美精品一区二区色综合| 亚洲影院在线播放| 亚洲美女av黄| 悠悠资源网亚洲青| 久久精品日产第一区二区三区乱码 | 成人福利电影精品一区二区在线观看 | 国产裸体无遮挡| 色狠狠久久aa北条麻妃| 黄色成人小视频| 亚洲精品一区二区三| 日本特黄久久久高潮| av电影网站在线观看| 日韩欧美aaa| 免费在线观看污视频| 人体精品一二三区| 九一成人免费视频| 黄色高清无遮挡| 亚洲国产高清在线观看视频| 欧美日韩 一区二区三区| 国产一区二区三区网站| 日韩毛片一区| 一本一道久久a久久精品综合| 日本成人在线不卡视频| 91麻豆制片厂| 欧美精品日日鲁夜夜添| 成人免费网址| 成人av播放| 亚洲在线网站| 精品成人无码一区二区三区| 欧美在线|欧美| 午夜精品一二三区| 久久久最新网址| 亚洲人成网www| 91香蕉视频污版| 亚洲男女一区二区三区| 亚洲成人久久精品| 2018中文字幕一区二区三区| 午夜精品福利影院| 五月天激情视频在线观看| 日韩美女视频19| 亚洲免费不卡视频| 热草久综合在线| 日韩一区电影| 亚洲国产精品狼友在线观看| 精品久久久一区| av在线免费一区| 不卡视频一区二区三区| 亚洲视频大全| 波多野结衣家庭教师在线观看| 欧美一区二区大片| 成年网站在线| 91久久精品国产91久久| 亚洲高清av| 99自拍偷拍视频| 精品国产自在久精品国产| 牛牛精品一区二区| 伊甸园精品99久久久久久| 成人黄色777网| 中文人妻熟女乱又乱精品| 欧美国产第二页| 欧美限制电影| 人妻换人妻a片爽麻豆| 在线欧美一区二区| 色操视频在线| 亚洲欧美电影在线观看| 成人sese在线| 国产有码在线观看| 欧美一区二区影院| 欧美另类亚洲| 情侣偷拍对白清晰饥渴难耐| 亚洲国产中文字幕在线观看|