可视区域内拖拽

视频地址:http://www.imooc.com/learn/60

看最下面的例子

<!DOCTYPE html>
<html>

    <head>

        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

        <title>慕课网-拖拽效果</title>

        <style type="text/css">
            body {
                padding: 0px;
                margin: 0px;
                font-size: 12px;
                font-family: "微软雅黑";
            }

            .link {
                text-align: right;
                line-height: 20px;
                margin-right: 40px;
                color: red;
            }

            .ui-dialog {
                width: 380px;
                height: auto;
                display: none;
                position: absolute;
                z-index: 9000;
                top: 0px;
                left: 0px;
                border: 1px solid red;
                background: #fff;
            }

            .ui-dialog a {
                text-decoration: none;
            }

            .ui-dialog-title {
                height: 48px;
                line-height: 48px;
                padding: 0px 20px;
                color: black;
                font-size: 16px;
                border-bottom: 1px solid red;
                background: #f5f5f5;
                cursor: move;
                user-select: none;
            }

            .ui-dialog-closebutton {
                width: 16px;
                height: 16px;
                display: block;
                position: absolute;
                top: 12px;
                right: 20px;
                background: url(img/close_def.png) no-repeat;
                cursor: pointer;
            }

            .ui-dialog-closebutton:hover {
                background: url(img/close_hov.png);
            }

            .ui-dialog-content {
                padding: 15px 20px;
            }

            .ui-dialog-pt15 {
                padding-top: 15px;
            }

            .ui-dialog-l40 {
                height: 40px;
                line-height: 40px;
                text-align: right;
            }

            .ui-dialog-input {
                width: 100%;
                height: 40px;
                margin: 0px;
                padding: 0px;
                border: 1px solid red;
                font-size: 16px;
                color: #c1c1c1;
                text-indent: 45px;
                outline: none;
            }

            .ui-dialog-input-username {
                background: url(img/input_username.png) no-repeat 2px;
            }

            .ui-dialog-input-password {
                background: url(img/input_password.png) no-repeat 2px;
            }

            .ui-dialog-submit {
                width: 100%;
                height: 50px;
                background: #3b7ae3;
                border: none;
                font-size: 16px;
                color: #fff;
                outline: none;
                text-decoration: none;
                display: block;
                text-align: center;
                line-height: 50px;
            }

            .ui-dialog-submit:hover {
                background: #3f81b0;
            }

            .ui-mask {
                width: 100%;
                height: 100%;
                background: black;
                position: absolute;
                top: 0px;
                height: 0px;
                z-index: 8000;
                opacity: 0.4;
            }
        </style>
        <script type="text/javascript">
            window.onload = function() {
                var dialogInstace, onMoveStartId, mousePos = {
                    x: 0,
                    y: 0
                }; //   用于记录当前可拖拽的对象
                // var zIndex = 9000;
                //  获取元素对象
                function g(id) {
                    return document.getElementById(id);
                }
                //  自动水平居中元素(el = Element)
                function autoCenter(el) {
                    var bodyW = document.documentElement.clientWidth;
                    var bodyH = document.documentElement.clientHeight;
                    var elW = el.offsetWidth;
                    var elH = el.offsetHeight;
                    el.style.left = (bodyW - elW) / 2 + ‘px‘;
                    el.style.top = (bodyH - elH) / 2 + ‘px‘;
                }
                //  自动扩展元素到全部显示区域
                function fillToBody(el) {
                    el.style.width = document.documentElement.clientWidth + ‘px‘;
                    el.style.height = document.documentElement.clientHeight + ‘px‘;
                }
                //  Dialog实例化的方法
                function Dialog(dragId, moveId) {
                    var instace = {};
                    instace.dragElement = g(dragId); // 允许执行 拖拽操作 的元素
                    instace.moveElement = g(moveId); // 拖拽操作时,移动的元素
                    instace.mouseOffsetLeft = 0; // 拖拽操作时,移动元素的起始 X 点
                    instace.mouseOffsetTop = 0; //  拖拽操作时,移动元素的起始 Y 点
                    instace.dragElement.addEventListener(‘mousedown‘, function(e) {
                        var e = e || window.event;
                        dialogInstace = instace;
                        instace.mouseOffsetLeft = e.pageX - instace.moveElement.offsetLeft;
                        instace.mouseOffsetTop = e.pageY - instace.moveElement.offsetTop;
                        onMoveStartId = setInterval(onMoveStart, 10);
                        return false;
                        // instace.moveElement.style.zIndex = zIndex ++;
                    })
                    return instace;
                }
                //  在页面中侦听 鼠标弹起事件
                document.onmouseup = function(e) {
                    dialogInstace = false;
                    clearInterval(onMoveStartId);
                }
                document.onmousemove = function(e) {
                    var e = window.event || e;
                    mousePos.x = e.clientX;
                    mousePos.y = e.clientY;
                    e.stopPropagation && e.stopPropagation();
                    e.cancelBubble = true;
                    e = this.originalEvent;
                    e && (e.preventDefault ? e.preventDefault() : e.returnValue = false);
                    document.body.style.MozUserSelect = ‘none‘;
                }

                function onMoveStart() {
                    var instace = dialogInstace;
                    if(instace) {
                        var maxX = document.documentElement.clientWidth - instace.moveElement.offsetWidth;
                        var maxY = document.documentElement.clientHeight - instace.moveElement.offsetHeight;
                        instace.moveElement.style.left = Math.min(Math.max((mousePos.x - instace.mouseOffsetLeft), 0), maxX) + "px";
                        instace.moveElement.style.top = Math.min(Math.max((mousePos.y - instace.mouseOffsetTop), 0), maxY) + "px";
                    }
                }
                //  重新调整对话框的位置和遮罩,并且展现
                function showDialog() {
                    g(‘dialogMove‘).style.display = ‘block‘;
                    g(‘mask‘).style.display = ‘block‘;
                    autoCenter(g(‘dialogMove‘));
                    fillToBody(g(‘mask‘));
                }
                //  关闭对话框
                function hideDialog() {
                    g(‘dialogMove‘).style.display = ‘none‘;
                    g(‘mask‘).style.display = ‘none‘;
                }
                //  侦听浏览器窗口大小变化
                window.onresize = showDialog;
                Dialog(‘dialogDrag‘, ‘dialogMove‘);
                showDialog();
            }
        </script>
    </head>

    <body>

        <div class="link">
            <a href="javascript:showDialog();">登录</a>
        </div>
        <div class="ui-mask" id="mask" onselectstart="return false"></div>
        <!--遮罩-->

        <div class="ui-dialog" id="dialogMove" onselectstart=‘return false;‘>
            <div class="ui-dialog-title" id="dialogDrag" onselectstart="return false;">
                登录通行证
                <a class="ui-dialog-closebutton" href="javascript:hideDialog();"></a>
            </div>
            <div class="ui-dialog-content">
                <div class="ui-dialog-l40 ui-dialog-pt15">
                    <input class="ui-dialog-input ui-dialog-input-username" type="input" value="手机/邮箱/用户名" />
                </div>
                <div class="ui-dialog-l40 ui-dialog-pt15">
                    <input class="ui-dialog-input ui-dialog-input-password" type="input" value="密码" />
                </div>
                <div class="ui-dialog-l40">
                    <a href="#">忘记密码</a>
                </div>
                <div>
                    <a class="ui-dialog-submit" href="#">登录</a>
                </div>
                <div class="ui-dialog-l40">
                    <a href="#">立即注册</a>
                </div>
            </div>
        </div>

    </body>

</html>

修改:

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

    <head>
        <meta charset="UTF-8" />
        <title>Document</title>
        <style type="text/css">
            * {
                padding: 0px;
                margin: 0px;
            }

            #mask {
                width: 100%;
                height: 100%;
                background: black;
                position: absolute;
                top: 0px;
                height: 0px;
                z-index: 1;
                opacity: 0.4;
            }

            #box {
                z-index: 11;
                display: none;
                position: absolute;
                width: 300px;
                height: 300px;
                background: red;
            }

            #main {
                height: 50px;
                background: blue;
                cursor: move;
            }
        </style>
        <script type="text/javascript">
            window.onload = function() {
                var dialogInstace, onMoveStartId, mousePos = {
                    x: 0,
                    y: 0
                }; //   用于记录当前可拖拽的对象
                // var zIndex = 9000;
                //  获取元素对象
                function g(id) {
                    return document.getElementById(id);
                }
                //  自动水平居中元素(el = Element)
                function autoCenter(el) {
                    var bodyW = document.documentElement.clientWidth;
                    var bodyH = document.documentElement.clientHeight;
                    var elW = el.offsetWidth;
                    var elH = el.offsetHeight;
                    el.style.left = (bodyW - elW) / 2 + ‘px‘;
                    el.style.top = (bodyH - elH) / 2 + ‘px‘;
                }
                //  自动扩展元素到全部显示区域
                function fillToBody(el) {
                    el.style.width = document.documentElement.clientWidth + ‘px‘;
                    el.style.height = document.documentElement.clientHeight + ‘px‘;
                }
                //  Dialog实例化的方法
                function Dialog(dragId, moveId) {
                    var instace = {};
                    instace.dragElement = g(dragId); // 允许执行 拖拽操作 的元素
                    instace.moveElement = g(moveId); // 拖拽操作时,移动的元素
                    instace.mouseOffsetLeft = 0; // 拖拽操作时,移动元素的起始 X 点
                    instace.mouseOffsetTop = 0; //  拖拽操作时,移动元素的起始 Y 点
                    instace.dragElement.addEventListener(‘mousedown‘, function(e) {
                        var e = e || window.event;
                        dialogInstace = instace;
                        instace.mouseOffsetLeft = e.pageX - instace.moveElement.offsetLeft;
                        instace.mouseOffsetTop = e.pageY - instace.moveElement.offsetTop;
                        onMoveStartId = setInterval(onMoveStart, 10);
                        return false;
                        // instace.moveElement.style.zIndex = zIndex ++;
                    })
                    return instace;
                }
                //  在页面中侦听 鼠标弹起事件
                document.onmouseup = function(e) {
                    dialogInstace = false;
                    clearInterval(onMoveStartId);
                }
                document.onmousemove = function(e) {
                    var e = window.event || e;
                    mousePos.x = e.clientX;
                    mousePos.y = e.clientY;
                    e.stopPropagation && e.stopPropagation();
                    e.cancelBubble = true;
                    e = this.originalEvent;
                    e && (e.preventDefault ? e.preventDefault() : e.returnValue = false);
                    document.body.style.MozUserSelect = ‘none‘;
                }

                function onMoveStart() {
                    var instace = dialogInstace;
                    if(instace) {
                        var maxX = document.documentElement.clientWidth - instace.moveElement.offsetWidth;
                        var maxY = document.documentElement.clientHeight - instace.moveElement.offsetHeight;
                        instace.moveElement.style.left = Math.min(Math.max((mousePos.x - instace.mouseOffsetLeft), 0), maxX) + "px";
                        instace.moveElement.style.top = Math.min(Math.max((mousePos.y - instace.mouseOffsetTop), 0), maxY) + "px";
                    }
                }
                //  关闭对话框
                function hideDialog() {
                    g(‘dialogMove‘).style.display = ‘none‘;
                    g(‘mask‘).style.display = ‘none‘;
                }

                //  重新调整对话框的位置和遮罩,并且展现
                function showDialog() {
                    g(‘box‘).style.display = ‘block‘;
                    g(‘mask‘).style.display = ‘block‘;
                    autoCenter(g(‘box‘));
                    fillToBody(g(‘mask‘));
                }
                //  侦听浏览器窗口大小变化
                window.onresize = showDialog;
                Dialog(‘main‘, ‘box‘);
                showDialog();
            }
        </script>
    </head>

    <body>
        <div id="mask"></div>
        <!--遮罩 -->
        <div id="box">
            <div id="main">
            </div>
        </div>
    </body>

</html>
时间: 2024-11-05 22:37:57

可视区域内拖拽的相关文章

js实现可视化区域内拖拽

<!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible"

理解事件捕获。在限制范围内拖拽div+吸附+事件捕获

一.实现的效果是在限制范围内拖拽div+吸附+事件捕获. 这里需要理解的是事件捕获,这个事件捕获也是为了兼容div在拖拽过程中,文本不被选中这个问题. 如此良辰美景,拖拽也可以很洒脱哈.先看看图, 二.一步步的实现这个拖拽过程的几个要求 (一)拖拽起来 里面的边框是表示页面哦(我们的屏幕所能看到的东东). 获取移动距离的思路: 记录鼠标按下和鼠标抬起两次的坐标,然后相减,再加上div跟边缘之间的间距.就得到移动距离. 之前我也在这里困惑了,不明白为什么还要再加上offsetLeft.原因就是cl

高德地图判断点的位置是否在浏览器可视区域内

业务场景如下: 1.在地图上点击企业位置mark时,地图不做缩放和移动操作(能点击mark,说明该位置肯定在可视区域内). 2.点击右侧企业列表的企业时,如果企业的位置不在当前可视区域内,就需要将地图平滑的移动到该企业位置,并且需要缩小地图,先查看到该企业位于哪个区域,再将地图放大到之前缩放的级别. 实现思路: 高德地图有几个关系判断的API:判断点是否在线上.点是否在多边形内.面与面的几何关系,可看下方链接示例 https://lbs.amap.com/api/javascript-api/e

判断元素是否在可视区域内

如果页面有头部置顶和底部置底的元素,需要自行进行计算: scrollTop  +   头部置顶元素高度 screenHeight - (置顶和置底元素的高度) //元素距离页面顶部的距离 var eleTop = $("#ele").offset().top; //元素本身的高度 var eleHeight = $("#ele").height(); //页面滚动的距离 var scrollTop = $(window).scrollTop(); //可视区域高度

只能在方块内拖拽的案例

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title></title> <style> #aa{ width:500px; height:500px; border:red 1px solid; margin:100px auto; position:relative; /*padding:2px;*/ } #dd{ width:100px

判断dom原始是否在可视区域内

isElementInViewport (el, offset = 0) { const box = el.getBoundingClientRect(), top = (box.top >= 0), left = (box.left >= 0), bottom = (box.bottom <= (window.innerHeight || document.documentElement.clientHeight) + offset), right = (box.right <=

vue与animate.css 结合使用在可视区域内动态展示的自定义指令

1.vue自定义指令 Vue.directive('class', { inserted: function (el, binding) { // 聚焦元素 binding.addClass = () => { const { top } = el.getBoundingClientRect() const h = document.documentElement.clientHeight || document.body.clientHeight if (top < h) { el.clas

自定义控件——可拖拽排序的ListView

前言 最经研究了一下拖拽排序的ListView,跟酷狗里的播放列表排序一样,但因为要添加自己特有的功能,所以研究了好长时间.一开始接触的是GitHub的开源项目--DragSortListView,实现的效果和流畅度都很棒.想根据他的代码自己写一个,但代码太多了,实现的好复杂,看别人的代码你懂的了,就去尝试寻找其他办法.最后还是找到了更简单的实现方法,虽然跟开源项目比要差一点,但对我来说可以了,最重要的是完全可以自定义. 实现的效果如下: 主要问题 如何根据触摸的位置确定是哪个条目? ListV

ztree获取选中节点时不能进入可视区域出现BUG如何解决

zTree 是一个依靠 jQuery 实现的多功能 "树插件".优异的性能.灵活的配置.多种功能的组合是 zTree 最大优点. zTree 的特点编辑 ● zTree v3.0 将核心代码按照功能进行了分割,不需要的代码可以不用加载● 采用了延迟加载技术,上万节点轻松加载,即使在 IE6 下也能基本做到秒杀● 兼容 IE.FireFox.Chrome.Opera.Safari 等浏览器● 支持 JSON 数据● 支持静态和 Ajax 异步加载节点数据● 支持任意更换皮肤 / 自定义图