久久伊人一区二区三区四区-久久伊人影视-久久伊人影院-久久伊人中文字幕-亚洲成在人色婷婷-亚洲大成色www永久网

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > 如何實現拖拽排序

如何實現拖拽排序

來源:千鋒教育
發布人:wjy
時間: 2022-06-02 13:54:00 1654149240

可拖拽排序的菜單效果大家想必都很熟悉,本次我們通過一個可拖拽排序的九宮格案例來演示其實現原理。 

如何實現拖拽排序

## 實現原理概述

**拖拽原理**

- 當鼠標在【可拖拽小方塊】(以下簡稱磚頭)身上按下時,開始監聽鼠標移動事件
- 鼠標事件移動到什么位置,磚頭就跟到什么位置
- 鼠標抬起時,取消鼠標移動事件的監聽

**排序原理**

- 提前定義好9大坑位的位置(相對外層盒子的left和top)
- 將9大磚頭丟入一個數組,以便后期通過splice方法隨意安插和更改磚頭的位置
- 當拖動某塊磚頭時,先將其從數組中移除(剩余的磚頭在邏輯上重新排序)
- 拖動結束時,將該磚頭重新插回數組的目標位置(此時實現數據上的重排)
- 數組中的9塊磚頭根據新的序號,對號入座到9大坑位,完成重新渲染

## 代碼實現

**頁面布局**

9塊磚頭(li元素)相對于外層盒子(ul元素)做絕對定位

```html
<ul id="box">
        <li style="background-color:black;top: 10px; left: 10px">1</li>
        <li style="background-color:black;top: 10px; left: 220px">2</li>
        <li style="background-color:black;top: 10px; left: 430px">3</li>
        <li style="background-color:black;top: 220px; left: 10px">4</li>
        <li style="background-color:black;top: 220px; left: 220px">5</li>
        <li style="background-color:black;top: 220px; left: 430px">6</li>
        <li style="background-color:black;top: 430px; left: 10px">7</li>
        <li style="background-color:black;top: 430px; left: 220px">8</li>
        <li style="background-color:black;top: 430px; left: 430px">9</li>
    </ul>
```

樣式如下

```css
<style>
        * {
            margin: 0;
            padding: 0;
        }

        html,
        body {
            width: 100%;
            height: 100%;
        }

        ul,
        li {
            list-style: none;
        }

        ul {
            width: 640px;
            height: 640px;
            border: 10px solid pink;
            border-radius: 10px;
            margin: 50px auto;
            position: relative;
        }

        li {
            width: 200px;
            height: 200px;
            border-radius: 10px;
            display: flex;
            justify-content: center;
            align-items: center;
            color: white;
            font-size: 100px;
            position: absolute;
        }
    </style>
```

**定義磚頭的背景色和9大坑位位置**

```js
// 定義9大li的預設背景色
    var colorArr = [
        "red",
        "orange",
        "yellow",
        "green",
        "blue",
        "cyan",
        "purple",
        "pink",
        "gray",
    ];

    /* 定義9大坑位 */
    const positions = [
        [10, 10], [220, 10], [430, 10],
        [10, 220], [220, 220], [430, 220],
        [10, 430], [220, 430], [430, 430],
    ]
```

**找出磚頭并丟入一個數組**

```js
var ulBox = document.querySelector("#box")
    var lis = document.querySelectorAll("#box>li")
    /* 將lis轉化為真數組 */
    lis = toArray(lis)
```

這里我使用了一個將NodeList偽數組轉化為真數組的輪子:

```js
/* 偽數組轉真數組 pseudo array */
    function toArray(pArr){
        var arr = []
        for(var i=0;i<pArr.length;i++){
            arr.push(pArr[i])
        }
        return arr
    }
```

**給所有磚頭內置一個position屬性**

```js
/* 給每塊磚內置一個position屬性 */
    lis.forEach(
        (item, index) => item.setAttribute("position", index)
    )
```

**定義正在拖動的磚頭**

```js
/* 正在拖動的Li(磚頭) */
        var draggingLi = null;

        // 正在拖動的磚頭的zindex不斷加加,保持在最上層
        var maxZindex = 9
```

**在身上按下 誰就是【正在拖動的磚頭】**

```js
/* 在身上按下 誰就是【正在拖動的磚頭】 */
        lis.forEach(
            function (li, index) {
                li.style.backgroundColor = colorArr[index]

                /* li中的文字不可選(禁止selectstart事件的默認行為) */
                li.addEventListener(
                    "selectstart",
                    function (e) {
                        // 阻止掉拖選文本的默認行為
                        e.preventDefault()
                    }
                )

                /* 在任意li身上按下鼠標=我想拖動它 */
                li.addEventListener(
                    "mousedown",
                    function (e) {
                        draggingLi = this
                        draggingLi.style.zIndex = maxZindex++
                    }
                )
            }
        )
```

**在任意位置松開鼠標則停止拖拽**

```js
/* 在頁面的任意位置松開鼠標=不再拖拽任何對象 */
        document.addEventListener(
            "mouseup",
            function (e) {
                // 當前磚頭自己進入位置躺好
                const p = draggingLi.getAttribute("position") * 1
                // draggingLi.style.left = positions[p][0] + "px"
                // draggingLi.style.top = positions[p][1] + "px"
                move(
                    draggingLi,
                    {
                        left:positions[p][0] + "px",
                        top:positions[p][1] + "px"
                    },
                    200
                    // callback
                )

                // 正在拖拽的磚頭置空
                draggingLi = null;
            }
        )
```

當前磚頭從鼠標事件位置回歸其坑位時用到動畫效果,以下是動畫輪子

```js
/**
 * 多屬性動畫
 * @param {Element} element 要做動畫的元素
 * @param {Object} targetObj 屬性目標值的對象 封裝了所有要做動畫的屬性及其目標值
 * @param {number} timeCost 動畫耗時,單位毫秒
 * @param {Function} callback 動畫結束的回調函數
 */
const move = (element, targetObj, timeCost = 1000, callback) => {
    const frameTimeCost = 40;

    // 500.00px 提取單位的正則
    const regUnit = /[\d\.]+([a-z]*)/;

    // 計算動畫總幀數
    const totalFrames = Math.round(timeCost / frameTimeCost);

    // 動態數一數當前動畫到了第幾幀
    let frameCount = 0;

    /* 查詢特定屬性的速度(湯鵬飛的辣雞) */
    // const getAttrSpeed = (attr) => (parseFloat(targetObj[attr]) - parseFloat(getComputedStyle(element)[attr]))/totalFrames

    // 存儲各個屬性的初始值和動畫速度
    const ssObj = {};

    /* 遍歷targetObj的所有屬性 */
    for (let attr in targetObj) {
        // 拿到元素屬性的初始值
        const attrStart = parseFloat(getComputedStyle(element)[attr]);

        // 動畫速度 = (目標值 - 當前值)/幀數
        const attrSpeed =
            (parseFloat(targetObj[attr]) - attrStart) / totalFrames;

        // 將【屬性初始值】和【屬性幀速度】存在obj中 以后obj[left]同時拿到這兩個貨
        // obj{ left:[0px初始值,50px每幀] }
        ssObj[attr] = [attrStart, attrSpeed];
    }

    /* 開始動畫 */
    const timer = setInterval(
        () => {
            // element.style.left = parseFloat(getComputedStyle(element).left)+"px"
            // element.style.top = parseFloat(getComputedStyle(element).top)+"px"
            // element.style.opacity = getComputedStyle(element).opacity

            // 幀數+1
            frameCount++;

            /* 每個屬性的值都+=動畫速度 */
            for (let attr in targetObj) {
                // console.log(attr, ssObj[attr], totalFrames, frameCount);

                // 用正則分離出單位
                // console.log(regUnit.exec("500px"));
                // console.log(regUnit.exec(0));
                const unit = regUnit.exec(targetObj[attr])[1];

                // 計算出當前幀應該去到的屬性值
                const thisFrameValue =
                    ssObj[attr][0] + frameCount * ssObj[attr][1];

                // 將元素的屬性掰到當前幀應該去到的目標值
                element.style[attr] = thisFrameValue + unit;
            }

            /* 當前幀 多個屬性動畫完成 判斷是否應該終止動畫  */
            if (frameCount >= totalFrames) {
                // console.log(frameCount, totalFrames);
                clearInterval(timer);

                /* 強制矯正(反正用戶又看不出來 V) */
                // for (let attr in targetObj) {
                //     element.style[attr] = targetObj[attr];
                //     console.log(attr, getComputedStyle(element)[attr]);
                // }

                // 如果有callback就調用callback
                // if(callback){
                //     callback()
                // }
                callback && callback();
            }
        },

        frameTimeCost
    );

    /* 動畫結束后再過一幀 執行暴力校正 */
    setTimeout(() => {
        /* 強制矯正(反正用戶又看不出來 V) */
        for (let attr in targetObj) {
            element.style[attr] = targetObj[attr];
            // console.log(attr, getComputedStyle(element)[attr]);
        }
    }, timeCost + frameTimeCost);

    // 返回正在運行的定時器
    return timer;
};
```

**移動鼠標時 磚頭跟隨 所有磚頭實時洗牌**

```js
/* 在ul內移動鼠標 draggingLi跟隨鼠標 */
        ulBox.addEventListener(
            "mousemove",
            function (e) {
                /* 如果draggingLi為空 什么也不做 直接返回 */
                if (draggingLi === null) {
                    return
                }

                // 拿到事件相對于ulBox的位置  
                var offsetX = e.pageX - ulBox.offsetLeft - 100
                var offsetY = e.pageY - ulBox.offsetTop - 100

                /* 校正磚頭的偏移量 */
                offsetX = offsetX < 10 ? 10 : offsetX
                offsetY = offsetY < 10 ? 10 : offsetY
                offsetX = offsetX > 430 ? 430 : offsetX
                offsetY = offsetY > 430 ? 430 : offsetY

                // 將該位置設置給draggingLi
                draggingLi.style.left = offsetX + "px"
                draggingLi.style.top = offsetY + "px"

                /* 實時檢測實時【坑位】 */
                const newPosition = checkPosition([offsetX, offsetY]);

                // 如果當前磚頭的position發生變化 則數據重排
                const oldPosition = draggingLi.getAttribute("position") * 1
                if (newPosition != -1 && newPosition != oldPosition) {
                    console.log(oldPosition, newPosition);

                    /* 數據重排 */
                    // 先將當前磚頭拽出數組(剩余的磚頭位置自動重排)
                    lis.splice(oldPosition, 1)
                    // 再將當前磚頭插回newPosition
                    lis.splice(newPosition, 0, draggingLi)

                    // 打印新數據
                    // logArr(lis,"innerText")

                    // 磚頭洗牌
                    shuffle()
                }

            }
        )
```

**坑位檢測方法**

```js
/* 實時檢測坑位:檢測ep與9大坑位的距離是否小于100 */
        const checkPosition = (ep) => {
            for (let i = 0; i < positions.length; i++) {
                const [x, y] = positions[i]//[10,10]
                const [ex, ey] = ep//[offsetX,offsetY]

                const distance = Math.sqrt(Math.pow(x - ex, 2) + Math.pow(y - ey, 2))
                if (distance < 100) {
                    return i
                }
            }

            // 沒有進入任何坑位
            return -1
        }
```

**磚頭洗牌方法**

```js
/* 磚頭洗牌:lis中的每塊磚去到對應的位置 */
        const shuffle = () => {
            for (var i = 0; i < lis.length; i++) {
                lis[i].style.left = positions[i][0] + "px"
                lis[i].style.top = positions[i][1] + "px"

                // 更新自己的位置
                lis[i].setAttribute("position", i)
            }
        }
```

## 完整代碼實現

**主程序**

```js
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>九宮格拖拽排序</title>

    <style>
        * {
            margin: 0;
            padding: 0;
        }

        html,
        body {
            width: 100%;
            height: 100%;
        }

        ul,
        li {
            list-style: none;
        }

        ul {
            width: 640px;
            height: 640px;
            border: 10px solid pink;
            border-radius: 10px;
            margin: 50px auto;
            position: relative;
        }

        li {
            width: 200px;
            height: 200px;
            border-radius: 10px;
            display: flex;
            justify-content: center;
            align-items: center;
            color: white;
            font-size: 100px;
            position: absolute;
        }
    </style>
</head>

<body>
    <ul id="box">
        <li style="background-color:black;top: 10px; left: 10px">1</li>
        <li style="background-color:black;top: 10px; left: 220px">2</li>
        <li style="background-color:black;top: 10px; left: 430px">3</li>
        <li style="background-color:black;top: 220px; left: 10px">4</li>
        <li style="background-color:black;top: 220px; left: 220px">5</li>
        <li style="background-color:black;top: 220px; left: 430px">6</li>
        <li style="background-color:black;top: 430px; left: 10px">7</li>
        <li style="background-color:black;top: 430px; left: 220px">8</li>
        <li style="background-color:black;top: 430px; left: 430px">9</li>
    </ul>

    <!--
    position 位置
     -->
    <script src="../../../tools/arr_obj_tool.js"></script>
    <script src="../../../tools/animtool.js"></script>

    <script>
        // 定義9大li的預設背景色
        var colorArr = [
            "red",
            "orange",
            "yellow",
            "green",
            "blue",
            "cyan",
            "purple",
            "pink",
            "gray",
        ];

        /* 定義9大坑位 */
        const positions = [
            [10, 10], [220, 10], [430, 10],
            [10, 220], [220, 220], [430, 220],
            [10, 430], [220, 430], [430, 430],
        ]

        var ulBox = document.querySelector("#box")
        var lis = document.querySelectorAll("#box>li")
        /* 將lis轉化為真數組 */
        lis = toArray(lis)

        /* 給每塊磚內置一個position屬性 */
        lis.forEach(
            (item, index) => item.setAttribute("position", index)
        )

        /* 正在拖動的Li(磚頭) */
        var draggingLi = null;

        // 正在拖動的磚頭的zindex不斷加加,保持在最上層
        var maxZindex = 9

        /* 在身上按下 誰就是【正在拖動的磚頭】 */
        lis.forEach(
            function (li, index) {
                li.style.backgroundColor = colorArr[index]

                /* li中的文字不可選(禁止selectstart事件的默認行為) */
                li.addEventListener(
                    "selectstart",
                    function (e) {
                        // 阻止掉拖選文本的默認行為
                        e.preventDefault()
                    }
                )

                /* 在任意li身上按下鼠標=我想拖動它 */
                li.addEventListener(
                    "mousedown",
                    function (e) {
                        draggingLi = this
                        draggingLi.style.zIndex = maxZindex++
                    }
                )
            }
        )

        /* 在頁面的任意位置松開鼠標=不再拖拽任何對象 */
        document.addEventListener(
            "mouseup",
            function (e) {
                // 當前磚頭自己進入位置躺好
                const p = draggingLi.getAttribute("position") * 1
                // draggingLi.style.left = positions[p][0] + "px"
                // draggingLi.style.top = positions[p][1] + "px"
                move(
                    draggingLi,
                    {
                        left: positions[p][0] + "px",
                        top: positions[p][1] + "px"
                    },
                    200
                    // callback
                )

                // 正在拖拽的磚頭置空
                draggingLi = null;
            }
        )

        /* 在ul內移動鼠標 draggingLi跟隨鼠標 */
        ulBox.addEventListener(
            "mousemove",
            function (e) {
                /* 如果draggingLi為空 什么也不做 直接返回 */
                if (draggingLi === null) {
                    return
                }

                // 拿到事件相對于ulBox的位置  
                var offsetX = e.pageX - ulBox.offsetLeft - 100
                var offsetY = e.pageY - ulBox.offsetTop - 100

                /* 校正磚頭的偏移量 */
                offsetX = offsetX < 10 ? 10 : offsetX
                offsetY = offsetY < 10 ? 10 : offsetY
                offsetX = offsetX > 430 ? 430 : offsetX
                offsetY = offsetY > 430 ? 430 : offsetY

                // 將該位置設置給draggingLi
                draggingLi.style.left = offsetX + "px"
                draggingLi.style.top = offsetY + "px"

                /* 實時檢測實時【坑位】 */
                const newPosition = checkPosition([offsetX, offsetY]);

                // 如果當前磚頭的position發生變化 則數據重排
                const oldPosition = draggingLi.getAttribute("position") * 1
                if (newPosition != -1 && newPosition != oldPosition) {
                    console.log(oldPosition, newPosition);

                    /* 數據重排 */
                    // 先將當前磚頭拽出數組(剩余的磚頭位置自動重排)
                    lis.splice(oldPosition, 1)
                    // 再將當前磚頭插回newPosition
                    lis.splice(newPosition, 0, draggingLi)

                    // 打印新數據
                    // logArr(lis,"innerText")

                    // 磚頭洗牌
                    shuffle()
                }

            }
        )

        /* 實時檢測坑位:檢測ep與9大坑位的距離是否小于100 */
        const checkPosition = (ep) => {
            for (let i = 0; i < positions.length; i++) {
                const [x, y] = positions[i]//[10,10]
                const [ex, ey] = ep//[offsetX,offsetY]

                const distance = Math.sqrt(Math.pow(x - ex, 2) + Math.pow(y - ey, 2))
                if (distance < 100) {
                    return i
                }
            }

            // 沒有進入任何坑位
            return -1
        }

        /* 磚頭洗牌:lis中的每塊磚去到對應的位置 */
        const shuffle = () => {
            for (var i = 0; i < lis.length; i++) {
                lis[i].style.left = positions[i][0] + "px"
                lis[i].style.top = positions[i][1] + "px"

                // 更新自己的位置
                lis[i].setAttribute("position", i)
            }
        }

    </script>
</body>

</html>
```

**動畫輪子**

```js
function moveWithTransition(element, targetObj, duration) {
    element.style.transition = `all ${duration / 1000 + "s"} linear`;
    for (var attr in targetObj) {
        element.style[attr] = targetObj[attr];
    }
    setTimeout(() => {
        element.style.transition = "none";
    }, duration);
}

/**
 * 多屬性動畫
 * @param {Element} element 要做動畫的元素
 * @param {Object} targetObj 屬性目標值的對象 封裝了所有要做動畫的屬性及其目標值
 * @param {number} timeCost 動畫耗時,單位毫秒
 * @param {Function} callback 動畫結束的回調函數
 */
const move = (element, targetObj, timeCost = 1000, callback) => {
    const frameTimeCost = 40;

    // 500.00px 提取單位的正則
    const regUnit = /[\d\.]+([a-z]*)/;

    // 計算動畫總幀數
    const totalFrames = Math.round(timeCost / frameTimeCost);

    // 動態數一數當前動畫到了第幾幀
    let frameCount = 0;

    /* 查詢特定屬性的速度(湯鵬飛的辣雞) */
    // const getAttrSpeed = (attr) => (parseFloat(targetObj[attr]) - parseFloat(getComputedStyle(element)[attr]))/totalFrames

    // 存儲各個屬性的初始值和動畫速度
    const ssObj = {};

    /* 遍歷targetObj的所有屬性 */
    for (let attr in targetObj) {
        // 拿到元素屬性的初始值
        const attrStart = parseFloat(getComputedStyle(element)[attr]);

        // 動畫速度 = (目標值 - 當前值)/幀數
        const attrSpeed =
            (parseFloat(targetObj[attr]) - attrStart) / totalFrames;

        // 將【屬性初始值】和【屬性幀速度】存在obj中 以后obj[left]同時拿到這兩個貨
        // obj{ left:[0px初始值,50px每幀] }
        ssObj[attr] = [attrStart, attrSpeed];
    }

    /* 開始動畫 */
    const timer = setInterval(
        () => {
            // element.style.left = parseFloat(getComputedStyle(element).left)+"px"
            // element.style.top = parseFloat(getComputedStyle(element).top)+"px"
            // element.style.opacity = getComputedStyle(element).opacity

            // 幀數+1
            frameCount++;

            /* 每個屬性的值都+=動畫速度 */
            for (let attr in targetObj) {
                // console.log(attr, ssObj[attr], totalFrames, frameCount);

                // 用正則分離出單位
                // console.log(regUnit.exec("500px"));
                // console.log(regUnit.exec(0));
                const unit = regUnit.exec(targetObj[attr])[1];

                // 計算出當前幀應該去到的屬性值
                const thisFrameValue =
                    ssObj[attr][0] + frameCount * ssObj[attr][1];

                // 將元素的屬性掰到當前幀應該去到的目標值
                element.style[attr] = thisFrameValue + unit;
            }

            /* 當前幀 多個屬性動畫完成 判斷是否應該終止動畫  */
            if (frameCount >= totalFrames) {
                // console.log(frameCount, totalFrames);
                clearInterval(timer);

                /* 強制矯正(反正用戶又看不出來 V) */
                // for (let attr in targetObj) {
                //     element.style[attr] = targetObj[attr];
                //     console.log(attr, getComputedStyle(element)[attr]);
                // }

                // 如果有callback就調用callback
                // if(callback){
                //     callback()
                // }
                callback && callback();
            }
        },

        frameTimeCost
    );

    /* 動畫結束后再過一幀 執行暴力校正 */
    setTimeout(() => {
        /* 強制矯正(反正用戶又看不出來 V) */
        for (let attr in targetObj) {
            element.style[attr] = targetObj[attr];
            // console.log(attr, getComputedStyle(element)[attr]);
        }
    }, timeCost + frameTimeCost);

    // 返回正在運行的定時器
    return timer;
};
```

**偽數組轉真數組輪子**

```js
/* 偽數組轉真數組 pseudo array */
function toArray(pArr){
    var arr = []
    for(var i=0;i<pArr.length;i++){
        arr.push(pArr[i])
    }
    return arr
}
```

這里大家也可以簡單地

```js
const arr = [...pArr]
```

祝大家擼碼愉快,身心健康!更多關于“web前端培訓”的問題,歡迎咨詢千鋒教育在線名師。千鋒已有十余年的培訓經驗,課程大綱更科學更專業,有針對零基礎的就業班,有針對想提升技術的提升班,高品質課程助理你實現夢想。

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
主站蜘蛛池模板: 内射少妇骚B一√| 有人有在线观看的片资源| 久久不见久久见免费视频3| 在线看片无码永久免费视频| 纯爱无遮挡H肉动漫| 国产V亚洲V天堂A无码久久蜜桃| 扒开双腿疯狂进出爽爽爽免费| 欧美综合天天夜夜久久| 亚洲丰满熟妇XXXX在线观看| 亚洲AV无码国产精品色午夜字幕| 男人扒开女人内裤强吻桶进去| 国内偷自第一区二区三区| 有人有在线观看的片吗WWW| 欧美 亚洲 国产 日韩 综AⅤ | 女主被强迫侵犯H文| 粉嫩av.一区二区三区免费| 偷拍区小说区图片区另类呻吟| 国产精品免费AV片在线观看| 狠狠色综合久久久久尤物| 日本欧美大码A在线观看| 国产精品无码一区二区三区免费| 久久人妻无码一区二区三区AV| 天美传媒MV免费观看完整| 公粗挺进了我的密道在线观看| 久久久久久精品国产亚洲AV麻豆| 色欲AV永久无码精品无码蜜桃 | 一线产区与二线产区的定义| 精品无码成人片一区二区98| 黑人巨大进入白人美女视频| 国产AV天堂无码一区二区三区 | 挺进邻居丰满少妇的身体| 亚洲AV无码国产一区二区三区 | 天天爽夜夜爽人人爽QC| 民工把我奶头掏出来了怎么办| 欧美一区二区三放荡人妇| 激情伊人五月天久久综合| 国产午夜精华无码网站| 天堂AV无码一区二区三区| 女儿的朋友5中汉字晋通话| 国产亚洲欧洲AⅤ综合一区| 亚洲一线产区和二线产区的区别| 欧亚精品一区三区免费| 无码精品国产一区二区免费| 动漫人物插画动漫人物的视频| 亚洲AV无码国产在丝袜线观看| 国产精品一国产精品一K频道| 亚A∨国AV综AV涩涩涩| 国产精品白丝AV嫩草影院| 欧美孕妇XXXXBBBB| 女儿儿媳陪自己玩的心情说说| 日韩精品一区二区三区中文 | 国产免费观看久久黄AV片| 岳两腿之间白嫩的小缝| 国产精品无码无卡在线观看久 | 精品无人区一线二线三线区别| 日本熟妇厨房XXXXX乱| 亚洲AV成人综合五月天在线观看| 国模无码一区二区三区不卡| 私密按摩高潮熟女啪啪| 欧美、另类亚洲日本一区二区| 久久97超碰色中文字幕总站| 内射人妻视频国内| 国产精品扒开腿做爽爽爽日本无码 | 宝贝腿开大一点你真湿H| 国语第一次处破女| 在线看AV的网站| 女儿的朋友6中汉字| 东北往事之黑道风云20年第二部| 亚洲AV无码一区东京热久久 | 亚洲色WWW永久网站| 小SB是不是想被C了| 国产精品久久久久久TV| 少妇人妻偷人精品无码视频| 自慰无码一区二区三区| 久久久久99精品成人片| 无码少妇一区二区浪潮免费 | 高清一个人看WWW免费| 色欲AV永久无码精品无码蜜桃| 成 人 黄 色 网 站 在线观| 精品久久久久久无码人妻蜜桃| 欧美熟VIDEOS肥婆| 无码人妻久久久久一区二区三区91 | 又大又粗又爽A级毛片免费看| 抖抈短视频APP下载| 一女被两男吃奶玩乳尖| 在图书馆揉捏她的双乳| 欧美黑人一级爽快片婬片高清| 真人荫道口图片100张| 成人精品一区二区三区中文字幕| 白嫩少妇激情无码| 亚洲综合成人婷婷五月网址| 欧美乱强伦XXXXX高潮| 女刑警被两个黑人挺进| 激情伊人五月天久久综合| 嗯啊开小嫩苞HHH好深男男| 中文字幕人妻丝袜成熟乱| 亚洲乱妇老熟女爽到高潮的片 | 亚洲日韩欧洲无码A∨夜夜| 色综合精品无码一区二区三区| 后入内射国产一区二区| 无遮挡又爽又刺激的视频| 人人妻人人澡人人爽人人精直播| 国产免费看MV大片的软件| 人善交VIDEOS欧美3D| YSL千色T9T9T9| 国产高清在线A视频大全| 性欧美极品XXXX欧美一区二区| 美丽人妻在夫前被黑人| 亚洲AV无码专区国产乱码DVD| 国产精品无码一区二区三区免费| 玩弄少妇秘书人妻系列| 中国老太毛茸茸XXXXHD| 成人欧美激情亚洲日韩蜜臀| 国产公妇仑乱在线观看| 波多野结衣AV大全| 亚洲欧美另类在线观看| 玩弄JAPAN白嫩少妇HD小说| 亚洲AV永久无码区成人网站| 中国孕妇变态孕交XXXX| 永久免费观看美女裸体的网站| 国产成人亚洲综合无码99| 精品熟人妻一区二区三区四区不卡| 亚洲日本一本DVD高清| 国精产品一区一区三区有限在线| 久久精品午夜一区二区福利| 欧美性猛交一区二区| 韩国三级中文字幕HD| 国产成人精品久久一区二区三区| 成人无码A区在线观看视频| 岳女四人共侍一夫婷婷| 四虎免费影院1515WWW| 亚洲AV之男人的天堂| 成人毛片女人18女人免费| 粗大从后面狠狠贯穿H| 丰满的女房东6剧情| 成人精品一区二区久久久 | 大乱东京道一本热大交乱| 你的奶好大让老子摸摸的说说| 欧美人妻精品一区二区三区| 欧洲熟妇色XXXXⅩ欧洲老妇色| 粉嫩小泬久久久久久久久久小说| 丰满少妇AAAAAA爰片毛片| 亚洲2022国产成人精品无码区 | 无码口爆内射颜射后入| 婷婷丁香五月激情综合| 伊人久久精品无码麻豆一区| 久久精品国产久精国产思思| 丰满丝袜熟女HD| 欧美无砖专区一中文字| 成人美女黄网站18禁免费| 亚洲AV丰满熟妇在线播放| 黑人性狂欢在线播放| 国产精品午夜福利不卡| 人妻无奈被迫屈辱1-9| 天天做天天躁天天躁| 国产成人无码AV麻豆| 人妻被黑人与白人巨大中出| 无码H黄肉3D动漫在线观看 | 久久精品亚洲精品无码金尊| 三上悠亚被弄到痉挛惨叫AV| 日韩乱码人妻无码超清蜜桃 | 色偷偷人人澡久久超碰97| 中文字幕乱码人妻无码久久| 亚洲婷婷五月激情综合APP| 中国丰满熟妇XXXX| 少妇扒开毛茸茸的B自慰| 少妇人妻偷人精系列| 国产又色又爽又黄的网站在线 | 国产福利在线 | 传媒| 女的把腿张开男的往里面插| 国产成人亚洲综合无码99| 在线看片无码永久免费视频| 精品一区二区三区在线播放视频| 国产又色又刺激高潮视频| 十八禁无遮无拦视频免费| 女儿儿媳陪自己玩的心情说说| 成人性生交大片免费看中文| 亚洲AV无码一区二区二三区下载| 国产精品JIZZ视频| 香蕉免费一区二区三区| 张柏芝阿娇全套无删减1313| 综合无码精品人妻一区二区三区| 国产精品成人影院在线观看| 国产男女猛烈无遮挡免费视频网站| 一女被两男吃奶玩乳尖| 挽起裙子跨开双腿坐下去| 国产精品妇女一二三区| 精品久久久久久无码人妻蜜桃 | 最新国产精品亚洲 | 少妇被躁爽到高潮无码 | 亚洲AV永久无码一区| 成人欧美激情亚洲日韩蜜臀| 麻豆成人精品国产免费| 久久99精品免费一区二区| 成熟交BGMBGMBGM在线| 男人扒开女人的腿做爽爽视频| 国产在线视频一区二区三区| 国产精品亚洲综合色区韩国| 粉嫩大学生无套内射无码卡视频 | 国产精品无码一区二区三区在| 亚洲AV永久无码区成人网站| 久久精品亚洲男人的天堂| 欧洲免费无线码在线一区| 丰满妇女强高潮ⅩXXX| 国产寡妇XXXX猛交| 秋霞鲁丝片AⅤ无码入口| 免费AV片在线观看网址| 国产精品欧美久久久久无广告| 中国西西大胆女人裸体艺术| 日本护士HD人XXXX| 亚洲AV中文无码乱人伦在线播放| 亚洲AV午夜成人片精品| 国模无码一区二区三区不卡| 无套内谢孕妇毛片免费看| 丰满的少妇XXXXX人妻| 国产又色又刺激高潮视频| 亚洲AV无码一区二区三区国产| 国产精品亚洲第一区焦香味| 天天影视网色香欲综合网| 国产成人精品久久一区二区三区| 国产激情久久久久久熟女老人| 哈昂~哈昂够了太多了男男| 日本护士HD人XXXX| 狠狠色综合网久久久久久| 欧洲老人毛多BBWBBWBBW| 久久久久久精品免费不卡| 婷婷伊人久久大香线蕉AV| 无码毛片内射白浆视频| 成人无码区免费A∨视频| 国产精品白丝AV嫩草影院| 趁夫不在给给公侵犯了| 亚洲国产另类久久久精品| 车内挺进尤物少妇紧窄| 欧洲美熟女乱又伦免费视频| 一区二区狠狠色丁香久久婷婷| 日本人も中国人も汉字を| 欧美黑大粗无码免费视频| 国产男男GAY做受XXX| 高清FREESEXMOVIES性TV出水| 亚洲熟妇色自偷自拍另类| 日本亚洲欧美一区二区麻豆| 隔壁人妻被水电工征服| 区产品乱码芒果精品P站| 国产高清在线a视频大全| 人妻少妇精品视中文字幕国语| 久久夜色精品国产噜噜麻豆 | 制服在线无码专区| 男人扒开添女人下部免费视频| 国产成人无码AV麻豆| 日本乱熟人妻精品中文字幕| 热RE99久久精品国99热| 忘忧草社区在线影视| 差差差很疼视频30分钟无掩盖| 久久99精品久久久久子伦| 在线看AV片的网站| 真人荫道口图片100张| 宝贝小嫩嫩好紧好爽H在线视频| 人妻系列无码专区免费视频| 人妻少妇看A偷人无码精品视频| 羞羞汗汗YY歪歪漫画AV漫画| 无码人妻AV一区二区三区蜜臀 | 校长办公室岔开腿呻吟| 丰满大屁股熟女偷拍内射| 国产精品国产三级国产AⅤ| 城中村快餐嫖老妇对白| 国产精品无码一区二区三区在| らだ天堂√在线WWW| 张柏芝阿娇全套无删减1313| 日韩精品无码一本二本三本| 精品熟女少妇AⅤ免费久久| 国产美女丝袜一级肛交蜜桃| 成年无码AV片在线| 日韩AV无码成人网站| 国内精品久久久久精免费| 国产精品无码久久综合网| 久久亚洲熟妇熟女ⅩXXXHD| 久久久久女人精品毛片| 国产精品成人99一区无码| 人妻AV无码专区| 波多野结衣AV影音先锋| 欧美极品另类ⅤIDEOSDE| 小东西好几天没弄了还能吃吗| 精品亚洲国产成人AV在线小说| 一边摸一边抽搐一进一出视频| 全部免费A级毛片| 一本色道久久HEZYO无码| 一本色道久久HEZYO无码| 久久综合给合久久狠狠狠97色| 男生晚上睡不着想看B站| らだ天堂√在线中文WWW| 中文字幕亚洲欧美专区| 狠狠躁天天躁无码中文字幕图| 女人张开腿让男人桶爽的| 亚洲AV无码专区在线电影APP | 免费无码黄动漫在线观看| 高清拍拍拍无挡国产精品| 丰满少妇被猛烈进入无码| 隔壁人妻偷人BD中字| 国产成人涩涩涩视频在线观看| 青青青国产免A在线观看| 日韩一区二区三区精品| 国产又色又刺激高潮免费视频试看| 丰满的人妻HD高清日本| 肥胖BMGBMGBMG多毛图片| 国产韩国精品一区二区三区| 亚洲国产一区二区三区| 免费AV大片在线观看入口| 久久久久久精品免费不卡| 丰满大爆乳波霸奶| 粉嫩av一区二区精品爆乳| 日本XXXX色视频在线观看免费,| 脱色摇床THERMO网站| 清纯校花自慰呻吟流白浆| 国产精品SP调教打屁股| 国产精品JIZZ在线观看无码| 日本适合18岁以上的护肤品 | 久久精品第一国产久精国产宅男6| 亚洲AV成人中文无码专区| 拔萝卜日本视频在线观看免费| 毛很浓密超多黑毛| 国产成人无码18禁午夜福利网址| 欧美裸体XXXX| 区二区三区国产精华液区别大吗| 亚洲 熟 图片 小说 乱 妇 | 欧美人与禽ZOZZO| 在线精品自偷自拍无码中文| 粉嫩AV一二三区免费| 国产成人综合久久精品| 青春草无码精品视频在线观看| 国99久9在线 | 免费| 狠狠躁夜夜躁人人爽超碰97香蕉| 中文字幕人妻被公上司喝醉| 国产精品内射后入合集| 老阿姨哔哩哔哩B站肉片茄子芒果| 疯狂做受XXXX国产| 超碰97人人做人人爱可以下载| 精品日产A一卡2卡三卡4卡乱| 人人妻人人澡人人爽人人爱看| 人妻丰满熟妇AV无码区乱| 绯色AV一区二区三区蜜臀| 超清无码熟妇人妻AV在线电影| 色天使色偷偷色噜噜| 青草国产超碰人人添人人碱| 国产CHINASEX对白VID| 高清播放器欧美大片| 欧美黑人乱猛交xX 乂500| 日韩内射美女人妻一区二区三区| 亚洲精品无码成人| 国产精品9999久久久久| 亚洲AV无码一区二区三区网站| 中国在线观看免费国语版| 欧洲美女粗暴交视频| 在线日产精品一区| 天天AV天天爽无码中文| 丰满圆润大胸在线| 亚洲精品无码成人| 成人爽A毛片在线视频| 日韩精品一区二区三区影院| 国产精品丝袜高跟鞋| 国产免费看MV大片的软件| 高清FREESEXMOVIES性TV出水| 成年免费手机毛片免费看无码| 少妇丰满爆乳被呻吟进入| 人善交VIDEOS欧美3D| 久久中文字幕无码专区| 久久人妻无码一区二区三区AV| 国内精品乱码卡一卡2卡三卡新区 国内精品视频一区二区三区八戒 国内偷自第一区二区三区 | 久久九九兔免费精品6| 吸头AXYGEN日本| 无码少妇xxxx| 丰满的少妇愉情HD高清免费| 国产精品白浆无码流出视频| 成为人视频人的APP有哪些软件 | 欧美亚洲日韩国产区三| 亚洲爆乳无码一区二区三区| 亚洲AV无码国产一区二区三区| 少妇人妻无码精品视频APP| 国产精品V欧美精品∨日韩| 国产无遮挡又黄又爽免费吃瓜视频| 波多野结衣初尝黑人巨大| 无码日韩精品一区二区免费 | 老熟妇高潮一区二区三区网| 女人高潮特级毛片| 人妻少妇看A偷人无码精品视频| 日韩不卡手机视频在线观看| 人人妻人人澡人人爽人人DVD| 国产69久久精品成人看| 美女高潮20分钟视频在线观看| 中文人妻无码一区二区三区| 国产FREEXXXX性麻豆| 欧美乱强伦XXXXX高潮| 试看A级看一毛片二十分钟| 粉嫩AV一二三区免费| 国产精品久久久久久妇女| 国产97色在线 | 免| 哦┅┅快┅┅用力啊┅┅在线观看| 亲情会王芳高敏大团圆| 久久久久久久精品国产免费…| 黑人狂桶女人高潮嗷嗷叫小说| 色综合AV综合无码综合网站| 好男人无码内射AV| 看全色黄大色黄大片 视频| 亲子乱AⅤ一区二区三区| 色婷婷亚洲一区二区三区| 免费无码成人AV在线播| 毛片亚洲AV无码精品国产午夜| 幼儿HIPHOP仙踪林的| 久久精品熟女亚州AV麻豆| 天天做天天躁天天躁| 国产高清在线a视频大全|