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

這是一篇很好的互動式文章,Framer Motion 布局動畫

開發 前端
我選擇不以這種方式實現,因為我不想脫離核心的比例校正概念。如果你有興趣,可以看看 Framer Motion源代碼,他們使用一種叫做 "投影節點( "projection nodes")"的東西來維護自己的類似DOM的運動組件樹。

重現framer的神奇布局動畫的指南。

到目前為止,我最喜歡 Framer Motion 的部分是它神奇的布局動畫--將 layout prop  拍在任何運動組件上,看著該組件從頁面的一個部分無縫過渡到下一個部分。

<motion.div layout />

圖片

在這篇文章中,我們主要介紹:

  • 布局變化:它們是什么,何時發生。
  • 基于CSS的方法以及為什么它們并不總是有效。
  • FLIP:是Framer Motion使用的技術。

布局變化

當頁面上的一個元素影響其他元素改變位置時,就會發生布局變化。例如,改變一個元素的寬度或高度就是一種布局變化,因為任何相鄰的元素都必須移動,以便為該元素的新尺寸騰出空間。

同樣,改變元素的justify-content屬性也是一種布局變化,因為它導致該元素的子元素改變位置。

圖片

不過,像scale屬性的變化并不是布局的改變,因為它的變化不影響頁面上的其他元素。

圖片

用CSS做動畫

那么,我們如何將布局變化做成動畫呢?一種方法是直接使用 CSS過渡使屬性產生動畫:

.square {
transition: width 0.2s ease-out;
}

現在,當 square 

// Motion.js
import React from 'react'
import './styles.css'

export default function Motion({ toggled }) {
return <div className={`active ${toggled ? 'toggled' : ''}`} />
}

style.css

.active {
border: 1px solid hsl(208, 77.5%, 76.9%);
background: hsl(209, 81.2%, 84.5%);
width: 120px;
height: 120px;
border-radius: 8px;
transition: width 0.5s ease-out;
}

.toggled {
width: 200px;
}

看上去,CSS 也可以做動畫,但它有兩個主要的缺點:

  • 不能把所有東西都做成動畫。例如,不能對justify-content?的變化制作動畫,因為justify-content不是一個可動畫的屬性。
  • 性能問題。涉及布局變化的CSS動畫通常比基于 transform 的動畫更昂貴,所以你可能會發現你的動畫在低端設備上不那么流暢。

我們先來看看性能問題。

性能

不要預先優化 如果在低端設備上沒有注意到任何性能問題,而且CSS transition 對你有效,那么就不要擔心!只有在需要時才進行優化。

涉及布局變化的CSS動畫通常比其他CSS動畫更昂貴,因為它影響到周圍的其他元素。這是因為瀏覽器必須在動畫的每一幀中重新計算頁面的布局--對于一個60FPS的動畫來說,這意味著每秒鐘要計算60次!

回顧上面動畫。注意到灰色的盒子看起來也在做動畫,盡管我們只過渡了藍色的盒子:

圖片

發生這種情況的原因是,每次藍框的尺寸發生變化時,瀏覽器都會重新計算灰框的位置。

另一方面,瀏覽器可以更快地對 transform 等CSS屬性進行動畫處理,因為它們不影響布局。

圖片

注意,隨著藍色方框的增長,灰色方框保持原狀!

所以,如果 transform? 的動畫成本更低,我們是否可以用 transform 

是的,可以!

FLIP

FLIP 是 First, Last, Inverse, Play? 的縮寫,它是一種技術,可以讓我們使用 "快速" 的 CSS 屬性(如transform?)對 "slow"  的布局變化制作動畫。FLIP甚至可以對 "不可動畫" 的屬性(如justify-content)進行動畫處理。Framer Motion使用FLIP來實現其布局動畫。

顧名思義,FLIP是一種四步技術,它通過顛倒瀏覽器所做的任何布局變化來工作。我們通過動畫演示justify-content從flex-start到flex-end的變化來弄清楚它是如何工作的。

圖片

First

在 First 中,在任何布局變化發生之前,測量我們要做動畫的元素的位置:

圖片

獲取元素位置的一種方法是使用HTML元素的.getBoundingClientRect()方法:

const Motion = (props) => {
const ref = React.useRef();
React.useLayoutEffect(() => {
const { x, y } = ref.current.getBoundingClientRect();
}, []);
return <div ref={ref} {...props} />;
};

Last

在 Last 這一步中,我們測量布局變化后元素的位置:

圖片

為了在代碼中實現這一點,我們首先假設布局的改變意味著組件剛剛重新渲染了。所以我們先從useEffect鉤子中刪除依賴數組,使鉤子每次渲染都能運行。

試著觸發幾次布局變化,檢查控制臺,看看顯示的x和y值是什么。

App.js

import React from 'react'
import Motion from './Motion'
import './styles.css'

export default function App() {
const [toggled, toggle] = React.useReducer(state => !state, false)

return (
<div id="main">
<button notallow={toggle}>Toggle</button>
<div id="wrapper" style={{ justifyContent: toggled ? 'flex-end' : 'flex-start' }}>
<Motion />
</div>
</div>
)
}

Motion.js

import React from 'react'

export default function Motion() {
const squareRef = React.useRef()

React.useLayoutEffect(() => {
const box = squareRef.current?.getBoundingClientRect()
if (box) { console.log(box.x, box.y) }
})

return <div id="motion" ref={squareRef} />
}

Inverse

在 inverse 階段,我們修改正方形的位置,使其看起來像是根本沒有移動過。要做到這一點,我們要比較我們所做的兩個測量,并計算出一個 transform ,然后應用到正方形上。

圖片

使用 React 實現的代碼:

App.js

import React from 'react'
import Motion from './Motion'
import './styles.css'

export default function App() {
const [toggled, toggle] = React.useReducer(state => !state, false)

return (
<div id="main">
<button notallow={toggle}>Toggle</button>
<div id="wrapper" style={{ justifyContent: toggled ? 'flex-end' : 'flex-start' }}>
<Motion />
</div>
</div>
)
}

Motion.js

import React from 'react'

export default function Motion() {
const squareRef = React.useRef();
const initialPositionRef = React.useRef();

React.useLayoutEffect(() => {
const box = squareRef.current?.getBoundingClientRect();
if (moved(initialPositionRef.current, box)) {
// get the difference in position
const deltaX = initialPositionRef.current.x - box.x;
const deltaY = initialPositionRef.current.y - box.y;
console.log(deltaX, deltaY);

// apply the transform to the box
squareRef.current.style.transform = `translate(${deltaX}px, ${deltaY}px)`;
}
initialPositionRef.current = box;
});

return <div id="motion" ref={squareRef} />;
}

const moved = (initialBox, finalBox) => {
// we just mounted, so we don't have complete data yet
if (!initialBox || !finalBox) return false;

const xMoved = initialBox.x !== finalBox.x;
const yMoved = initialBox.y !== finalBox.y;

return xMoved || yMoved;
}

Play

到目前為止,我們有一個正方形,它被施加了一個 transform,在按下切換鍵后沒有移動。

在FLIP的最后一步,即 Play 步驟中,我們將這個 transform 動畫化為零,讓正方形動畫化到它的最終位置。

圖片

有多種方法可以實現這個動畫;我個人選擇使用Popmotion的animate函數。

import React from 'react'
import { animate } from 'popmotion'

export default function Motion() {
const squareRef = React.useRef();
const initialPositionRef = React.useRef();

React.useLayoutEffect(() => {
const box = squareRef.current?.getBoundingClientRect();
if (moved(initialPositionRef.current, box)) {
// get the difference in position
const deltaX = initialPositionRef.current.x - box.x;
const deltaY = initialPositionRef.current.y - box.y;

// inverse the change using a transform
squareRef.current.style.transform = `translate(${deltaX}px, ${deltaY}px)`;

// animate back to the final position
animate({
from: 1,
to: 0,
duration: 2000,
onUpdate: progress => {
squareRef.current.style.transform =
`translate(${deltaX * progress}px, ${deltaY * progress}px)`;
}
})
}
initialPositionRef.current = box;
});

return <div id="motion" ref={squareRef} />;
}

const moved = (initialBox, finalBox) => {
// we just mounted, so we don't have complete data yet
if (!initialBox || !finalBox) return false;

const xMoved = initialBox.x !== finalBox.x;
const yMoved = initialBox.y !== finalBox.y;

return xMoved || yMoved;
}

把所有東西放在一起

把所有步驟做起來,我們得到:

圖片

動畫的大小

到目前為止,我們只用FLIP來制作位置變化的動畫。但對于大小來說,我們可以用同樣的方法嗎我們試著復制下面的動畫,在這個動畫中,正方形被拉伸到充滿整個容器。

圖片

測量尺寸變化

我們首先要測量布局改變前后的正方形的大小。碰巧是提,我們用來測量正方形的.getBoundingClientRect()?方法也剛好返回元素的 width? 和 height:

const { width, height } = squareRef.current.getBoundingClientRect();

圖片

反轉尺寸變化

為了反轉尺寸變化,我們將用最終尺寸除以初始尺寸:

const deltaWidth = box.width / initialBoxRef.current.width;

得到一個比例后,我們可以將其傳遞給 scale 屬性:

squareRef.current.style.transform = `scaleX(${deltaWidth})`;

我們不會像position?那樣將比例動畫到0?,而是將比例動畫到1(如果我們將比例動畫到0,元素將完全消失):

animate({
from: deltaWidth,
to: 1,
// ...
});

圖片

使用 position 固定大小

到目前為止,我們已經能夠使用FLIP為位置和大小的變化制作動畫。當我們試圖將大小和位置都做成動畫時會發生什么?

圖片

嗯,這看起來有點不對勁。這里發生了什么?如果我們在 play?  步驟之前暫停動畫,我們可以看到在 inverse 

圖片

修復轉換的起點

我們試著搞清楚這個問題。

當我們把位置和大小的變化結合起來時,我們在逆向步驟中進行了兩個獨立的變換--平移和縮放。如果我們單獨看一下這些變換,我們就可以知道這個正方形是如何結束的:

圖片

我們的算法首先將最終位置的左上角與原始位置的左上角對齊,然后將其縮小到初始尺寸。

縮放變換似乎是這里的罪魁禍首--它從正方形的中心開始縮放,導致正方形最終出現在錯誤的位置。現在,如果我們把變換的原點改為左上角,使其與平移相一致......

squareRef.current.style.transformOrigin = "top left";

圖片

對了!這就對了

如果 Transform Origin 發生變化怎么辦?

當然,這個解決方案的最大問題是,我們已經硬編碼了 transform origin 的值。如果用戶想要一個不同的變換原點呢?在這種情況下,布局動畫應該仍然有效。

訣竅在于確保 inverse  步驟比較了兩個方塊的變換原點之間的距離。換句話說,這個錯誤的發生是因為測量的距離和變換原點之間的差異:getBoundingClientRect()返回元素的左上角,而變換原點默認是在元素的中心。

只有當兩個正方形的大小相同時,左上角的點之間的距離和中心之間的距離才是相等的。

圖片

為了簡單起見,我在這里只比較水平距離--如果我們考慮到垂直距離,同樣的概念也適用。

當最終的正方形較大時,中心之間的距離大于左上角各點之間的距離。同樣,當最終的正方形較小時,中心之間的距離小于左上角各點之間的距離。

有了這個見解,我們也可以通過使用中心之間的距離而不是左上角的點來解決這個問題。

圖片

糾正子元素的變形

到目前為止,我們已經能夠制作一個布局動畫,可以無縫過渡到大小和位置的變化。現在讓我們增加一個測試--如果我們的元素有子元素會怎樣?

圖片

如上圖可以看到文字大小被改了。我們怎樣才能解決這個問題呢?

導致該問題的原因還 是inverse 比例變換。當我們反轉到一個較小的正方形時,文本最終會變小,因為正方形被按比例縮小。同樣地,當我們反轉到一個較大的正方形時,文本最終會變大,因為正方形被按比例放大了。

反比例公式

一種方法是在子元素上應用另一種變換,"抵消"父元素的變換。子元素的變換公式:

childScale = 1 / parentScale

例如:父元素變大兩倍,那么子方需要將其尺寸減半,才能保持相同的尺寸。試著移動下面的滑塊,注意文字是如何保持相同大小的,而不管廣場的大小如何。

圖片

現在,如何將其與我們的布局動畫相結合呢?

嘗試

我嘗試的第一件事是,在父元素要做動畫之前,先計算一次反比例,然后在子元素上單獨運行一個動畫。

const inverseTransform = {
scaleX: 1 / parentTransform.scaleX,
scaleY: 1 / parentTransform.scaleY,
};
play({
from: inverseTransform,
to: { scaleX: 1, scaleY: 1 },
});

例如,如果父元素動畫從scaleX: 2到scaleX: 1?,那么子代將從scaleX: 1 / 2到scaleX:1,只要比例校正的時間與父元素動畫相同,這種方法應該是可行的。

但是,運行起來效果卻是錯誤的:

圖片

在整個動畫過程中,文字明顯地在改變。

正確的縮放時間

這里的問題就在于這個假設:

只要比例校正的時間與父動畫相同,這種方法應該是有效的。

正常情況下,"正確" 反轉比例不會以與父動畫相同的方式變化,它有點像做自己的事情。

圖片

在上面的例子中,藍線表示父方的比例,而黃線表示子方的比例。請注意,藍線是一條直線,而黃線則有點像曲線。這告訴我們,反比例的時間與父比例的時間是不一樣的!

為了解決這個問題,我們可以這么做:

  • 提前計算出正確的時間
  • 每當父元素比例發生變化時,計算反比例。

(2)恰好比(1)簡單得多,而且還允許我們在父元素上處理各種不同的時序。這也是 Framer Motion使用的方法。

animate({
from: inverseTransform,
to: {
x: 0,
y: 0,
scaleX: 1,
scaleY: 1,
},
onUpdate: ({ x, y, scaleX, scaleY }) => {
parentRef.style.transform = `...`;
const inverseScaleX = 1 / scaleX;
const inverseScaleY = 1 / scaleY;
childRef.style.transform = `scaleX(${inverseScaleX}) scaleY(${inverseScaleY}) ...`;
},
});

App.js

import React from 'react'
import Motion from './Motion'
import './styles.css'

export default function App() {
const [toggled, toggle] = React.useReducer(state => !state, false)
const [corrected, toggleCorrected] = React.useReducer(state => !state, false)

return (
<div id="main">
<div>
<button notallow={toggle}>Toggle</button>
<label>
<input type="checkbox" checked={corrected} notallow={toggleCorrected} />
Corrected
</label>
</div>
<div id="wrapper" style={{ justifyContent: 'center' }}>
<Motion toggled={toggled} corrected={corrected}>Hello!</Motion>
</div>
</div>
)
}

Motion.js

const changed = (initialBox, finalBox) => {
// we just mounted, so we don't have complete data yet
if (!initialBox || !finalBox) return false;

// deep compare the two boxes
return JSON.stringify(initialBox) !== JSON.stringify(finalBox);
}

const invert = (el, from, to) => {
const { x: fromX, y: fromY, width: fromWidth, height: fromHeight } = from;
const { x, y, width, height } = to;

const transform = {
x: x - fromX - (fromWidth - width) / 2,
y: y - fromY - (fromHeight - height) / 2,
scaleX: width / fromWidth,
scaleY: height / fromHeight,
};

el.style.transform = `translate(${transform.x}px, ${transform.y}px) scaleX(${transform.scaleX}) scaleY(${transform.scaleY})`;

return transform;
}

其實不是這樣的?

在這種情況下,使比例校正工作的方式是通過將子元素包裹在<div>?中,并將比例校正應用于<div>中,這會有一些問題:

一個運動組件在DOM中有兩個元素,從用戶體驗的角度來看,這可能是個問題

所有子組件都進行了比例校正,不可能一個子組件被校正而另一個子組件不被校正

如果子組件也在做動畫,可能會有問題--我沒有測試過,但我認為比例校正會導致問題,因為我們扭曲了子組件的坐標空間

Framer Motion 的做法有點不同,我們必須讓子組件成為布局組件來選擇加入比例校正。

<motion.article layout>
<motion.h1 layout>Hello!</motion.h1> <-- is scale corrected
<p>World!</p> <-- is not scale corrected
</motion.article>

這個API意味著子組件需要能夠 "鉤住 "父組件的動畫,這讓實現變得更加復雜。

我選擇不以這種方式實現,因為我不想脫離核心的比例校正概念。如果你有興趣,可以看看 Framer Motion源代碼,他們使用一種叫做 "投影節點( "projection nodes")"的東西來維護自己的類似DOM的運動組件樹。

今天的內容就到這里,感謝大家的閱讀。

來源:https://www.nan.fyi/magic-motion

責任編輯:武曉燕 來源: 大遷世界
相關推薦

2019-12-13 16:19:15

戴爾

2024-05-11 07:56:07

編程語言Java字節碼

2021-06-07 09:31:50

HTML網頁布局CSS

2020-12-04 08:40:29

SVG動畫元素

2021-12-28 17:52:29

Android 動畫估值器

2020-10-09 08:15:11

JsBridge

2018-04-03 10:10:45

UPS后備式在線式

2023-11-28 08:29:31

Rust內存布局

2018-02-28 10:27:36

2021-05-12 16:09:18

Python分布式進程接口

2024-04-11 13:30:59

PythonProcess

2022-02-21 09:44:45

Git開源分布式

2021-06-30 00:20:12

Hangfire.NET平臺

2019-04-17 15:16:00

Sparkshuffle算法

2024-06-25 08:18:55

2023-05-12 08:19:12

Netty程序框架

2021-04-09 08:40:51

網絡保險網絡安全網絡風險

2021-01-28 08:55:48

Elasticsear數據庫數據存儲

2017-09-05 08:52:37

Git程序員命令

2012-12-25 10:14:48

英特爾智能數字標牌
點贊
收藏

51CTO技術棧公眾號

欧美aaaaa性bbbbb小妇| a在线观看视频| 日本道不卡免费一区| 3751色影院一区二区三区| 天堂а√在线中文在线 | 狠狠色狠狠色综合日日小说| 欧洲在线视频一区| av在线亚洲天堂| 久久精品导航| 欧美精品激情在线观看| 国产7777777| 国产一区丝袜| 6080国产精品一区二区| 久久人妻精品白浆国产| 任你弄在线视频免费观看| 国产日韩精品一区二区三区 | jizzjizz欧美69巨大| 日韩你懂的电影在线观看| 青青草精品视频在线观看| 欧美另类tv| 1000部国产精品成人观看| 久久久久久久久久码影片| jizz国产视频| 久久99日本精品| 国产精品99免视看9| 国产无遮挡免费视频| 亚洲字幕久久| 日韩一级裸体免费视频| 国产jk精品白丝av在线观看| 国偷自产av一区二区三区| 91精品综合久久久久久| 中文字幕第88页| 色豆豆成人网| 色综合天天综合| 大j8黑人w巨大888a片| 青青在线视频| 亚洲自拍偷拍欧美| 无码毛片aaa在线| 欧美成年黄网站色视频| 中文字幕影音在线| 99精品黄色片免费大全| 成人av免费看| 亚洲成人黄色片| 国产综合色在线| 成人精品久久久| 伊人网视频在线| 免费的成人av| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 欧美主播一区二区三区| 欧美日韩一区二区在线免费观看| yellow在线观看网址| 亚洲一区二区视频在线观看| 成人午夜免费在线视频| 国产精品蜜臀| 亚洲国产精品影院| 欧美一级片免费播放| 波多野结依一区| 亚洲国产日韩在线一区模特| 人妻少妇精品无码专区二区| rebdb初裸写真在线观看| 天天影视涩香欲综合网| 日韩人妻精品无码一区二区三区| 韩日毛片在线观看| 欧美性xxxxx极品娇小| 黄色高清无遮挡| ww久久综合久中文字幕| 欧美日韩成人一区| 999热精品视频| 成午夜精品一区二区三区软件| 精品久久久三级丝袜| 国产精品伦子伦| 国产精品亚洲二区| 中文字幕欧美日韩va免费视频| 国产稀缺精品盗摄盗拍| 欧美激情第10页| 亚洲3p在线观看| 好吊色在线视频| 麻豆成人av在线| 成人免费视频视频在| 三区在线观看| 中文字幕一区二区三区精华液| 精品一区二区三区毛片| 青春草视频在线观看| 伊人www22综合色| 精品人伦一区二区三区蜜桃网站 | 男人的天堂久久精品| 国产视频福利一区| 欧美 日韩 国产 精品| 久久美女艺术照精彩视频福利播放| 日韩在线三区| av片在线观看网站| 欧美性猛交xxxx乱大交3| 91小视频网站| 成人看片黄a免费看视频| 亚洲日本欧美日韩高观看| 四虎地址8848| 一区二区三区成人精品| 91精品国产自产在线老师啪| 国产小视频一区| 国产精品网曝门| 久久综合色视频| 外国成人毛片| 日韩精品极品视频免费观看| 国产午夜精品理论片在线| 亚洲精品极品| 91中文字幕在线观看| 瑟瑟在线观看| 一区二区三区欧美日韩| 精品久久久久久无码国产| 一区二区网站| 色七七影院综合| 中文字幕亚洲高清| 国产精品123区| 一区二区视频国产| 中文字幕资源网在线观看免费 | 亚洲一区中文字幕在线观看| 飘雪影院手机免费高清版在线观看| 亚洲视频在线观看一区| 中文久久久久久| 全球av集中精品导航福利| 欧美理论电影在线播放| 亚洲午夜激情视频| 国产喷白浆一区二区三区| 精品少妇人妻av免费久久洗澡| 色成人综合网| 尤物九九久久国产精品的分类| 日韩免费一级片| 国产盗摄一区二区三区| 天堂v在线视频| 岛国一区二区| 永久免费看mv网站入口亚洲| 日本免费在线观看视频| av电影天堂一区二区在线观看| 欧美另类videos| 99tv成人影院| 久久国产一区二区三区| 中文字幕在线日亚洲9| 国产无一区二区| 欧美成人黑人猛交| 伊人久久大香线蕉综合网站| 91精品国产91久久| 日韩中文字幕观看| 亚洲国产精品久久人人爱| 精品人妻一区二区免费| 午夜久久黄色| 国产高清不卡av| 超碰在线97国产| 精品欧美一区二区在线观看| 九九热精品免费视频| 国产精品羞羞答答xxdd| 久久av高潮av| 久久久久影视| 91成人性视频| 欧洲一区av| 欧美性欧美巨大黑白大战| 懂色av蜜桃av| 久久福利资源站| 中文字幕超清在线免费观看| 久久久久毛片免费观看| 九九热精品在线| 丰满肉嫩西川结衣av| 亚洲成a人v欧美综合天堂下载| 怡红院一区二区| 亚洲一区国产| 日韩精品久久一区二区三区| 日本黄色免费在线| 国产一区二区三区中文| 国产又黄又猛又爽| 亚洲精品成人少妇| 中国极品少妇videossexhd| 亚洲永久免费| 亚洲精蜜桃久在线| 国产美女视频一区二区| 性欧美xxxx视频在线观看| 国产在线自天天| 在线综合视频播放| 日韩av一区二区在线播放| 国产亚洲成aⅴ人片在线观看 | 国产成人免费视频精品含羞草妖精 | 成人美女免费网站视频| 91一区二区三区在线| 亚洲精品成人网| 国产性生活视频| 亚洲视频每日更新| 玖玖爱在线精品视频| 蜜桃视频第一区免费观看| 麻豆传媒网站在线观看| 久久资源综合| 国产免费久久av| av福利在线导航| 中文字幕在线观看亚洲| 高清毛片aaaaaaaaa片| 色婷婷激情综合| 97在线观看免费高| 91蝌蚪国产九色| 99热这里只有精品2| 先锋亚洲精品| 国产专区在线视频| 欧美日韩国产一区二区三区不卡| 91精品久久香蕉国产线看观看| 欧美一级鲁丝片| 久久久成人精品视频| 五月婷在线视频| 91麻豆精品国产综合久久久久久| 亚洲第一精品在线观看| 一区二区三区在线视频免费| 精品人妻中文无码av在线| 国产不卡在线一区| 在线观看免费的av| 蘑菇福利视频一区播放| 免费看毛片的网址| 99久久夜色精品国产亚洲96| 欧洲成人一区二区| 成人性生交大片免费看中文视频| 国产日韩精品一区二区| 欧美成人影院| 国内伊人久久久久久网站视频| 97超碰国产一区二区三区| 亚洲精品一区二区三区蜜桃下载 | 蜜臀av一区二区在线观看| 亚洲熟妇国产熟妇肥婆| 国产精品jizz在线观看美国| 在线视频不卡国产| 欧美精品一区二区三区精品| 蜜桃传媒视频麻豆一区| 国产精品高潮呻吟久久久久| 91视频99| 欧美大片91| 91免费看片网站| 中文成人在线| 国产人妖伪娘一区91| 四虎4545www精品视频| 欧美综合激情网| 婷婷电影在线观看| 91chinesevideo永久地址| 波多野结衣久久| 97国产在线视频| gogo高清午夜人体在线| 欧美日韩国产va另类| a视频在线免费看| 久久视频在线看| 爆操欧美美女| 久久的精品视频| a篇片在线观看网站| 欧美国产日本高清在线 | 欧洲美女7788成人免费视频| 不卡专区在线| 2019av中文字幕| 日日av拍夜夜添久久免费| 热久久免费视频精品| 电影亚洲精品噜噜在线观看| 国产激情综合五月久久| 91精品国产66| 成人在线中文字幕| 激情不卡一区二区三区视频在线| 亚洲在线免费观看| 成人h动漫免费观看网站| 国产综合18久久久久久| 亚洲美女15p| 日韩在线三级| 久久精品青草| 国产aaa免费视频| 国产精品乱看| 爱情岛论坛vip永久入口| 久久99精品网久久| avtt中文字幕| 久久一区二区视频| 国产午夜精品理论片在线| 一二三区精品福利视频| 日韩欧美成人一区二区三区| 色婷婷久久一区二区三区麻豆| 夜夜骚av一区二区三区| 欧美一级欧美三级在线观看| 欧美熟妇交换久久久久久分类| 日韩黄色高清视频| youjizz在线播放| 欧美老女人在线视频| 末成年女av片一区二区下载| 国产精品国内视频| 试看120秒一区二区三区| 精品一区二区日本| 欧美第十八页| 男人天堂av片| 日产欧产美韩系列久久99| 无码人妻一区二区三区在线视频| aaa国产一区| 91香蕉视频污在线观看| 五月婷婷另类国产| 91九色蝌蚪91por成人| 精品国产成人系列| 岛国在线大片| 久久久久久成人精品| 666av成人影院在线观看| 99re在线播放| 欧美手机在线| 国产二区视频在线| 精品伊人久久久久7777人| 黄色性生活一级片| 亚洲免费在线视频一区 二区| 日韩精品1区2区| 欧美顶级少妇做爰| 福利在线播放| 久久久久久伊人| 色综合一区二区日本韩国亚洲 | 头脑特工队2免费完整版在线观看| 中文字幕欧美国内| 亚洲国产欧美日本视频| 亚洲一区二区三区777| 精品视频99| 日本午夜激情视频| 国产精品一区二区在线观看网站| www.黄色在线| 精品女厕一区二区三区| 亚洲免费国产视频| 久久夜色精品亚洲噜噜国产mv | av片在线观看免费| 国产欧美精品va在线观看| 沈樵精品国产成av片| av网站手机在线观看| 国产精品自拍网站| 国产精品1区2区3区4区| 一本大道久久a久久精二百| 日本美女一级视频| 欧美激情亚洲视频| 粉嫩av国产一区二区三区| 亚洲欧洲一区二区福利| 三级不卡在线观看| 美女又爽又黄视频毛茸茸| 亚洲一区在线观看视频| 国产精品色综合| 自拍偷拍亚洲精品| 亚洲www啪成人一区二区| 欧美日韩国产一二| 免费日韩av片| www.色多多| 日韩欧美精品在线观看| 午夜国产在线视频| 51午夜精品视频| 天天躁日日躁狠狠躁欧美巨大小说 | 超碰在线网站| 国产91亚洲精品一区二区三区| 亚洲男女av一区二区| 午夜不卡福利视频| 亚洲天堂免费在线观看视频| 97超碰人人草| 久久天天躁狠狠躁老女人| 成人av在线播放| 久久综合亚洲精品| 成人av高清在线| 五月天综合激情| 亚洲人成免费电影| 黄色精品视频| 曰韩不卡视频| 国产精品一区二区你懂的| 久久久一二三区| 亚洲国产另类 国产精品国产免费| 好看的中文字幕在线播放| 国产偷久久久精品专区| 亚洲中字在线| 欧美午夜激情影院| 欧美日韩国产欧美日美国产精品| 九七久久人人| 国产精品免费一区二区三区| 亚洲影院免费| 特黄一区二区三区| 日韩一区二区三区在线观看| www.超碰在线| 日韩精品福利视频| 国产东北露脸精品视频| 日本视频免费在线| 亚洲色图综合网| 四虎地址8848精品| h无码动漫在线观看| 北条麻妃国产九九精品视频| 国产日产精品一区二区三区| 国产麻豆午夜三级精品| 成人性教育视频在线观看| 欧美国产美女| 国产精品熟妇一区二区三区四区| 天天综合日日夜夜精品| av影片在线看| 91免费看网站| 亚洲欧美日韩国产一区二区| 欧美成人另类视频| 欧美成人精品1314www| 男人最爱成人网| wwwwww欧美| 欧美国产一区二区| 亚洲av永久无码国产精品久久| 茄子视频成人在线| 91精品天堂福利在线观看| 亚洲中文字幕无码av| 欧美一区二区三区系列电影| 亚洲天堂资源| 久久亚洲a v| 国产片一区二区| 色窝窝无码一区二区三区成人网站 | 区一区二区三区中文字幕| 国产一区二区在线视频| 天天干天天操天天操|