鼠标拖拽移动子窗体的JS实现


Posted in Javascript onFebruary 25, 2014

1.子窗体

在设计网站的时候,我们需要设计一些模态的子窗体,比如

鼠标拖拽移动子窗体的JS实现

这一步很容易实现,只需要div+css就ok了,请看代码:

    <div class="modal-background"></div>
    <div class="modal-window">
        <div class="head">
            <center>点住着块区域可以改变我的位置</center>
        </div>
    </div>

.modal-background
{
    background-color: #999999;
    bottom: 0;
    left: 0;
    opacity: 0.3;
    position: fixed;
    right: 0;
    top: 0;
    z-index: 1100;
}
.modal-window
{
    background-color: #FFFFFF;
    border: 1px solid #6B94AD;
    box-shadow: 5px 5px 5px #6B94AD;
    font-family: 'Microsoft YaHei';
    font-size: 12px;
    height: 120px;
    left: 50%;
    margin-left: -160px;
    margin-top: -160px;
    opacity: 1;
    position: fixed;
    top: 50%;
    width: 320px;
    z-index: 1110;
}
    .modal-window .head
    {
        height: 25px;
        color: #fff;
        font-weight: 600;
        background-image: -moz-linear-gradient(top, #4A8CC5, #2963A5); /* Firefox */
        background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #4A8CC5), color-stop(1, #2963A5)); /* Saf4+, Chrome */
        filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#4A8CC5', endColorstr='#2963A5', GradientType='0'); /* IE*/
    }
        .modal-window .head center
        {
            padding-top: 2px;
        }

加上上述html和css就可以很容易实现上述模态窗体的效果。其中left: 50%;top: 50%; margin-left: -160px; margin-top: -160px;是为了实现这个模态窗体的居中效果。

当然,模态窗体的大小在样式类.modal-window中是固定写好的了,这并不是说不可修改模态窗体的大小,比如我写如代码:

    <div class="modal-background"></div>
    <div class="modal-window list-window">
        <div class="head">
            <center>点住着块区域可以改变我的位置</center>
        </div>
    </div>

在第二行代码中追加了.list-window这个样式类来覆盖.modal-window类中的大小和位置,但同时保证模态窗体居中显示

.list-window
{
    width:600px;
    height:400px;
    margin-left:-300px;
    margin-top:-200px;
}

如图

鼠标拖拽移动子窗体的JS实现

可以看得出来,这一步的实现是非常简单的,掌握几个关键行的css属性就"完虐"这个模态子窗体,各类其它的模态子窗体可以举一反三咯。

2.当鼠标点住子窗体的头部时,如何实现子窗体的拖拽移动呢?当引入jQ后,我们只需要很少的脚本就搞定这个小功能。不信我们看

var left, top, $this;
$(document).delegate('.modal-window .head', 'mousedown', function (e) {
    left = e.clientX, top = e.clientY, $this = $(this).css('cursor', 'move');
    this.setCapture ? (
    this.setCapture(),
    this.onmousemove = function (ev) { mouseMove(ev || event); },
    this.onmouseup = mouseUp
    ) : $(document).bind("mousemove", mouseMove).bind("mouseup", mouseUp);
});
function mouseMove(e) {
    var target = $this.parents('.modal-window');
    var l = Math.max((e.clientX - left + Number(target.css('margin-left').replace(/px$/, '')) || 0), -target.position().left);
    var t = Math.max((e.clientY - top + Number(target.css('margin-top').replace(/px$/, '')) || 0), -target.position().top);
    l = Math.min(l, $(window).width() - target.width() - target.position().left);
    t = Math.min(t, $(window).height() - target.height() - target.position().top);
    left = e.clientX;
    top = e.clientY;
    target.css({ 'margin-left': l, 'margin-top': t });
}
function mouseUp(e) {
    var el = $this.css('cursor', 'default').get(0);
    el.releaseCapture ?
    (
        el.releaseCapture(),
        el.onmousemove = el.onmouseup = null
    ) : $(document).unbind("mousemove", mouseMove).unbind("mouseup", mouseUp);
}

这段代码非常简短,能否在各种浏览器中很流畅的运行。

其实它的实现原理非常简单,大致分为三步:

①当鼠标在模态窗体头部点下(mousedown)时,立即给document绑定mousemove和mouseup事件

②当鼠标没有弹起时(没有mouseup)时,若鼠标在窗体内移动时,激活mouseMove函数,通过计算鼠标移动的距离来及时整个窗体的位置移动。

③当鼠标弹起(mouseup)时,调用mouseUp事件,将document上绑定的mousemove事件和mouseup事件解除绑定。

整个过程的原理就是:当鼠标mousedown时,鼠标的移动事件转移到document上来,通过鼠标在document上的移动事件来对整个窗体进行处理。

另外,在mouseMove中有个小技巧,就是全局的left,top变量记录上一次鼠标停止时的位置,然后下一次移动时鼠标的位置与left,top变量进行对比来确定鼠标移动了多少距离,来对整个模态子窗体做出相应的位置移动即可。

经过这一段代码的分析,发现鼠标移动窗体乃至document上的任何元素都是相当easy的

比如,如果想要通过拖拽来改变窗体的大小,一样我们只需要在mouseMove事件处理函数中调整窗体的大小就ok了,是不是又发现自己有多学会了一招,又精进了一小步呢?

有人会问setCapture和releaseCapture分别都是干什么的呢?其实这是为了兼容IE,仅有IE才有这俩函数,在此鄙视IE。setCapture可以让当前元素捕获鼠标的所有事件,如果不使用它们,可能不兼容IE浏览器哦。

Javascript 相关文章推荐
使用基于jquery的gamequery插件做JS乒乓球游戏
Jul 31 Javascript
js中call与apply的用法小结
Dec 28 Javascript
node.js中的querystring.unescape方法使用说明
Dec 10 Javascript
jQuery实现时尚漂亮的弹出式对话框实例
Aug 07 Javascript
Vue.js每天必学之方法与事件处理器
Sep 06 Javascript
js运动事件函数详解
Oct 21 Javascript
想学习javascript JS和jQuery哪个重要 先学哪个
Dec 11 Javascript
react-native组件中NavigatorIOS和ListView结合使用的方法
Sep 30 Javascript
JavaScript轮播停留效果的实现思路
May 24 Javascript
初学vue出现空格警告的原因及其解决方案
Oct 31 Javascript
Vue项目移动端滚动穿透问题的实现
May 19 Javascript
基于javascript的无缝滚动动画1
Aug 07 Javascript
js判断为空Null与字符串为空简写方法
Feb 24 #Javascript
JS清空多文本框、文本域示例代码
Feb 24 #Javascript
脚本合并提升javascript性能示例
Feb 24 #Javascript
动态加载脚本提升javascript性能
Feb 24 #Javascript
巧用局部变量提升javascript性能
Feb 24 #Javascript
javascript中的原型链深入理解
Feb 24 #Javascript
JSONP获取Twitter和Facebook文章数的具体步骤
Feb 24 #Javascript
You might like
MySQL中create table语句的基本语法是
2007/01/15 PHP
php中突破基于HTTP_REFERER的防盗链措施(stream_context_create)
2011/03/29 PHP
如何修改和添加Apache的默认站点目录
2013/07/05 PHP
Laravel 5.5基于内置的Auth模块实现前后台登陆详解
2017/12/21 PHP
PHP如何根据文件头检测文件类型实例代码
2018/10/14 PHP
Thinkphp5.0 框架Model模型简单用法分析
2019/10/11 PHP
Javascript - HTML的request类
2006/07/15 Javascript
用正则xmlHttp实现的偷(转)
2007/01/22 Javascript
Google的跟踪代码 动态加载js代码方法应用
2012/11/12 Javascript
浅析ajax请求json数据并用js解析(示例分析)
2013/07/13 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
jQuery实现带滑动条的菜单效果代码
2015/08/26 Javascript
angularjs自定义ng-model标签的属性
2016/01/21 Javascript
Node.js制作简单聊天室
2017/01/12 Javascript
用jQuery实现可输入多选下拉组合框实例代码
2017/01/18 Javascript
详解React开发中使用require.ensure()按需加载ES6组件
2017/05/12 Javascript
React学习笔记之事件处理(二)
2017/07/02 Javascript
javaScript中&quot;==&quot;和&quot;===&quot;的区别详解
2018/03/16 Javascript
详解处理bootstrap4不支持远程静态框问题
2018/07/20 Javascript
JavaScript指定断点操作实例教程
2018/09/18 Javascript
javascript实现考勤日历功能
2018/11/29 Javascript
jQuery实现轮播图效果
2019/11/26 jQuery
简单了解Vue computed属性及watch区别
2020/07/10 Javascript
python实现中文转换url编码的方法
2016/06/14 Python
django创建自定义模板处理器的实例详解
2017/08/14 Python
Python爬虫爬取一个网页上的图片地址实例代码
2018/01/16 Python
对pandas将dataframe中某列按照条件赋值的实例讲解
2018/11/29 Python
Python爬取智联招聘数据分析师岗位相关信息的方法
2019/08/13 Python
几款好用的python工具库(小结)
2020/10/20 Python
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
毕业生自荐书
2014/02/03 职场文书
2014元旦晚会策划方案
2014/02/19 职场文书
建筑工程专业大学生求职信
2014/04/23 职场文书
学校对教师的评语
2014/04/28 职场文书
卖车协议书范本4篇
2014/10/01 职场文书
财务部岗位职责范本
2015/04/14 职场文书