iview Modal Draggable 實現模態窗移動端拖拽(不影響Modal點擊事件)


<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>iview Modal模態窗 移動端拖拽(不影響Modal點擊事件)</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <link rel="stylesheet" type="text/css" href="http://unpkg.com/view-design/dist/styles/iview.css">
    <script type="text/javascript" src="https://cdn.bootcdn.net/ajax/libs/vue/2.6.12/vue.min.js"></script>
    <script type="text/javascript" src="http://unpkg.com/view-design/dist/iview.min.js"></script>
</head>

<body>
    <div id="app">
        <Modal v-model="visible1" title="測試窗口1" draggable>測試窗口1</Modal>
        <Modal v-model="visible2" title="測試窗口2" draggable>測試窗口2</Modal>
    </div>
    <script>
        new Vue({
            el: '#app',
            data: {
                visible1: true,
                visible2: true
            },
            mounted() {
                let _this = this;
                // 使用$nextTick保證捕獲到dom元素(指".ivu-modal-content")
                this.$nextTick(() => {
                    let modalContentList = document.querySelectorAll('.ivu-modal-content');
                    for (let i = 0; i < modalContentList.length; i++) {
                        _this.addDraggable(modalContentList[i]);
                    }
                })
            },
            methods: {
                // 接收Dom元素並為此元素添加移動端touch觸摸事件,以此實現拖拽功能
                addDraggable(divEl) {
                    let currL, currT;
                    divEl.addEventListener('touchstart', function (e) {
                        let ev = e || window.event;
                        let touch = ev.targetTouches[0];
                        currL = touch.clientX - divEl.offsetLeft;
                        currT = touch.clientY - divEl.offsetTop;
                        document.addEventListener("touchmove", defaultEvent, false);
                    })
                    divEl.addEventListener('touchmove', function (e) {
                        let ev = e || window.event;
                        let touch = ev.targetTouches[0];
                        divEl.style.left = `${touch.clientX - currL}px`;
                        divEl.style.top = `${touch.clientY - currT}px`;
                    })
                    divEl.addEventListener('touchend', function () {
                        document.removeEventListener("touchmove", defaultEvent);
                    })
                    function defaultEvent(e) {
                        // e.preventDefault();
                    }
                }
            }
        })
    </script>
</body>

</html>

 

最終效果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM