最近工作不是很忙,学习之余想整理一些代码出来,首先想到的就是是js拖拽。 两年前去某公司面试的时候,曾经被问过这个问题,如何在页面上拖放元素,尽管现在看起来很简单,但当时的我半点思路都没有,面试想当然失败了。 这两天趁空闲整理出一个自由拖拽的jquery插件:jquery.jsDrag.js。

js拖拽主要用到了鼠标三个事件:mousedown、mousemove、mouseup。

mousedown:鼠标按下

mouseup:鼠标松开

mousemove:鼠标移动

mousedown和click的区别:鼠标点击的整个过程会发生 mousedown→mouseup→click三个事件, click在最后鼠标松开之后才会发生。

htm框架:<div class="jsDrag" ><div class="drager"></div></div>,.drager素是我们点击拖拽的元素,.jsDrag为拖拽元素可移动的空间。

调用方式:$(".jsDrag").drag(setting)  目前提供三种方式,自由拖拽,横向拖拽,纵向拖拽,省略参数的情况下为自由拖拽

现在只接收一个属性

type:free|horizontal|vertical

插件源码:

JS

(function($){
$.fn.extend({
drag: function(setting){
var settting = setting || {};
var config = {
type: "free"
};
config = $.extend(config, setting); this.each(function(){
var $panel = $(this) ;
var $drag = $panel.find(".drager");
var coor = {};
var pos = {};
var flag = false; $drag.mousedown(function(evt){
coor.cX = evt.clientX;
coor.cY = evt.clientY;
pos.left = parseInt($drag.css("left"));
pos.top = parseInt($drag.css("top"));
flag = true;
}); $(document).mousemove(function(evt){
if (flag) {
var maxWidth = $panel.width() - $drag.width();
var maxHeight = $panel.height() - $drag.height();
var nowLeft = (pos.left+(evt.clientX-coor.cX));
var nowTop = (pos.top+(evt.clientY-coor.cY)); pos.left = nowLeft <= 0 ? 0 : (nowLeft > maxWidth ? maxWidth : nowLeft);
pos.top = nowTop <= 0 ? 0 : (nowTop > maxHeight ? maxHeight : nowTop); var cssParam = {"left": pos.left, "top":pos.top};
switch (config.type) {
case "free" :
break;
case "horizontal" :
delete cssParam["top"];
break;
case "vertical" :
delete cssParam["left"];
break;
} $drag.css(cssParam); coor.cX = evt.clientX;
coor.cY = evt.clientY;
}
}).mouseup(function(evt){
flag = false;
});
});
return this;
}
});
})(jQuery);

CSS

.jsDrag {
position:relative;
width:800px;
height:50px;
margin:0 auto;
background:#FF0;
border:1px solid #ccc;
} .drager {
background:#000;
width:10px;
height:10px;
position:absolute;
top:;
left:;
cursor:pointer;
}

需要注意的是,不要给.jsDrag 设置padding等样式, 有需要的话可以把样式设置到.jsDrag父元素上

点击下载demo

jquery插件-自由拖拽的更多相关文章

  1. jQuery插件(拖拽)

    拖曳插件draggable的功能是拖动被绑定的元素,当这个jQuery UI插件与元素绑定后,可以通过调用draggable()方法,实现各种拖曳元素的效果,调用格式如下: $(selector). ...

  2. jquery插件之拖拽改变元素大小

    该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的拖拽改变元素大小的效果,您可以根据自己的实际需求来设置被 ...

  3. jquery插件之拖拽

    该插件乃本博客作者所写,目的在于提升作者的js能力,也给一些js菜鸟在使用插件时提供一些便利,老鸟就悠然地飞过吧. 此插件旨在实现目前较为流行的拖拽效果,您可以根据自己的实际需求来设置被拖拽元素是否可 ...

  4. jQuery网页元素拖拽插件

    效果说明:配合已有CSS样式,载入插件后,网页元素可以随意在窗口内拖拽,设置了原位置半透明和拖拽半透明的效果选项,可根据需要选择.另外,当页面上有多个可拖拽元素时,可以载入另外一个用于设置z-inde ...

  5. jQ插件--时间线插件和拖拽API

    这个时间轴是工作上用到的,自己写了一个, qq空间有时间轴的控件, 百度文库也有时间轴的控件: 百度的时间轴大概是这样的: 用户点击对应的锚链接,  那个三角会滚动, 然后左侧的界面也会滚动: 实际的 ...

  6. 简洁的drag效果,自由拖拽div的实现及注意点

    偶然间看到了以前做的一个简洁的div拖拽效果,修改了一下加点注释,经测试完美通过firefox/chrome/ie6-11,现拿来分享一下. 先说一下实现原理及要点,最主要的有三步.第一步是mouse ...

  7. jquery 实现页面拖拽并保存到cookie

    实现的效果就是页面内的图片可拖拽到任意位置,并将所在位置保存.下次打开页面依然可见.本文是作demo用,实际开发中,位置的数据应保存到数据库中. 好了,开始. 1.准备工作. a.jquery(1.7 ...

  8. JQuery UI的拖拽功能

    JQuery UI是JQuery官方支持的WebUI 代码库,包含底层交互.动画.特效等API,并且封装了一些Web小部件(Widget).同时,JQuery UI继承了jquery的插件支持,有大量 ...

  9. jquery实现可拖拽的div

    由于项目中并未引入前端开发框架easyui.ext.没有现成的控件可以使用,今天时间算是充裕的时候,自己写了一个可以拖拽.放大缩小的例子.欢迎大家指正. 不啰嗦,上代码: 依赖的文件:jquery.j ...

随机推荐

  1. 介绍几款Web服务器性能压力测试工具

    一.http_load 程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载. 但是它不同于大多数压力测试工具,它可以以一个单一的进程运行,一般 ...

  2. MySQL- 常用的MySQL函数,指令等

    MySQL查看版本: status: 或者 select version(); //select @@version MySQL昨天, 一周前 ,一月前 ,一年前的数据 这里主要用到了 DATE_SU ...

  3. CheckStyle:unable to parse configuration stream - Element type "message" must be declared

    版本在1.3以上,包括1.3: <!DOCTYPE module PUBLIC          "-//Puppy Crawl//DTD Check Configuration 1. ...

  4. Java_异常_05_ OutOfMemoryError: Java heap space

    一.异常现象: 二.异常原因 JAVA的堆栈设置太小 注: 出现此异常之后,会引发其他的问题. 三.异常解决 手动设置Heap size: 修改 TOMCAT_HOME/bin/catalina.sh ...

  5. java try中包含return语句,finally中的return语句返回顺序

    //结论: finally 中的代码比 return 和 break 语句后执行 public static void main(String[] args) { int x=new Test.tes ...

  6. codeforces 652B B. z-sort(水题)

    题目链接: B. z-sort time limit per test 1 second memory limit per test 256 megabytes input standard inpu ...

  7. xxx was built without full bitcode" 编译错误解决

    xxx was built without full bitcode" 编译错误解决 iOS 打包上线 All object files and libraries for bitcode ...

  8. IE input 去掉文本框的叉叉和密码输入框的眼睛图标

    ::-ms-clear, ::-ms-reveal{display: none;}

  9. BZOJ1012:[JSOI2008]最大数

    浅谈栈:https://www.cnblogs.com/AKMer/p/10278222.html 题目传送门:https://lydsy.com/JudgeOnline/problem.php?id ...

  10. BZOJ4756:[USACO2017JAN]Promotion Counting

    浅谈线段树合并:https://www.cnblogs.com/AKMer/p/10251001.html 题目传送门:https://lydsy.com/JudgeOnline/problem.ph ...