JavaScript实现拖动对话框效果

代码实现:

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

<head>
    <Meta charset="UTF-8">
    <Meta name="viewport" content="width=device-width,initial-scale=1.0">
    <title>Document</title>
    <style>
        * {
            margin: 0;
            top: 0;
        }
        
        .login-btn {
            width: 50px;
            height: 50px;
            line-height: 50px;
            font-size: 16px;
            text-align: center;
            margin: 100px auto;
            background-color: #1E1E1E;
            color: white;
            border-radius: 50%;
        }
        
        .login-btn:hover {
            cursor: pointer;
            background-color: #323233;
            Box-shadow: 3px 3px 10px rgba(0,.3);
        }
        
        .bg {
            display: none;
            width: 100%;
            height: 100%;
            position: fixed;
            top: 0;
            left: 0;
            background-color: rgba(0,.4);
        }
        
        .login {
            display: none;
            position: fixed;
            top: 50%;
            left: 50%;
            transform: translate(-50%,-50%);
            width: 300px;
            height: 200px;
            background-color: #1E1E1E;
            Box-shadow: 4px 4px 15px rgba(0,.3);
        }
        
        .hd {
            position: relative;
            width: 100%;
            height: 26px;
            background-color: #323233;
        }
        
        .hd:hover {
            cursor: move;
        }
        
        .close {
            position: absolute;
            top: 3px;
            right: 5px;
            width: 20px;
            height: 20px;
            background-color: red;
            text-align: center;
            line-height: 20px;
            border-radius: 50%;
            Box-shadow: 0 0 5px rgba(0,.7) inset;
        }
        
        .close:hover {
            background-color: yellow;
            cursor: pointer;
        }
    </style>
</head>

<body>
    <div class="login-btn">点击</div>
    <div class="bg"></div>
    <div class="login">
        <div class="hd">
            <div class="close">×</div>
        </div>
    </div>
    <script>
        // 获取元素
        var btn = document.querySelector('.login-btn');
        var bg = document.querySelector('.bg');
        var login = document.querySelector('.login');
        var close = document.querySelector('.close');
        var hd = document.querySelector('.hd');

        // 按下btn,弹出对话框
        btn.addEventListener('click',function() {
            bg.style.display = 'block';
            login.style.display = 'block';
        });

        // 按下close,关闭对话框
        close.addEventListener('click',function() {
            bg.style.display = 'none';
            login.style.display = 'none';
        });

        hd.addEventListener('mousedown',function(e) {
            // 鼠标按下对话框顶部时,获取鼠标到对话框的距离
            var x = e.pageX - login.offsetLeft;
            var y = e.pageY - login.offsetTop;
            // 鼠标按下并移动时,实时更新对话框的位置
            document.addEventListener('mousemove',move);

            function move(e) {
                login.style.left = e.pageX - x + 'px';
                login.style.top = e.pageY - y + 'px';
            }
            // 鼠标松开时,移除拖拽的动作
            document.addEventListener('mouseup',function() {
                document.removeEventListener('mousemove',move);
            });
        });
    </script>
</body>

</html>

实现效果

点击点击按钮,弹出对话框。
按住对话框顶部并移动,实现拖动效果
点击对话框右上角×关闭对话框。

相关文章

前言 做过web项目开发的人对layer弹层组件肯定不陌生,作为l...
前言 前端表单校验是过滤无效数据、假数据、有毒数据的第一步...
前言 图片上传是web项目常见的需求,我基于之前的博客的代码...
前言 导出Excel文件这个功能,通常都是在后端实现返回前端一...
前言 众所周知,js是单线程的,从上往下,从左往右依次执行,...
前言 项目开发中,我们可能会碰到这样的需求:select标签,禁...