美文网首页
实现在h5 | pc 动态插入元素实现拖拽

实现在h5 | pc 动态插入元素实现拖拽

作者: 码农私房菜 | 来源:发表于2023-05-16 14:55 被阅读0次
;(function() {
    const size = 25

// **************************************************************
    const dom = document.createElement('div')

    dom.innerHTML = 'R'

    dom.id = 'freedom_refresh_dom'

    const styles = `
        position: fixed;
        left: 0;
        top: 0;
        display: flex;
        justify-content: center;
        align-items: center;
        width: ${size}px;
        height: ${size}px;
        background: red;
        color: black;
        border-radius:50%;
        fontsize: 12px;
        z-index: 100000;
        opacity: 0.4;
    `

    dom.style = styles

    function createClick() {
        window.location.reload()
    }

    const parentDom = document.querySelector('html')

    parentDom.appendChild(dom)
// ***************************************************************

    let Xdirection = 1,
        Ydirection = 1,
        borderAll = size,
        moveX = 0,
        moveY = 0,
        xDifference = 0,
        yDifference = 0,
        oldX = null,
        oldY = null,
        el = document.querySelector('#freedom_refresh_dom'),
        // 判断环境 PC | Mobile
        ENV_TYPE_LOCAL = navigator.userAgent.includes('Mobile')

    // 获取屏幕宽|高
    const getWindowViewport = () => {
        var windowHeight = 0
        var windowWidth = 0
        if (document.compatMode === 'CSS1Compat') {
            windowHeight = document.documentElement.clientHeight
            windowWidth = document.documentElement.clientWidth
        } else {
            windowHeight = document.body.clientHeight
            windowWidth = document.body.clientWidth
        }
        return { windowWidth, windowHeight }
    }

    // 初始化获取一次
    const getWindowViewportVal = getWindowViewport()

    // 位置赋值方法
    const moveEle = (params) => {
        let { moveX = 0, moveY = 0 } = params
        if (!Xdirection) {
            moveX = 0
        }
        if (!Ydirection) {
            moveY = 0
        }
        if (!Xdirection && !Ydirection) {
            console.log(
                `%c 元素设置 (X轴==${moveX},Y轴==${moveY}) 不能移动!!!`,
                `background: red; color: #FFF; padding: 4px`
            )
        }
        if (el) {
            el.style.transform = `translate(${moveX}px, ${moveY}px )`
        }
    }

    const touchStart = (event) => {
        event.preventDefault()
        event.stopPropagation()

        // 手指按下时的手指所在的X,Y坐标
        const { clientX: pageX, clientY: pageY } = event.targetTouches?.[0] || event

        xDifference = parseInt(pageX, 10) - parseInt(moveX + '', 10)
        yDifference = parseInt(pageY, 10) - parseInt(moveY + '', 10)

        if (!ENV_TYPE_LOCAL) {
            dom.addEventListener('mousemove', touchMove)
        }
    }
    const touchEnd = (event) => {
        event.preventDefault()
        event.stopPropagation()

        if (!ENV_TYPE_LOCAL) {
            dom.removeEventListener('mousemove', touchMove)
        }

        // 判断事件是点击还是拖拽
        if (oldX === moveX && oldY === moveY) {
            createClick()
        }
        // 记录当前释放位置
        oldX = moveX
        oldY = moveY
    }

    const touchMove = (event) => {
        event.preventDefault()
        event.stopPropagation()
        if (el) {
            const { clientX: pageX, clientY: pageY } =
                event.targetTouches?.[0] || event
            window.console.log(`${pageX} ${pageY} ${xDifference} ${yDifference}`)
            moveX = pageX - xDifference
            moveY = pageY - yDifference

            if (pageX < 0) {
                moveX = 0
            }
            if (pageY < 0) {
                moveY = 0
            }

            if (getWindowViewportVal.windowWidth - borderAll < pageX) {
                moveX = getWindowViewportVal.windowWidth - borderAll
            }

            if (getWindowViewportVal.windowHeight - borderAll < pageY) {
                moveY = getWindowViewportVal.windowHeight - borderAll
            }

            // window.console.log(`${moveX} ${moveY}`)
              
            // 调用方法更新实时位置
            moveEle({ moveX, moveY })
        }
    }

    if (ENV_TYPE_LOCAL) {
        el.removeEventListener('touchmove', touchMove)
        el.removeEventListener('touchend', touchEnd)
        el.removeEventListener('touchstart', touchStart)
    } else {
        el.removeEventListener('mouseup', touchEnd)
        el.removeEventListener('mousedown', touchStart)
        el.removeEventListener('mousemove', touchMove)
    }
    if (ENV_TYPE_LOCAL) {
        el.addEventListener('touchmove', touchMove)
        el.addEventListener('touchend', touchEnd)
        el.addEventListener('touchstart', touchStart)
    } else {
        el.addEventListener('mouseup', touchEnd)
        el.addEventListener('mousedown', touchStart)
        // dom.addEventListener('mousemove', touchMove)
    }
})()

相关文章

  • 用Selenium模拟页面滚动

    TouchActions:模拟pc和h5的点击,滑动,拖拽,多点触控等多种手势操作实现方法:new_action....

  • HTML5拖拽drag

    通过拖拽实现页面元素的位置改变 实现拖拽效果 源元素 - 要拖拽的文件 目标元素 - 要拖拽到哪里去 目前实现拖拽...

  • 拖拽API

    实现拖拽效果 目前实现拖拽效果 HTML5拖拽 源元素事件例子 目标元素事件 从本地拖放图片到页面中 实现拖拽

  • HTML5实现拖拽

    实现拖拽效果源元素 - 要拖拽的文件目标元素 - 要拖拽到哪里去 目前实现拖拽效果使用原生DOM就能实现 - 最麻...

  • HTML5拖拽上传

    传统拖拽效果小demohtml5实现拖拽小demo调查问卷小demo拖拽拼图小demo拖拽上传小demo h5拖拽...

  • Vue小商城学习记录

    初期几天以后补 2018.6.1 用touch事件实现元素拖拽,拖拽元素不能加transition,否则拖拽结束才...

  • Java集合类-ArrayList

    ArrayList的是常用List接口的实现类,其中的元素的顺序是按照元素插入的顺序,其内部的实现是动态对象数组,...

  • H5拖拽drag

    我们在学习拖拽时要注意源元素、目标元素。在拖拽的过程,通过设置源元素、目标元素的相应事件,才能实现拖拽操作。 源元...

  • 原生拖拽,拖放事件(drag and drop)

    拖拽,拖放事件可以通过拖拽实现数据传递,达到良好的交互效果,如:从操作系统拖拽文件实现文件选择,拖拽实现元素布局的...

  • js拖拽html元素工具类

    复制就能用的拖拽js方法 原生js实现拖拽元素方法 使用(注意拖拽目标元素需绝对定位 position: 'abs...

网友评论

      本文标题:实现在h5 | pc 动态插入元素实现拖拽

      本文链接:https://www.haomeiwen.com/subject/sfhbsdtx.html