js实现鼠标的拖拽效果

拖拽效果在我们上网的过程中是很常见的,大家都应该在电脑上面登陆过qq吧,当这个qq的登陆框弹出来的时候,我们是可以进行拖动的。这就是一个拖拽效果

这是我在慕课网上面看到的,我直接拿过来了,地址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{background: url(images/baidu_demo.png) #fff top center no-repeat;padding: 0px;margin: 0px;font-size: 12px;font-family: "微软雅黑";}

    .link{text-align: right;line-height: 20px;padding-right: 40px;}

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

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

    .ui-dialog-title{
        height: 48px;line-height: 48px; padding:0px 20px;color: #535353;font-size: 16px;
        border-bottom: 1px solid #efefef;background: #f5f5f5;
        cursor: move;
        user-select:none;
    }
    .ui-dialog-closebutton{
        width: 16px;height: 16px;display: block;
        position: absolute;top: 12px;right: 20px;
        background: url(images/close_def.png) no-repeat;cursor: pointer;

    }
    .ui-dialog-closebutton:hover{background:url(images/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 #d5d5d5;
        font-size: 16px;color: #c1c1c1;
        text-indent: 25px;
        outline: none;
    }
    .ui-dialog-input-username{
        background: url(images/input_username.png) no-repeat 2px ;
    }

    .ui-dialog-input-password{
        background: url(images/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: #000;
        position: absolute;top: 0px;height: 0px;z-index: 8000;
        opacity:0.4; filter: Alpha(opacity=40);
    }
</style>
</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>

<script type="text/javascript">

    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>
</body>
<js/html>

看看js代码

1) 获取元素对象

 function g(id){return document.getElementById(id);}

这个很简单,就是一个对  document.getElementById方法的封装,用来获取页面的元素

2)自动居中元素

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‘;

    }

这里有一个document.documentElement.clientWidth 和 el.offsetWidth ,这两个是什么宽度?

这里也有一个视频。可以去看看,讲的蛮仔细的 http://www.imooc.com/learn/608  这个老师的风格有点奇葩,做好心理准备

时间: 2024-12-19 08:06:20

js实现鼠标的拖拽效果的相关文章

js拖拽效果的原理及实现

js中元素的拖拽效果需要用到的主要的知识点为:事件侦听和鼠标事件.即被拖拽的元素添加事件侦听,侦听的事件主要为mousedown,mousemove和mouseup,一些情况下还需要用到mouseleave.本篇所针对的原理是存在多个相同元素情况下的拖拽.下面结合案例进行分析.1.首先在body中创建7个div元素,并设置css样式. <style> div{ width:50px; height: 50px; background-color: red; position: absolute

JS 鼠标事件练习—拖拽效果

拖拽效果 HTML <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>拖拽效果</title> <link rel="stylesheet" type="text/css" href="拖拽效果.css"> </head> <body> <div

简单的鼠标拖拽效果(原生js实现)

之前在聊天群里看到有人说面试的时候被问到了怎样实现一个拖拽效果,当时看到后在心里默默思考了下,结果发现好像我也写不出来啊.本着遇到一个解决一个的思想,就亲自敲了一个,看到张鑫旭大神写的代码,真的很厉害,多多学习了,(感觉随便搜一个关于前端方面的问题都能看到他的网站,真是太佩服了,写了那么多文章,十分感谢.)好了,接下来就进入正题了.想实现一个效果首先得明白其中的逻辑,知道了实现逻辑后,就可以码代码了.首先我实现的效果是: 鼠标按下后,才可以执行后续效果 鼠标已经按下,然后鼠标移动,需要拖拽的元素

js 鼠标拖拽效果实现

效果: 源码: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>速表拖拽效果实现</title> <style> *{ margin: 0; padding: 0; } .toolbar{ height: 30px; text-align: left; padding-left: 20px;

js拖拽效果实现

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head>    <meta

React.js实现原生js拖拽效果及思考

一.起因&思路 不知不觉,已经好几天没写博客了...近来除了研究React,还做了公司官网... 一直想写一个原生js拖拽效果,又加上近来学react学得比较嗨.所以就用react来实现这个拖拽效果. 首先,其实拖拽效果的思路是很简单的.主要就是三个步骤: 1.onmousedown的时候,启动可拖拽事件,记录被拖拽元素的原始坐标参数. 2.onmousemove的时候,实时记录鼠标移动的距离,结合被拖拽元素第一阶段的坐标参数,计算并设置新的坐标值. 3.onmouseup的时候,关闭可拖拽事件

js之拖拽效果

主要原理: 1.当鼠标按下时,记录鼠标坐标,用到的是 onmousedown: 2.当鼠标移动时,计算鼠标移动的坐标之差,用到的是 onmousemove: 3.当鼠标松开时,清除事件,用到的是 onmouseup: 了解的知识: 1.div 的 offsetLeft 与 style.left 的区别: http://longxu1314.blog.163.com/blog/static/2112990412013101814844444/ 效果图如下: 突然发现有没有效果图都一样哈哈,不说废话

jquery鼠标拖拽效果分享

//html代码部分 <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Document</title> <script src="../js/jquery-1.11.1.js"></script> </head> <style> body

原生js实现拖拽效果

css样式布局: html部分: js主体部分: 接下来用混合继承实现box2移动时有边界的效果: 思路:1.实现拖拽效果主要有三个事件,当鼠标按下的时候,获取鼠标相对于事件发生元素的位置(offsetX/offsetY);当鼠标移动的时候,利用鼠标指针相对于浏览器页面(或客户区)的坐标(clientX/clientY),得到元素的left和top值(clientX/clientY-offsetX/offsetY):当鼠标抬起的时候清除移动效果. 2.事件处理函数会使this指向触发事件的元素,