JS实现拖拽效果

拖拽效果也叫模态框,都是表述得同一个效果。

问题描述:

点击链接会弹出一个框框(我这里是登录框),鼠标点击不松手可以实现拖拽框框移动。点击框上得关闭按钮,可以关闭框。

先来看看效果

JS实现拖拽效果_第1张图片

 JS实现拖拽效果_第2张图片

这个案例的主要分三部分来完成

1. 点击文字,登陆框的显示和隐藏

2. 鼠标按下,拖拽登陆框移动

3. 鼠标松开,登陆框位置不变了

具体得步骤代码里会有详细得解释得。

这里值得注意得点:鼠标按下拖拽的地方是有限制的,不可能任何一个地方都能拖拽着移动,这里我设置的是登陆的头部

JS:

// 拖拽模态框
        // 三个部分
        // 1.点击文字链接 弹出登陆框
        // 2.在登陆框的头部区域按下鼠标 可以拖动登陆框移动 分为两个事件:鼠标按下 鼠标移动
        // 3.松开鼠标 登陆框不移动  停在哪个位置不动

        // 1.点击文字  显示登陆框 点击关闭 隐藏登陆框
        var link = document.querySelector('#link'); // 链接
        var login = document.querySelector('#login'); // 登陆框
        var mask = document.querySelector('.login-bg'); // 遮挡层
        var close = document.querySelector('#closeBtn'); // 关闭按钮
        var title = document.querySelector('.login-title'); // 登陆框头部

        link.addEventListener('click', function () {
            login.style.display = 'block';
            mask.style.display = 'block';
            // console.log('打开');

        });
        close.addEventListener('click', function () {
            login.style.display = 'none';
            mask.style.display = 'none';
            // console.log('关闭');
        })

        // 2.鼠标点击事件 登陆框移动 登陆框的距离=鼠标在页面的坐标-鼠标在盒子的坐标
        // (1)鼠标按下就要获得鼠标的位置
        title.addEventListener('mousedown', function (e) {
            // 登陆框移动的距离 就是鼠标点击的位置距离页面的距离 - 登陆框距离页面的距离 
            // 鼠标再盒子内的坐标 
            var x = e.pageX - login.offsetLeft;
            var y = e.pageY - login.offsetTop;
            // (2)鼠标移动 鼠标的位置更新 登陆框位置更新 所以更新登陆框的坐标  
            // 鼠标按下触发事件 
            document.addEventListener('mousemove', move);

            function move(e) {
                // 登陆框位置:只要鼠标在动 就会更新位置 
                login.style.top = e.pageY - y + 'px';
                login.style.left = e.pageX - x + 'px';
            }
            // 3.鼠标松开 登录框停止移动 就是停止进行位置的赋值操作
            document.addEventListener('mouseup', function () {
                document.removeEventListener('mousemove', move);
            })
        })

结构:


    
    
    
    

样式:

.login-header {
            width: 100%;
            text-align: center;
            height: 30px;
            font-size: 24px;
            line-height: 30px;
        }

        ul,
        li,
        ol,
        dl,
        dt,
        dd,
        div,
        p,
        span,
        h1,
        h2,
        h3,
        h4,
        h5,
        h6,
        a {
            padding: 0px;
            margin: 0px;
        }

        .login {
            display: none;
            width: 512px;
            height: 280px;
            position: fixed;
            border: #ebebeb solid 1px;
            left: 50%;
            top: 50%;
            background: #ffffff;
            box-shadow: 0px 0px 20px #ddd;
            z-index: 9999;
            transform: translate(-50%, -50%);
        }

        .login-title {
            width: 100%;
            margin: 10px 0px 0px 0px;
            text-align: center;
            line-height: 40px;
            height: 40px;
            font-size: 18px;
            position: relative;
            cursor: move;
        }

        .login-input-content {
            margin-top: 20px;
        }

        .login-button {
            width: 50%;
            margin: 30px auto 0px auto;
            line-height: 40px;
            font-size: 14px;
            border: #ebebeb 1px solid;
            text-align: center;
        }

        .login-bg {
            display: none;
            width: 100%;
            height: 100%;
            position: fixed;
            top: 0px;
            left: 0px;
            background: rgba(0, 0, 0, .3);
        }

        a {
            text-decoration: none;
            color: #000000;
        }

        .login-button a {
            display: block;
        }

        .login-input input.list-input {
            float: left;
            line-height: 35px;
            height: 35px;
            width: 350px;
            border: #ebebeb 1px solid;
            text-indent: 5px;
        }

        .login-input {
            overflow: hidden;
            margin: 0px 0px 20px 0px;
        }

        .login-input label {
            float: left;
            width: 90px;
            padding-right: 10px;
            text-align: right;
            line-height: 35px;
            height: 35px;
            font-size: 14px;
        }

        .login-title span {
            position: absolute;
            font-size: 12px;
            right: -20px;
            top: -30px;
            background: #ffffff;
            border: #ebebeb solid 1px;
            width: 40px;
            height: 40px;
            border-radius: 20px;
        }

 

ok,这个案例结束了。思路依然很重要,代码敲三遍吧。。。。

 

你可能感兴趣的