成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網(wǎng)
最全最豐富的資訊網(wǎng)站

你了解 Transition 嗎?一起來深入了解下Transition!

你了解 Transition 嗎?你可能并不了解 Transition?下面本篇文章就來通過圖文結(jié)合的方式帶大家深入了解一下Transition,希望對大家有所幫助!

你了解 Transition 嗎?一起來深入了解下Transition!

這篇文章我們深入學(xué)習(xí) Transition 動(dòng)畫。沒錯(cuò),CSS3 Transition 動(dòng)畫。你可能會(huì)問,不是很簡單嗎,這什么好講的?

確實(shí),Transition 動(dòng)畫使用起來非常容易。只需要給元素加上 transition-delay, transition-duration, transition-property, transition-timing-function 屬性就可以有過濾效果。更簡單的用法是直接使用簡寫的 transition 屬性:

transition: <property> <duration> <timing-function> <delay>;  // transition-delay 默認(rèn)為 0 // transition-property 默認(rèn)為 all // transition-timing-function 默認(rèn)為 ease transition: 0.3s;

由于 transition 動(dòng)畫用起來幾乎沒有成本,一直以來也沒有太深入學(xué)習(xí),最近翻看源代碼和 MDN 文檔之后發(fā)現(xiàn)有些知識(shí)沒有理解到位,于是乎有了這篇文章,希望對讀者更深入了解 Transition 動(dòng)畫有所幫助。(學(xué)習(xí)視頻分享:css視頻教程)

為了盡量降低閱讀理解成本,這篇文章會(huì)寫得稍微啰嗦一點(diǎn)點(diǎn),大部分示例都會(huì)配圖 ——【多圖預(yù)警開始!】

什么是 Transition?

簡單的說就是過渡動(dòng)畫,通常修改 DOM 節(jié)點(diǎn)的樣式都是立即更新在頁面上的,例如修改寬高,修改透明度,修改背景色等等。

例如當(dāng)鼠標(biāo)移動(dòng)至按鈕上時(shí),為了突出按鈕的可交互,會(huì)在 hover 時(shí)修改它的樣式,讓用戶注意到它。沒有加 transition 過渡動(dòng)畫,給用戶的感覺會(huì)很僵很生硬。

.button {   // ...   background-color: #00a8ff; }  .button:hover {   background-color: #fbc531;   transform: scale(1.2); }

你了解 Transition 嗎?一起來深入了解下Transition!

加上 transition 一行代碼之后,變化就會(huì)比較順滑。

.button {   // ...   transition: 1s; } // ...

這個(gè)例子中我們修改了 background-colortransform,結(jié)合 transition 屬性,瀏覽器就會(huì)自動(dòng)讓屬性值隨著時(shí)間變化,從舊值逐步過渡到過渡新值,視覺上就是動(dòng)畫效果。

你了解 Transition 嗎?一起來深入了解下Transition!

區(qū)分于 AnimationTransition 動(dòng)畫側(cè)重于表現(xiàn)一次過渡效果,從開始到結(jié)束的變化。而 Animation 不需要變化,可以循環(huán)播放 ▶️。

需要注意,并不是所有的屬性變化都會(huì)有過渡效果

  1. 有些 CSS 屬性只支持枚舉值,非黑即白,不存在中間狀態(tài),例如 visibility: visible; 被修改成 visibility: hidden; 不會(huì)有動(dòng)畫效果,因?yàn)椴淮嬖诳梢娪植豢梢姷闹虚g狀態(tài)。在瀏覽器上的表現(xiàn)是 duration 到了之后元素立即突變?yōu)?hidden。

    .button:hover {   //...   visibility: hidden; }

    你了解 Transition 嗎?一起來深入了解下Transition!

  2. 有些屬性雖然是可計(jì)算數(shù)值,但天生注定不能有過渡效果,例如 transition-delaytransition-duration 都是立即生效,這里值得補(bǔ)一句由于 transition-* 屬性是即時(shí)生效,這行代碼如果是 hover 時(shí)才加上,那么效果會(huì)是 hover 時(shí)有動(dòng)畫,移出時(shí)沒有動(dòng)畫。
  3. 即使是可過渡的屬性變化,也可能因?yàn)闊o法計(jì)算中間狀態(tài)而失去過渡效果。例如 box-shadow 屬性雖然支持 transition 的動(dòng)畫的,但如果從 "outset" 切換到 inset,也是突變的。

    .button {   // ...   box-shadow: 0 0 0 1px rgb(0 0 0 / 15%);   transition: 1s; }  .button:hover {   // ...   box-shadow: inset 0 0 0 10px rgb(0 0 0 / 15%); }

    你了解 Transition 嗎?一起來深入了解下Transition!
    從表現(xiàn)上看,box-shadow 的變化是 hover 上去立馬就生效了。

  4. 如果某個(gè)屬性值是連續(xù)可計(jì)算的數(shù)值,但是變化前后變成散列的枚舉值,那么過渡也不會(huì)生效。例如從 height: 100px => height: auto 是不會(huì)有動(dòng)畫的。

以上的內(nèi)容回顧了 Transition 的基本用法,下面我們來看一個(gè)在實(shí)際開發(fā)場景中會(huì)遇到的問題。

為什么 Transition 動(dòng)畫沒有生效?

場景題:假設(shè)我們現(xiàn)在接到一個(gè)自定義下拉選擇器的動(dòng)畫需求,設(shè)計(jì)師給到的效果圖如下:

你了解 Transition 嗎?一起來深入了解下Transition!

這是很常見的出現(xiàn)-消失動(dòng)畫,在很多組件庫里面都會(huì)出現(xiàn),點(diǎn)擊觸發(fā)器(按鈕)時(shí)才在頁面上渲染 Popup (下拉內(nèi)容),并且 Popup 出現(xiàn)的同時(shí)需要有漸現(xiàn)和下滑的動(dòng)畫;展開之后再次點(diǎn)擊按鈕,Popup 需要漸隱和上滑。

平時(shí)使用的時(shí)候并沒有過多注意它的實(shí)現(xiàn),不妨現(xiàn)在讓我們動(dòng)手試驗(yàn)一下。

暫時(shí)忽略 popup 的內(nèi)容,用了個(gè) div 來占位模擬,HTML 結(jié)構(gòu)很簡單。

<div class="wrapper">     <div id="button"></div>     <div id="popup"></div> </div>

在點(diǎn)擊按鈕的時(shí)候,讓 popup 顯示/隱藏,然后切換 popup.active 類名。

const btn = document.querySelector("#button"); const popup = document.querySelector("#popup");  if (!popup.classList.contains("active")) {     popup.style.display = "block";     popup.classList.add("active"); } else {     popup.style.display = "none";     popup.classList.remove("active"); }

編寫 CSS 樣式,在不 active 時(shí)透明度設(shè)置為 0,向上偏移,active 時(shí)則不偏移且透明度設(shè)置為 1。

#popup {   display: none;   opacity: 0;   transform: translateY(-8px);   transition: 1s;    &.active {     opacity: 1;     transform: translateY(0%);   } }

完整代碼 在這里,看起來代碼沒什么問題,點(diǎn)擊按鈕切換的時(shí)候,popup 應(yīng)該會(huì)有動(dòng)畫過渡效果。然而實(shí)際運(yùn)行效果:

你了解 Transition 嗎?一起來深入了解下Transition!

硬邦邦地完全沒有過渡效果,這是為啥?明明已經(jīng)設(shè)置了 transition,且 opacitytranslateY 都是可計(jì)算可過渡的數(shù)值,也產(chǎn)生了變化,瀏覽器為什么不認(rèn)呢?

在查文檔之前,我們先嘗試使用萬精油 setTimeout

方案一:setTimeout 萬精油

修改 JS 代碼:

btn.addEventListener("click", () => {   if (!popup.classList.contains("active")) {     popup.style.display = "block";     setTimeout(() => {       popup.classList.add("active");     }, 0);   } else {     popup.classList.remove("active");     setTimeout(() => {       popup.style.display = "none";     }, 600);   } });

可以看到添加了 setTimeout 之后,transition 動(dòng)畫就生效了。

你了解 Transition 嗎?一起來深入了解下Transition!

隱藏時(shí)的 setTimeout 600ms 對應(yīng) CSS 中設(shè)置的 transition: 0.6s,就是動(dòng)畫完成之后才將 display 設(shè)置為 none

主要困惑的點(diǎn)在于為什么顯示的時(shí)候也需要加 setTimeout 呢?setTimeout 0 在這里起到的作用是什么?帶著問題去翻看規(guī)范文檔。

在規(guī)范文檔的 Starting of transitions 章節(jié)找到下面這段話:

When a style change event occurs, implementations must start transitions based on the computed values that changed in that event. If an element is not in the document during that style change event or was not in the document during the previous style change event, then transitions are not started for that element in that style change event.

翻譯一下,當(dāng)樣式變更事件發(fā)生時(shí),實(shí)現(xiàn)(瀏覽器)必須根據(jù)變更的屬性執(zhí)行過渡動(dòng)畫。但如果樣式變更事件發(fā)生時(shí)或上一次樣式變更事件期間,元素不在文檔中,則不會(huì)為該元素啟動(dòng)過渡動(dòng)畫。

結(jié)合瀏覽器構(gòu)建 RenderTree 的過程,我們可以很清晰地定位到問題:當(dāng)樣式變更時(shí)間發(fā)生時(shí),display: none 的 DOM 元素并不會(huì)出現(xiàn)在 RenderTree 中(style.display='block' 不是同步生效的,要在下一次渲染的時(shí)候才會(huì)更新到 Render Tree),不滿足 Starting of transitions 的條件。

你了解 Transition 嗎?一起來深入了解下Transition!

所以 setTimeout 0 的作用是喚起一次 MacroTask,等到 EventLoop 執(zhí)行回調(diào)函數(shù)時(shí),瀏覽器已經(jīng)完成了一次渲染,再加上 .active 類名,就有了執(zhí)行過渡動(dòng)畫的充分條件。

優(yōu)化方案二:精準(zhǔn)卡位 requestAnimationFrame

既然目的為了讓元素先出現(xiàn)到 RenderTree 中,和渲染相關(guān),很容易想到可以將 setTimeout 替換成 requestAnimationFrame,這樣會(huì)更精準(zhǔn),因?yàn)?requestAnimation 執(zhí)行時(shí)機(jī)和渲染有關(guān)。

if (!popup.classList.contains("active")) {     popup.style.display = "block";      requestAnimationFrame(() => {         popup.classList.add("active");     }); }

補(bǔ)充一個(gè)小插曲:在查找資料的過程中了解到 requestAnimationFrame 的規(guī)范是要求其回調(diào)函數(shù)在 Style/Layout 等階段之前執(zhí)行,起初 Chrome 和 Firefox 是遵循規(guī)范來實(shí)現(xiàn)的。而 Safari 和 Edge 是在執(zhí)行的時(shí)機(jī)是在之后。 從現(xiàn)在的表現(xiàn)上來看,Chrome 和 Firefox 也改成了在之后執(zhí)行,翻看以前的文檔會(huì)說需要嵌套兩層 requestAnimationFrame,現(xiàn)在已經(jīng)不需要了。Is requestAnimationFrame called at the right point?

優(yōu)化方案三:Force Reflow

在規(guī)范文檔中,還留意到以下這句話:

Implementations typically have a style change event to correspond with their desired screen refresh rate, and when up-to-date computed style or layout information is needed for a script API that depends on it.

意思是說,瀏覽器通常還會(huì)在兩種情況下會(huì)產(chǎn)生樣式變更事件,一是滿足屏幕刷新頻率(不就是 requestAnimationFrame?),二是當(dāng) JS 腳本需要獲取最新的樣式布局信息時(shí)。

在 JS 代碼中,有些 API 被調(diào)用時(shí),瀏覽器會(huì)同步地計(jì)算樣式和布局,頻繁調(diào)用這些 API(offset*/client*/getBoundingClientRect/scroll*/…等等)通常會(huì)成為性能瓶頸。

你了解 Transition 嗎?一起來深入了解下Transition!

然而在這個(gè)場景卻可以產(chǎn)生奇妙的化學(xué)反應(yīng):

if (!popup.classList.contains("active")) {   popup.style.display = "block";   popup.scrollWidth;   popup.classList.add("active"); }

注意看,我們只是 display 和 add class 之間讀取了一下 scrollWidth,甚至沒有賦值,過渡動(dòng)畫就活過來了。

你了解 Transition 嗎?一起來深入了解下Transition!

原因是 scrollWidth 強(qiáng)制同步觸發(fā)了重排重繪,再下一行代碼時(shí),popup 的 display 屬性已經(jīng)更新到 Render Tree 上了。

優(yōu)化方案四:過渡完了告訴我 onTransitionEnd

現(xiàn)在【出現(xiàn)】動(dòng)畫已經(jīng)搞明白了,在看開源庫的源碼中發(fā)現(xiàn)像 vue, bootstrap, react-transition-group 等庫都是使用了 force reflow 的方法,而 antd 所使用的 css-animte 庫則是通過設(shè)置 setTimeout。

【消失】動(dòng)畫還不夠優(yōu)雅,前面我們是直接寫死 setTimeout 600,讓元素在動(dòng)畫結(jié)束時(shí)消失的。這樣編碼可復(fù)用性差,修改動(dòng)畫時(shí)間還得改兩處地方(JS + CSS),有沒有更優(yōu)雅的實(shí)現(xiàn)?

popup.classList.remove("active");setTimeout(() => {     popup.style.display = "none"; }, 600);

文檔中也提到了 Transition Events,包括 transitionruntransitionstarttransitionendtransitioncancel,看名字就知道事件代表什么意思,這里可以用 transitionend 進(jìn)行代碼優(yōu)化。

if (!popup.classList.contains("active")) {     popup.style.display = "block";     popup.scrollWidth;     popup.classList.add("active"); } else {     popup.classList.remove("active");     popup.addEventListener('transitionend', () => {         popup.style.display = "none";     }, { once: true }) }

需要注意 transition events 同樣也有冒泡、捕獲的特性,如果有嵌套 transition 時(shí)需要留意 event.target

到這里我們已經(jīng)用原生 JS 完成了一個(gè)出現(xiàn)、消失的動(dòng)畫實(shí)現(xiàn),完整的代碼在這里。文章的最后,我們參照 vue-transition 來開發(fā)一個(gè) React Transition 的單個(gè)元素動(dòng)畫過渡的最小實(shí)現(xiàn)。

仿 v-transition 實(shí)現(xiàn)一個(gè) React Transition 組件

你了解 Transition 嗎?一起來深入了解下Transition!

根據(jù)動(dòng)畫過程拆分成幾個(gè)過程:

  • enter 階段渲染 DOM 節(jié)點(diǎn),初始化動(dòng)畫初始狀態(tài)(添加 *-enter 類名)
  • enter-active 階段執(zhí)行 transition 過渡動(dòng)畫(添加 *-enter-active 類名)
  • enter-active 過渡完成之后進(jìn)入正常展示階段(移除 *-enter-active 類名)

enter-to 和 leave-to 暫時(shí)用不上,leave 階段和 enter 基本一致也不再贅述。

直接看代碼:

export const CSSTransition = (props: Props) => {   const { children, name, active } = props;   const nodeRef = useRef<HTMLElement | null>(null);   const [renderDOM, setRenderDOM] = useState(active);    useEffect(() => {     requestAnimationFrame(() => {       if (active) {         setRenderDOM(true);         nodeRef.current?.classList.add(`${name}-enter`);         // eslint-disable-next-line @typescript-eslint/no-unused-expressions         nodeRef.current?.scrollWidth;         nodeRef.current?.classList.remove(`${name}-enter`);         nodeRef.current?.classList.add(`${name}-enter-active`);          nodeRef.current?.addEventListener("transitionend", (event) => {           if (event.target === nodeRef.current) {             nodeRef.current?.classList.remove(`${name}-enter-active`);           }         });       } else {         nodeRef.current?.classList.add(`${name}-leave`);         // eslint-disable-next-line @typescript-eslint/no-unused-expressions         nodeRef.current?.scrollWidth;         nodeRef.current?.classList.remove(`${name}-leave`);         nodeRef.current?.classList.add(`${name}-leave-active`);          nodeRef.current?.addEventListener("transitionend", (event) => {           if (event.target === nodeRef.current) {             nodeRef.current?.classList.remove(`${name}-leave-active`);             setRenderDOM(false);           }         });       }     });   }, [active, name]);    if (!renderDOM) {     return null;   }    return cloneElement(Children.only(children), {     ref: nodeRef   }); };

這個(gè)組件接收三個(gè) props,分別是

  • children 需要做過渡動(dòng)畫的 ReactElement,只允許傳一個(gè) Element
  • name 過渡動(dòng)畫的 css 類名前綴
  • active 布爾值,用于區(qū)分是進(jìn)場還是消失

使用方式:

<CSSTransition name="fade" active={active}>     // 一個(gè)需要做過渡動(dòng)畫的 ReactElement </CssTransition>

借助 transition-delay,加一點(diǎn)技巧實(shí)現(xiàn) stagger 效果:

你了解 Transition 嗎?一起來深入了解下Transition!

完整的示例代碼在這里,注意:這只是個(gè)快速實(shí)現(xiàn)用于演示的示例,有非常多的問題沒有考慮在內(nèi),僅可用于學(xué)習(xí)參考。

結(jié)語

原本以為非常基礎(chǔ)簡單的知識(shí)點(diǎn),分分鐘可以寫完這篇文章。沒想到中途查文檔,看資料,制作演示 DEMO 還是花了不少時(shí)間。好在整理資料的過程中也理清了很多知識(shí)點(diǎn)。希望這篇文章對你熟悉 Transition 動(dòng)畫有所幫助 。

贊(0)
分享到: 更多 (0)
?
網(wǎng)站地圖   滬ICP備18035694號(hào)-2    滬公網(wǎng)安備31011702889846號(hào)
亚洲乱码尤物193YW最新地址| 新狼窝色AV性久久久久久| 色偷一区国产精品| 特级西西WWW.444人体聚色| 无码人妻精品一区二区三区久久| 性高湖久久久久久久久| 亚洲AV中文AⅤ无码AV接吻| 亚洲码国产精品高潮在线| 中国女人黑森林毛耸耸| PORNO日本╳╳╳| 大帝A∨无码视频在线播放| 国产无套乱子伦精彩是白视频| 精品乱码一区内射人妻无码| 麻豆精品国产综合久久| 日本老肥婆BBBWBBBWZR| 无码人妻一区二区三区免水牛视频| 亚洲AV永久无码精品无码网站| 野花ぶるだいあり~しすWWW| 99久久免费精品国产72精品九| 成人亚洲A片Ⅴ一区二区小说 | 色欲丰满熟妇人妻AV无码 | 日日噜噜夜夜狠狠VA视频| 西方38大但人文艺术| 野花日本HD免费高清版视频| 啊灬啊灬啊灬快灬高潮了霸总| 国产极品粉嫩馒头一线天AV| 精品无码成人片一区二区| 牛鞭擦进少妇的下身| 特级欧美ZOOXX| 亚洲熟妇色XXXXX亚洲| HEZYO加勒比 一本高手机在| 国产精品青青青高清在线| 久久久久亚洲AV成人片一区| 日本午夜免费福利视频| 亚洲XXX午休国产熟女屁| 99国精产品灬源码168| 国产精品久久久久久久久鸭无码| 久久久久精品一区中文字幕| 日本亚洲欧美一区二区麻豆| 亚洲国产精品热久久| AV成人午夜无码一区二区| 国产精品特级毛片一区二区三区| 久久久一本精品99久久精品| 色翁荡熄又大又硬又粗又视频| 亚洲欧美成人综合久久久 | AV永久天堂一区二区三区香港| 国产精品V片在线观看不卡| 两根黑人粗大噗嗤噗嗤视频| 双乳被一左一右吃着的小说| 一本色道久久综合亚洲精品| 国产69精品久久久久APP下载| 久久久久久精品免费免费麻辣 | 国产AV一区二区三区日韩| 久久精品国产精品亚洲下载| 色天使亚洲综合一区二区| 一边做一边喷17P| 国产成人无码国产亚洲| 免费A级毛片无码A∨蜜芽18禁 | 日韩AV无码社区一区二区三区| 亚洲精品乱码久久久久久蜜桃不卡| 八戒八戒在线WWW观看| 精品亚洲国产成人AV在线时间短| 日韩无码视频三区| 一级伦奷片高潮无码看了5| 国产对白videos麻豆高潮 | 欢迎来到精灵の森林1到四集| 人妻在厨房被侮辱高清版| 亚洲无人区码一二三四区别| 国产WW久久久久久久久久| 内射在线CHINESE| 亚洲成A人片在线观看国产| 东北往事之黑道风云20年| 免费观看高清日本AⅤ| 亚洲AV中文无码乱人伦在线r▽| 办公室娇喘的短裙老师| 久久影院九九被窝爽爽| 亚洲AV成人片无码www小说| 边吃奶边扎下面动态| 乱码一二三乱码又大又粗| 亚洲 欧美 国产 日韩 精品| 成年免费A级毛片免费看丶| 美丽女邻居交换5完整版| 亚洲产国偷v产偷v自拍浪潮AV| 丁香花高清在线观看完整版| 免费看成人A级毛片| 亚洲精品TV久久久久久久久 | ZLJZLJZLJ日本人水多多| 久久天天躁夜夜躁狠狠85| 亚洲AV无码国产精品夜色午夜| 成人欧美一区二区三区视频| 男人激烈吮乳吃奶到高潮视频| 亚洲乱妇老熟女爽到高潮的片| 国产精品高潮呻吟AV久久动漫 | 欧美熟妇成人大片性爽| 一二三四五在线播放免费观看中文| 国产未成女YOUNV仙踪林| 色欲AⅤ蜜臀AV免费观看 | 国产午夜亚洲精品国产成人| 少妇VIDES裸体BBWWHD| АⅤ天堂中文在线网| 免费一看一级毛片少妇丰满2| 亚洲人ⅤSAⅤ国产精品| 国产中年熟女高潮大集合| 我和大佬的365天| 公交车后车座疯狂的做的细节| 人妻少妇被猛烈进入中文字幕| 最新亚洲人成网站在线观看| 久久夜色精品国产亚洲| 亚洲一区二区三区在线观看网站| 好大好爽舔我高潮了| 西西GOGO大胆啪啪艺术| 国产成人一区二区三区免费| 色欲AⅤ蜜臀AV免费观看| 穿越后每天都在PIAPIA打脸| 人与禽性视频77777| А√天堂资源在线官网BT| 欧美日韩中文国产一区| 999精品国产人妻无码系列| 男吃奶玩乳尖高潮视频午夜I| 中文无码人妻有码人妻中文字幕| 久久无码成人影片| 亚洲综合无码无在线观看| 久久精品人妻中文系列葵司 | 成人免费A级毛片免费| 日产亚洲一卡2卡3卡4卡网站| 差差差很疼无掩盖在线观看| 日本一二三区视频在线| 成人免费A级毛片天天看| 日产2021一二三四免费| 粗长挺进新婚人妻小怡| 色天使色偷偷色噜噜| 国产50岁老熟女网站| 同桌上课脱裙子让我帮他自慰| 国产精品久久国产精品99盘 | 国产在视频线精品视频| 亚洲AV中文无码乱人伦在线视色| 黑人与亚洲美女ⅩXXX| 亚洲国产一区二区三区亚瑟| 久久99精品久久久久久野外| 伊人久久大香线蕉AV成人| 蜜桃AV人片在线观看| A∨色狠狠一区二区三区| 人妻无码AⅤ中文字幕视频| 大荫蒂又大又长又硬又紧又粗| 他用嘴巴含着我奶头吸怎么办| 国产极品美女高潮无套APP| 亚洲AV无码一区毛片AV| 久久WWW免费人成人片| 永久免费男同AV无码入口| 欧美XXXX黑人又粗又长精品| 锕锕锕锕锕锕锕锕好疼小视频软件 | 丝袜中文人妻无码有码久热| 国产精品女同久久久久电影院| 亚洲AV无码潮喷在线观看蜜桃 | 亚洲熟妇AV一区二区三区下载| 老师黑色双开真丝旗袍| CHINESE熟女老太HD| 少妇私密会所按摩到高潮呻吟| 国产欧美久久久精品影院| 亚洲精品欧美综合二区| 美女脱个精光露出奶头和尿口| CHINA真实VIDEOS另类| 熟妇人妻久久中文字幕| 含羞草传媒免费进入APP老版本| 夜夜嗨AV一区二区三区| 欧美性大战XXXXX久久久| 国产AⅤ激情无码久久男男剧| 亚洲AV无码日韩AV无码导航| 久久伊人精品一区二区三区| OM老熟妇DHXⅩXXX| 无遮挡粉嫩小泬久久久久久久久| 精品久久久久久亚洲精品| 777亚洲精品乱码久久久久久| 日韩高清免费A级毛片| 国色天香精品卡一卡二卡三二百 | 亚洲中文字幕久久精品无码A| 欧美黑人又大又粗XXXX| 妇女性内射冈站HDWWWOOO| 亚洲精品国产成人AV| 欧美xxxxx视频| 国产精品久久久久精品| 一二三四视频中文字幕| 日韩乱码人妻无码超清蜜桃| 国内精品人妻无码久久久影院导航| 制服 丝袜 亚洲 中文 综合| 色婷婷五月综合亚洲小说| 精品亚洲国产成人小电影| WWW久久只有这里有精品| 无码国产69精品久久久久孕妇| 久久亚洲国产成人精品性色| 成年女人WWXX免费国产| 亚洲AV综合色区无码二区偷拍| 女厕厕露P撒尿八个少妇| 国产精品沙发午睡系列| 中文无码人妻丰满熟妇啪啪| 铜铜铜铜铜铜铜好多水| 猫咪AV成人永久网站| 国产精品一区二区高清在线| 中文字幕一区二区三区久久网站| 无码精品国产VA在线观看|