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

一篇帶給你Web Components上手指南

移動開發(fā)
Web Components 本身不是一個單獨的規(guī)范,而是由一組DOM API 和 HTML 規(guī)范所組成,用于創(chuàng)建可復(fù)用的自定義名字的 HTML 標(biāo)簽,并且可以直接在你的 Web 應(yīng)用中使用。

[[383293]]

現(xiàn)在的前端開發(fā)基本離不開 React、Vue 這兩個框架的支撐,而這兩個框架下面又衍生出了許多的自定義組件庫:

  • Element(Vue)
  • Ant Design(React)

這些組件庫的出現(xiàn),讓我們可以直接使用已經(jīng)封裝好的組件,而且在開源社區(qū)的幫助下,出現(xiàn)了很多的模板項目( vue-element-admin、Ant Design Pro ),能讓我們快速的開始一個項目。

雖然 React、Vue 為我們的組件開發(fā)提供了便利,但是這兩者在組件的開發(fā)思路上,一個是自創(chuàng)的 JSX 語法,一個是特有的單文件模板的語法,兩者的目標(biāo)都是想提供一種組件的封裝方法。畢竟都有其原創(chuàng)的東西在里面,和我們剛開始接觸的 Web 基礎(chǔ)的 HTML、CSS、JS 的方式還是有些出入的。今天介紹的就是,通過 HTML、CSS、JS 的方式來實現(xiàn)自定義的組件,也是目前瀏覽器原生提供的方案:Web Components。

什么是 Web Components?

Web Components本身不是一個單獨的規(guī)范,而是由一組DOM API 和 HTML 規(guī)范所組成,用于創(chuàng)建可復(fù)用的自定義名字的 HTML 標(biāo)簽,并且可以直接在你的 Web 應(yīng)用中使用。

代碼的復(fù)用一直都是我們追求的目標(biāo),在 JS 中可復(fù)用的代碼我們可以封裝成一個函數(shù),但是對于復(fù)雜的HTML(包括相關(guān)的樣式及交互邏輯),我們一直都沒有比較好的辦法來進行復(fù)用。要么借助后端的模板引擎,要么借助已有框架對 DOM API 的二次封裝,而 Web Components 的出現(xiàn)就是為了補足瀏覽器在這方面的能力。

如何使用 Web Components?

Web Components 中包含的幾個規(guī)范,都已在 W3C 和 HTML 標(biāo)準(zhǔn)中進行了規(guī)范化,主要由三部分組成:

  • Custom elements(自定義元素):一組 JavaScript API,用來創(chuàng)建自定義的 HTML標(biāo)簽,并允許標(biāo)簽創(chuàng)建或銷毀時進行一些操作;
  • Shadow DOM(影子DOM):一組 JavaScript API,用于將創(chuàng)建的 DOM Tree 插入到現(xiàn)有的元素中,且 DOM Tree 不能被外部修改,不用擔(dān)心元素被其他地方影響;
  • HTML templates(HTML模板):通過<template>、<slot>、 直接在 HTML 文件中編寫模板,然后通過 DOM API 獲取。

Custom elements(自定義元素)

瀏覽器提供了一個方法:customElements.define() , 來進行自定義標(biāo)簽的定義。該方法接受三個參數(shù):

  • 自定義元素的名稱,一個 DOMString 標(biāo)準(zhǔn)的字符串,為了防止自定義元素的沖突,必須是一個帶短橫線連接的名稱(e.g. custom-tag)。
  • 定義自定義元素的一些行為,類似于 React、Vue 中的生命周期。
  • 擴展參數(shù)(可選),該參數(shù)類型為一個對象,且需要包含 extends 屬性,用于指定創(chuàng)建的元素繼承自哪一個內(nèi)置元素(e.g. { extends: 'p' })。

下面通過一些例子,演示其用法,完整代碼放到了 JS Bin 上。

創(chuàng)建一個新的 HTML 標(biāo)簽

先看看如何創(chuàng)建一個全新的自定義元素。

  1. class HelloUser extends HTMLElement { 
  2.   constructor() { 
  3.     // 必須調(diào)用 super 方法 
  4.     super(); 
  5.  
  6.     // 創(chuàng)建一個 div 標(biāo)簽 
  7.     const $box = document.createElement("p"); 
  8.     let userName = "User Name"
  9.     if (this.hasAttribute("name")) { 
  10.       // 如果存在 name 屬性,讀取 name 屬性的值 
  11.       userName = this.getAttribute("name"); 
  12.     } 
  13.     // 設(shè)置 div 標(biāo)簽的文本內(nèi)容 
  14.     $box.innerText = `Hello ${userName}`; 
  15.  
  16.     // 創(chuàng)建一個 shadow 節(jié)點,創(chuàng)建的其他元素應(yīng)附著在該節(jié)點上 
  17.     const shadow = this.attachShadow({ mode: "open" }); 
  18.     shadow.appendChild($box); 
  19.   } 
  20.  
  21. // 定義一個名為 <hello-user /> 的元素 
  22. customElements.define("hello-user", HelloUser); 

  1. <hello-user name="Shenfq"></hello-user

這時候頁面上就會生成一個 <p>標(biāo)簽,其文本內(nèi)容為:Hello Shenfq。這種形式的自定義元素被稱為:Autonomous custom elements,是一個獨立的元素,可以在 HTML 中直接使用。

擴展已有的 HTML 標(biāo)簽

我們除了可以定義一個全新的 HTML 標(biāo)簽,還可以對已有的 HTML 標(biāo)簽進行擴展,例如,我們需要封裝一個與 <ul>標(biāo)簽?zāi)芰︻愃频慕M件,就可以使用如下方式:

  1. class SkillList extends HTMLUListElement { 
  2.   constructor() { 
  3.     // 必須調(diào)用 super 方法 
  4.     super(); 
  5.  
  6.     if ( 
  7.       this.hasAttribute("skills") && 
  8.       this.getAttribute("skills").includes(','
  9.     ) { 
  10.       // 讀取 skills 屬性的值 
  11.       const skills = this.getAttribute("skills").split(','); 
  12.       skills.forEach(skill => { 
  13.         const item = document.createElement("li"); 
  14.         item.innerText = skill; 
  15.         this.appendChild(item); 
  16.       }) 
  17.     } 
  18.   } 
  19.  
  20. // 對 <ul> 標(biāo)簽進行擴展 
  21. customElements.define("skill-list", SkillList, { extends: "ul" }); 

  1. <ul is="skill-list" skills="js,css,html"></ul> 

對已有的標(biāo)簽進行擴展,需要用到 customElements.define 方法的第三個參數(shù),且第二參數(shù)的類,也需要繼承需要擴展標(biāo)簽的對應(yīng)的類。使用的時候,只需要在標(biāo)簽加上 is 屬性,屬性值為第一個參數(shù)定義的名稱。

生命周期

自定義元素的生命周期比較簡單,一共只提供了四個回調(diào)方法:

  • connectedCallback:當(dāng)自定義元素被插入到頁面的 DOM 文檔時調(diào)用。
  • disconnectedCallback:當(dāng)自定義元素從 DOM 文檔中被刪除時調(diào)用。
  • adoptedCallback:當(dāng)自定義元素被移動時調(diào)用。
  • attributeChangedCallback: 當(dāng)自定義元素增加、刪除、修改自身屬性時調(diào)用。

下面演示一下使用方法:

  1. class HelloUser extends HTMLElement { 
  2.   constructor() { 
  3.     // 必須調(diào)用 super 方法 
  4.     super(); 
  5.  
  6.     // 創(chuàng)建一個 div 標(biāo)簽 
  7.     const $box = document.createElement("p"); 
  8.     let userName = "User Name"
  9.     if (this.hasAttribute("name")) { 
  10.       // 如果存在 name 屬性,讀取 name 屬性的值 
  11.       userName = this.getAttribute("name"); 
  12.     } 
  13.     // 設(shè)置 div 標(biāo)簽的文本內(nèi)容 
  14.     $box.innerText = `Hello ${userName}`; 
  15.  
  16.     // 創(chuàng)建一個 shadow 節(jié)點,創(chuàng)建的其他元素應(yīng)附著在該節(jié)點上 
  17.     const shadow = this.attachShadow({ mode: "open" }); 
  18.     shadow.appendChild($box); 
  19.   } 
  20.   connectedCallback() { 
  21.     console.log('創(chuàng)建元素'
  22.     // 5s 后移動元素到 iframe 
  23.     setTimeout(() => { 
  24.       const iframe = document.getElementsByTagName("iframe")[0] 
  25.       iframe.contentWindow.document.adoptNode(this) 
  26.     }, 5e3) 
  27.   } 
  28.   disconnectedCallback() { 
  29.     console.log('刪除元素'
  30.   } 
  31.   adoptedCallback() { 
  32.     console.log('移動元素'
  33.   } 

  1. <!-- 頁面插入一個 iframe,將自定義元素移入其中 --> 
  2. <iframe width="0" height="0"></iframe> 
  3. <hello-user name="Shenfq"></hello-user

 在元素被創(chuàng)建后,等待 5s,然后將自定義元素移動到 iframe 文檔中,這時候能看到控制臺會同時出現(xiàn) 刪除元素、移動元素 的 log。

 

Console

Shadow DOM(影子DOM)

在前面介紹自定義元素的時候,已經(jīng)用到了 Shadow DOM。Shadow DOM 的作用是讓內(nèi)部的元素與外部隔離,讓自定義元素的結(jié)構(gòu)、樣式、行為不受到外部的影響。

我們可以看到前面定義的<hello-user> 標(biāo)簽,在控制臺的 Elements 內(nèi),會顯示一個 shadow-root ,表明內(nèi)部是一個 Shadow DOM。

 

Shadow DOM

其實 Web Components 沒有提出之前,瀏覽器內(nèi)部就有使用 Shadow DOM 進行一些內(nèi)部元素的封裝,例如 標(biāo)簽。我們需要現(xiàn)在控制臺的配置中,打開 Show user agent ashdow DOM 開關(guān)。

 

設(shè)置

然后在控制臺的 Elements 內(nèi),就能看到<video> 標(biāo)簽內(nèi)其實也有一個 shadow-root。

 

video 標(biāo)簽

創(chuàng)建 Shadow DOM

我們可以在任意一個節(jié)點內(nèi)部創(chuàng)建一個 Shadow DOM,在獲取元素實例后,調(diào)用 Element.attachShadow() 方法,就能將一個新的 shadow-root 附加到該元素上。

該方法接受一個對象,且只有一個 mode 屬性,值為 open 或 closed,表示 Shadow DOM 內(nèi)的節(jié)點是否能被外部獲取。

  1. <div id="root"></div> 
  2. <script> 
  3.   // 獲取頁面的 
  4.   const $root = document.getElementById('root'); 
  5.   const $p = document.createElement('p'); 
  6.   $p.innerText = '創(chuàng)建一個 shadow 節(jié)點'
  7.   const shadow = $root.attachShadow({mode: 'open'}); 
  8.   shadow.appendChild($p); 
  9. </script> 

 

Shadow DOM

mode 的差異

前面提到了 mode 值為 open 或 closed,主要差異就是是否可以使用 Element.shadowRoot獲取到 shadow-root 進行一些操作。

  1. <div id="root"></div> 
  2. <script> 
  3.   // 獲取頁面的 
  4.   const $root = document.getElementById('root'); 
  5.   const $p = document.createElement('p'); 
  6.   $p.innerText = '創(chuàng)建一個 shadow 節(jié)點'
  7.   const shadow = $root.attachShadow({mode: 'open'}); 
  8.   shadow.appendChild($p); 
  9.   console.log('is open', $div.shadowRoot); 
  10. </script> 

 open mode

 

closed mode

  1. <div id="root"></div> 
  2. <script> 
  3.   // 獲取頁面的 
  4.   const $root = document.getElementById('root'); 
  5.   const $p = document.createElement('p'); 
  6.   $p.innerText = '創(chuàng)建一個 shadow 節(jié)點'
  7.   const shadow = $root.attachShadow({mode: 'closed'}); 
  8.   shadow.appendChild($p); 
  9.   console.log('is closed', $div.shadowRoot); 
  10. </script> 

HTML templates(HTML模板)

前面的案例中,有個很明顯的缺陷,那就是操作 DOM 還是得使用 DOM API,相比起 Vue 得模板和 React 的 JSX 效率明顯更低,為了解決這個問題,在 HTML 規(guī)范中引入了<tempate> 和<slot> 標(biāo)簽。

使用模板

模板簡單來說就是一個普通的 HTML 標(biāo)簽,可以理解成一個 div,只是這個元素內(nèi)的所以內(nèi)容不會展示到界面上。

  1. <template id="helloUserTpl"
  2.   <p class="name">Name</p> 
  3.   <a target="blank" class="blog">##</a> 
  4. </template> 

在 JS 中,我們可以直接通過 DOM API 獲取到該模板的實例,獲取到實例后,一般不能直接對模板內(nèi)的元素進行修改,要調(diào)用 tpl.content.cloneNode 進行一次拷貝,因為頁面上的模板并不是一次性的,可能其他的組件也要引用。

  1. // 通過 ID 獲取標(biāo)簽 
  2. const tplElem = document.getElementById('helloUserTpl'); 
  3. const content = tplElem.content.cloneNode(true); 

我們在獲取到拷貝的模板后,就能對模板進行一些操作,然后再插入到 Shadow DOM 中。

  1. <hello-user name="Shenfq" blog="http://blog.shenfq.com" /> 
  2.  
  3. <script> 
  4.   class HelloUser extends HTMLElement { 
  5.     constructor() { 
  6.       // 必須調(diào)用 super 方法 
  7.       super(); 
  8.  
  9.       // 通過 ID 獲取標(biāo)簽 
  10.       const tplElem = document.getElementById('helloUserTpl'); 
  11.       const content = tplElem.content.cloneNode(true); 
  12.  
  13.       if (this.hasAttribute('name')) { 
  14.         const $name = content.querySelector('.name'); 
  15.         $name.innerText = this.getAttribute('name'); 
  16.       } 
  17.       if (this.hasAttribute('blog')) { 
  18.         const $blog = content.querySelector('.blog'); 
  19.         $blog.innerText = this.getAttribute('blog'); 
  20.         $blog.setAttribute('href', this.getAttribute('blog')); 
  21.       } 
  22.       // 創(chuàng)建一個 shadow 節(jié)點,創(chuàng)建的其他元素應(yīng)附著在該節(jié)點上 
  23.       const shadow = this.attachShadow({ mode: "closed" }); 
  24.       shadow.appendChild(content); 
  25.     } 
  26.   } 
  27.  
  28.   // 定義一個名為 <hello-user /> 的元素 
  29.   customElements.define("hello-user", HelloUser); 
  30. </script> 

 添加樣式

<template> 標(biāo)簽中可以直接插入 <style>標(biāo)簽在,模板內(nèi)部定義樣式。

  1. <template id="helloUserTpl"
  2.   <style> 
  3.     :host { 
  4.       display: flex; 
  5.       flex-direction: column
  6.       width: 200px; 
  7.       padding: 20px; 
  8.       background-color: #D4D4D4; 
  9.       border-radius: 3px; 
  10.     } 
  11.  
  12.     .name { 
  13.       font-size: 20px; 
  14.       font-weight: 600; 
  15.       line-height: 1; 
  16.       margin: 0; 
  17.       margin-bottom: 5px; 
  18.     } 
  19.  
  20.     .email { 
  21.       font-size: 12px; 
  22.       line-height: 1; 
  23.       margin: 0; 
  24.       margin-bottom: 15px; 
  25.     } 
  26.   </style> 
  27.   <p class="name">User Name</p> 
  28.   <a target="blank" class="blog">##</a> 
  29. </template> 

其中 :host 偽類用來定義 shadow-root的樣式,也就是包裹這個模板的標(biāo)簽的樣式。

占位元素

占位元素就是在模板中的某個位置先占據(jù)一個位置,然后在元素插入到界面上的時候,在指定這個位置應(yīng)該顯示什么。

  1. <template id="helloUserTpl"
  2.   <p class="name">User Name</p> 
  3.   <a target="blank" class="blog">##</a> 
  4.   <!--占位符--> 
  5.   <slot name="desc"></slot>  
  6. </template> 
  7.  
  8. <hello-user name="Shenfq" blog="http://blog.shenfq.com"
  9.   <p slot="desc">歡迎關(guān)注公眾號:更了不起的前端</p> 
  10. </hello-user

這里用的用法與 Vue 的 slot 用法一致,不做過多的介紹。

總結(jié)

到這里 Web Components 的基本用法就介紹得差不多了,相比于其他的支持組件化方案的框架,使用 Web Components 有如下的優(yōu)點:

  • 瀏覽器原生支持,不需要引入額外的第三方庫;
  • 真正的內(nèi)部私有化的 CSS,不會產(chǎn)生樣式的沖突;
  • 無需經(jīng)過編譯操作,即可實現(xiàn)的組件化方案,且與外部 DOM 隔離;

Web Components 的主要缺點就是標(biāo)準(zhǔn)可能還不太穩(wěn)定,例如文章中沒有提到的模板的模塊化方案,就已經(jīng)被廢除,現(xiàn)在還沒有正式的方案引入模板文件。而且原生的 API 雖然能用,但是就是不好用,要不然也不會出現(xiàn) jQuery 這樣的庫來操作 DOM。好在現(xiàn)在也有很多基于 Web Components 實現(xiàn)的框架,后面還會開篇文章專門講一講使用 Web Components 的框架 lit-html、lit-element。

好啦,今天的文章就到這里了,希望大家能有所收獲。

責(zé)任編輯:姜華 來源: 更了不起的前端
相關(guān)推薦

2022-03-03 22:00:19

Hooks函數(shù)組件React

2021-07-21 09:48:20

etcd-wal模塊解析數(shù)據(jù)庫

2022-03-24 12:28:03

React 17React 18React

2021-07-12 06:11:14

SkyWalking 儀表板UI篇

2022-05-08 19:36:35

Web前端時間復(fù)雜度

2021-08-25 06:33:52

Node.jsVscode調(diào)試工具

2021-08-18 10:28:09

MySQL SQL 語句數(shù)據(jù)庫

2022-04-29 14:38:49

class文件結(jié)構(gòu)分析

2021-04-08 11:00:56

CountDownLaJava進階開發(fā)

2022-02-17 08:53:38

ElasticSea集群部署

2021-03-12 09:21:31

MySQL數(shù)據(jù)庫邏輯架構(gòu)

2021-06-21 14:36:46

Vite 前端工程化工具

2021-04-01 10:51:55

MySQL鎖機制數(shù)據(jù)庫

2021-04-14 14:16:58

HttpHttp協(xié)議網(wǎng)絡(luò)協(xié)議

2024-06-13 08:34:48

2022-03-22 09:09:17

HookReact前端

2023-03-29 07:45:58

VS編輯區(qū)編程工具

2021-01-28 08:55:48

Elasticsear數(shù)據(jù)庫數(shù)據(jù)存儲

2021-07-08 07:30:13

Webpack 前端Tree shakin

2023-03-13 09:31:04

點贊
收藏

51CTO技術(shù)棧公眾號

91精品国产91| 欧美乱妇15p| 狠狠色噜噜狠狠色综合久| 国产精品一区二区三区四| 国产欧美亚洲精品a| 欧美在线视频全部完| www.18av.com| 国产一区二区三区福利| 国产在线日韩欧美| 欧美性在线观看| 在线看的片片片免费| 大奶在线精品| 欧美日韩aaa| 黄色网页免费在线观看| 麻豆网站在线| 久久久国产午夜精品| 亚洲a∨日韩av高清在线观看| 精品成人免费视频| 亚洲精品成人| 国产亚洲精品久久久久动| 超级砰砰砰97免费观看最新一期 | 午夜久久av| 在线视频你懂得一区| 欧美激情亚洲天堂| 日本蜜桃在线观看| 久久这里只有精品视频网| 5g国产欧美日韩视频| 最新中文字幕在线观看视频| 亚洲成人直播| 欧美成人在线影院| 欧美xxxx精品| 奇米狠狠一区二区三区| 亚洲成人av在线| 中文字幕一区三区| 国产丝袜精品第一页| 午夜免费一级片| 欧美特大特白屁股xxxx| 亚洲精品福利视频网站| 亚洲最大免费| 成年在线电影| 久久久夜色精品亚洲| 国产伦精品一区二区三区四区视频 | 欧美理论电影在线精品| 精品日韩成人av| 奇米777在线| 成人污污www网站免费丝瓜| 24小时免费看片在线观看| 国产成人av影院| 成人在线视频网站| 这里只有精品6| 日本不卡的三区四区五区| 日本国产精品视频| 亚洲熟女综合色一区二区三区| 亚洲天堂久久| 久久久久久久一区二区三区| 久久久国产成人| 欧美午夜影院| 久久久久久久久网站| 欧美日韩中文视频| 亚洲另类黄色| 91成人福利在线| 国产婷婷色一区二区在线观看| 国产亚洲综合精品| 日本成人黄色片| 一级片在线免费播放| 奇米四色…亚洲| 亚洲一区成人| 久久午夜a级毛片| 免费在线黄色网| 狠色狠色综合久久| 97免费视频在线| 男人午夜免费视频| 日韩一区精品视频| 成人免费高清完整版在线观看| 亚洲视频在线免费播放| 韩国成人在线视频| 91在线播放视频| 秋霞网一区二区| 26uuu国产电影一区二区| 欧美乱偷一区二区三区在线| 国产污视频在线| 国产精品久久99| 男人的天堂avav| 日韩影院在线| 欧美日韩在线播放三区四区| 超碰在线资源站| h视频久久久| 亚洲人成网在线播放| 成人性视频免费看| 亚洲午夜激情在线| 国产99久久久欧美黑人| 国产人妖在线播放| 91影院在线观看| 一区二区av| 成人在线高清免费| 欧美日韩免费在线视频| 亚洲成人福利视频| 亚洲小说图片视频| 久热爱精品视频线路一| 日本系列第一页| 日本不卡中文字幕| 成人欧美一区二区三区视频xxx| 五月婷婷伊人网| 国产精品萝li| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 黄色欧美视频| 亚洲精品720p| 蜜臀久久精品久久久用户群体| 午夜亚洲伦理| 国产超碰91| 亚洲视频tv| 欧美视频中文在线看| 永久免费黄色片| 国产亚洲电影| 韩国一区二区电影| 国产99久久九九精品无码免费| 91麻豆精品视频| 无码人妻精品一区二区蜜桃网站| 日韩高清不卡| 精品亚洲国产视频| 久久久久亚洲AV| 久久99国产精品久久99| 日韩啊v在线| 在线手机中文字幕| 亚洲第一精品电影| 青青草在线观看视频| 日韩二区在线观看| 欧美日韩视频在线一区二区观看视频| 天使と恶魔の榨精在线播放| 欧美三区在线观看| 天天躁日日躁aaaxxⅹ| 韩日在线一区| av在线不卡一区| 香蕉久久一区二区不卡无毒影院| 亚洲视频在线观看一区二区三区| caoporn成人| 久久99亚洲热视| 国产精品国产三级国产普通话对白| 91麻豆国产福利在线观看| youjizz.com在线观看| 亚洲国产天堂| 欧美日韩亚洲一区| 久久免费视频观看| 亚洲国产www| 亚洲黄色在线视频| 亚洲av无一区二区三区久久| 午夜精品久久久久久久四虎美女版| 国产精品久久在线观看| 国产中文字幕在线观看| 日韩欧美亚洲范冰冰与中字| aaaa黄色片| 国产婷婷精品| 欧美精品一区二区三区四区五区 | 国产精品夜夜爽| 亚洲.欧美.日本.国产综合在线| 夜鲁夜鲁夜鲁视频在线播放| 日韩精品在线视频观看| 日本视频在线观看免费| 久久久精品综合| 亚洲 中文字幕 日韩 无码| 九九免费精品视频在线观看| 人人爽久久涩噜噜噜网站| 青青草视频在线免费观看| 欧美性生交xxxxxdddd| 91精品人妻一区二区| 久久久一二三| 亚洲乱码一区二区三区 | 欧美日韩一区不卡| 中文字幕求饶的少妇| 国产又黄又大久久| 国产乱人伦精品一区二区三区| 91麻豆精品激情在线观看最新| 久久久久久久久久av| 色猫av在线| 欧美性高清videossexo| 国产精品免费在线视频| 国产成人午夜视频| 免费在线观看亚洲视频| 精品国产视频| 成人写真视频福利网| av日韩国产| 亚洲视频在线观看网站| 一区二区的视频| 亚洲第一成人在线| 中国女人特级毛片| 国产一区二区三区四区五区入口| 中国丰满熟妇xxxx性| 国产精品密蕾丝视频下载| 国产在线999| www在线观看黄色| 最近2019中文字幕一页二页| 精品人妻一区二区三区换脸明星| 狠狠色噜噜狠狠狠狠97| 天天做夜夜爱爱爱| www.在线欧美| 第一区免费在线观看| 一区二区高清| 中文字幕日韩一区二区三区| 狼人天天伊人久久| 91精品久久久久久久久久 | 午夜精品福利在线| www.4hu95.com四虎| 成人性生交大片免费| 在线观看免费成人av| 激情视频一区二区三区| 亚洲国产另类久久久精品极度| 豆花视频一区二区| 国产专区欧美专区| 都市激情综合| 久久久亚洲福利精品午夜| 天天影视久久综合| 日韩精品在线观看一区| 精品人妻伦一二三区久久| 欧美午夜不卡视频| 国产精品第5页| 亚洲综合一二三区| 久久99久久99精品免费看小说| 久久久www成人免费无遮挡大片| 亚洲精品成人无码毛片| 狠狠狠色丁香婷婷综合久久五月| 日本成年人网址| 影音先锋日韩资源| 日本大胆人体视频| 久久久久久久久久久久久久| 日韩精品一区二区三区丰满| 农村少妇一区二区三区四区五区 | 国产一级免费大片| 日韩高清不卡一区| 日韩有码免费视频| 中文在线不卡| 国产无限制自拍| 欧美日韩一视频区二区| 在线观看成人免费| 91欧美国产| 亚洲人一区二区| 欧美裸体在线版观看完整版| 蜜桃久久影院| 婷婷亚洲精品| 久久精品日产第一区二区三区乱码 | 中文国语毛片高清视频| 国产精品无人区| 少妇一级黄色片| 中文字幕精品在线不卡| 久久精品三级视频| 中文字幕免费一区| 国产传媒在线看| 国产精品乱子久久久久| 国产激情av在线| 国产精品国产三级国产| 蜜桃av免费观看| 自拍偷拍国产亚洲| 天天看片中文字幕| 亚洲国产精品一区二区久久恐怖片 | 久久国产小视频| 亚洲国产另类久久久精品极度| 日韩理论电影大全| 在线观看免费91| 91高清一区| 一卡二卡三卡视频| 日韩图片一区| 97在线免费公开视频| 视频在线观看一区二区三区| 国产wwwxx| 精品一区二区三区免费观看| 亚洲欧美日韩精品一区| 国产最新精品免费| 农村末发育av片一区二区| 成人免费视频app| 欧美高清性xxxx| 中文字幕不卡在线播放| 伊人久久久久久久久久久久久久| 亚洲免费在线看| 日韩精品乱码久久久久久| 精品欧美一区二区三区| 亚洲天堂男人av| 7777精品伊人久久久大香线蕉最新版| 国产女18毛片多18精品| 精品电影一区二区三区| 色综合888| 日韩有码在线播放| 牛牛精品视频在线| 欧美自拍视频在线| 亚洲国产天堂| 久久国产精品99久久久久久丝袜| 国产一区99| 青青草视频国产| 视频一区在线视频| 亚洲一区二区三区三州| 99riav一区二区三区| 国产传媒在线看| 精品电影在线观看| 伊人免费在线观看| 亚洲国产成人精品久久久国产成人一区 | 亚洲欧美日韩不卡| 野花国产精品入口| 午夜激情av在线| 成人自拍视频在线观看| 亚洲精品国产精品国自产网站| 1024国产精品| 欧美a视频在线观看| 日韩女优视频免费观看| 国产色a在线| 高清一区二区三区四区五区| 91综合国产| 好看的日韩精品视频在线| 91免费精品| 中文字幕乱码人妻综合二区三区| 精品一区二区三区香蕉蜜桃| 蜜桃精品成人影片| 亚洲一卡二卡三卡四卡五卡| 中文无码av一区二区三区| 亚洲成人a**站| 在线你懂的视频| 国产精品一区av| 国产成人精品一区二区免费看京 | 精品无人区卡一卡二卡三乱码免费卡| 色婷婷免费视频| 夜色激情一区二区| 97成人在线观看| 在线视频欧美日韩| 黄色综合网址| 激情视频一区二区| 国产精品a级| 色姑娘综合天天| 亚洲视频一二三区| 在线不卡免费视频| 亚洲视频一区二区三区| 欧美大片高清| 久久偷看各类wc女厕嘘嘘偷窃| 在线不卡欧美| 永久免费未满蜜桃| 亚洲国产精品一区二区www在线 | 懂色av粉嫩av蜜臀av| 麻豆高清免费国产一区| 蜜桃久久精品成人无码av| 在线视频亚洲一区| 国产福利片在线| 国产精品成熟老女人| 精品国产一区一区二区三亚瑟| 草草久久久无码国产专区| 97久久精品人人做人人爽| 日本一级黄色大片| 亚洲激情视频在线观看| 欧美日韩国产观看视频| 精品一区日韩成人| 国产欧美丝祙| 久久人人爽人人爽人人片| 欧美性20hd另类| 每日更新在线观看av| 国产成人精品日本亚洲| 国产一区二区三区91| 激情综合网俺也去| 国产精品久久久久影院老司| 一级片免费网站| 美女少妇精品视频| 亚洲国产一区二区三区网站| 蜜臀精品一区二区| 91视频观看视频| 乱子伦一区二区三区| 日韩资源在线观看| 久久九九精品视频| 久久久性生活视频| 久久综合色鬼综合色| 亚洲精品久久久久久久蜜桃| 最新中文字幕亚洲| 午夜精品在线| 干日本少妇首页| 中文字幕视频一区二区三区久| www.蜜臀av.com| 国内外成人免费激情在线视频| 伊人久久大香线蕉av不卡| 免费看涩涩视频| 国产99久久| 国产在线观看精品| 色男人天堂综合再现| 天天操夜夜操很很操| 婷婷综合在线观看| 91社区在线观看播放| 99九九视频| 性8sex亚洲区入口| 欧美肥妇bbwbbw| 日韩不卡中文字幕| 久久电影天堂| 日本男女交配视频| 欧美激情资源网| 亚洲第一色视频| 国产精品88a∨| 欧美日韩一卡| 影音先锋制服丝袜| 精品三级av在线| 日韩av电影资源网| 欧美大黑帍在线播放| 国产精品午夜免费| 手机av在线免费观看| 国产精品青草久久久久福利99| 国产精品成人一区二区网站软件| 在线小视频你懂的| 精品国免费一区二区三区| jizz亚洲女人高潮大叫| www.射射射|