文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

JS如何实现简单可拖动的模态框

2023-07-02 15:35

关注

这篇文章主要讲解了“JS如何实现简单可拖动的模态框”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS如何实现简单可拖动的模态框”吧!

简单版本

效果图:

JS如何实现简单可拖动的模态框

实现思路:

给可拖动部分添加点击事件,触发时计算鼠标在可拖动部分中的坐标( e.pageX - box.offsetLeft ),得到 x y 。

给 document 添加鼠标移动事件,因为当鼠标拖动模态框的时候,是在整个DOM窗口内移动的。保持鼠标与模态框的相对位置不变,所以需要计算此时的模态框的位置(e.pageX - x ),进而修改模态框位置。此时的 e.pageX 已经发生变化,跟上述的 e.pageX 是不相等的。

当鼠标弹起时,清除移动事件即可。

代码注意点:

1 offsetWidth 这类offset属性是只读属性,不能通过对其进行赋值来修改元素。

2 使用 style.top、style.left 的元素必须有定位,且在给这两个属性赋值的时候必须要在末尾加上单位 'px' 。

3 代码中 mousemove 事件回调函数的参数 e 不能省略,如果省略则会使用外部的 e,即 mousedown 事件回调函数中的 e,因此得到的鼠标坐标是错误的。

代码:

<!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修改样式 -->    <style>        .box {            position: absolute;            height: 200px;            width: 200px;            background-color: plum;        }         .title {            width: 100%;            height: 50px;            background-color: rosybrown;            cursor: move;                        -webkit-user-select: none;            -moz-user-select: none;            -ms-user-select: none;            user-select: none;        }    </style></head> <body>    <div class="box">        <div class="title">head部分</div>    </div>    <script>        var box = document.querySelector('.box');        var title = document.querySelector('.title');        title.addEventListener('mousedown', function (e) {            //获取鼠标在box内的坐标值            var x = e.pageX - box.offsetLeft;            var y = e.pageY - box.offsetTop;            document.addEventListener('mousemove', move);             function move(e) {                box.style.left = e.pageX - x + 'px';                box.style.top = e.pageY - y + 'px';            }            document.addEventListener('mouseup', function () {                document.removeEventListener('mousemove', move);            })        })    </script></body> </html>

复杂版本

效果图:

JS如何实现简单可拖动的模态框

实现思路:

跟简单版本大体相同

实现代码:

<!DOCTYPE html><html> <head lang="en">    <meta charset="UTF-8">    <title>拖动模态框</title>    <style>        .login-header {            width: 100%;            text-align: center;            height: 30px;            font-size: 24px;            line-height: 30px;        }         ul,        li,        ol,        dl,        dt,        dd,        div,        p,        span,        h2,        h3,        h4,        h5,        h6,        h7,        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;        }    </style></head> <body>    <div class="login-header"><a id="link" href="javascript:;">点击,弹出登录框</a></div>    <div id="login" class="login">        <div id="title" class="login-title">登录会员            <span><a id="closeBtn" href="javascript:void(0);" class="close-login">关闭</a></span>        </div>        <div class="login-input-content">            <div class="login-input">                <label>用户名:</label>                <input type="text" placeholder="请输入用户名" name="info[username]" id="username" class="list-input">            </div>            <div class="login-input">                <label>登录密码:</label>                <input type="password" placeholder="请输入登录密码" name="info[password]" id="password" class="list-input">            </div>        </div>        <div id="loginBtn" class="login-button"><a href="javascript:void(0);" id="login-button-submit">登录会员</a></div>    </div>    <!-- 遮盖层 -->    <div id="bg" class="login-bg"></div>    <script>        // 1. 获取元素        var login = document.querySelector('.login');        var mask = document.querySelector('.login-bg');        var link = document.querySelector('#link');        var closeBtn = document.querySelector('#closeBtn');        var title = document.querySelector('#title');        // 2. 点击弹出层这个链接 link  让mask 和login 显示出来        link.addEventListener('click', function () {            mask.style.display = 'block';            login.style.display = 'block';        })        // 3. 点击 closeBtn 就隐藏 mask 和 login         closeBtn.addEventListener('click', function () {            mask.style.display = 'none';            login.style.display = 'none';        })        // 4. 开始拖拽        // (1) 当我们鼠标按下, 就获得鼠标在盒子内的坐标        title.addEventListener('mousedown', function (e) {            var x = e.pageX - login.offsetLeft;            var y = e.pageY - login.offsetTop;            // (2) 鼠标移动的时候,把鼠标在页面中的坐标,减去 鼠标在盒子内的坐标就是模态框的left和top值            document.addEventListener('mousemove', move)             function move(e) {                login.style.left = e.pageX - x + 'px';                login.style.top = e.pageY - y + 'px';            }            // (3) 鼠标弹起,就让鼠标移动事件移除            document.addEventListener('mouseup', function () {                document.removeEventListener('mousemove', move);            })        })    </script></body> </html>

感谢各位的阅读,以上就是“JS如何实现简单可拖动的模态框”的内容了,经过本文的学习后,相信大家对JS如何实现简单可拖动的模态框这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯