| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586 |
- /*! Tdrag 0.0.1 */
- /**
- * Created by Tezml on 2016/5/26
- * You can modify my source code, if you have a good idea or a problem can be encountered by e-mail: tezml@tezml.com to find me.
- * 如果你想在项目中使用该插件,请不要删除该注释。
- */
- ;(function($,window,document,undefined){
- jQuery(function() {
- //插件制作
- $.fn.Tdrag = function (opt) {
- var call = {
- scope: null,//父级
- grid: null,//网格
- axis:"all",//上下或者左右
- pos:false,//是否记住位置
- handle:null,//手柄
- moveClass:"tezml",//移动时不换位加的class
- dragChange:false,//是否开启拖拽换位
- changeMode:"point",//point & sort
- cbStart:function(){},//移动前的回调函数
- cbMove:function(){},//移动中的回调函数
- cbEnd:function(){},//移动结束时候的回调函数
- random:false,//是否自动随机排序
- randomInput:null,//点击随机排序的按钮
- animation_options:{//运动时的参数
- duration:800,//每次运动的时间
- easing:"ease-out"//移动时的特效,ease-out、ease-in、linear
- },
- disable:false,//禁止拖拽
- disableInput:null//禁止拖拽的按钮
- };
- var dragfn = new Dragfn(this, opt);
- if (opt && $.isEmptyObject(opt) == false) {
- dragfn.options = $.extend(call, opt);
- } else {
- dragfn.options = call;
- }
- dragfn.firstRandom=true;
- var ele = dragfn.$element;
- dragfn.pack(ele,false);
- if(dragfn.options.randomInput!=null){
- $(dragfn.options.randomInput).bind("click",function(){
- dragfn.pack(ele,true);
- })
- }
- //加载拓展jquery的函数
- dragfn.loadJqueryfn()
- };
- //依赖构造函数
- var Dragfn = function (ele, opt) {
- this.$element = ele;
- this.options = opt;
- };
- //构造函数方法
- Dragfn.prototype = {
- init: function (obj) {
- var self = this;
- self.ele=self.$element;
- self.handle=$(obj);//手柄
- self.options = self.options;
- self.disable = self.options.disable;
- self._start = false;
- self._move = false;
- self._end = false;
- self.disX = 0;
- self.disY = 0;
- self.zIndex=1000;
- self.moving=false;
- self.moves="";
- //父级
- self.box = $.type(self.options.scope)==="string" ? self.options.scope : null;
- //手柄
- if(self.options.handle!=null){
- self.handle=$(obj).find(self.options.handle);
- }
- //三个事件
- self.handle.on("mousedown", function (ev) {
- self.start(ev, obj);
- obj.setCapture && obj.setCapture();
- return false;
- });
- if(self.options.dragChange) {
- $(obj).on("mousemove", function (ev) {
- self.move(ev, obj);
- });
- $(obj).on("mouseup", function (ev) {
- self.end(ev, obj);
- });
- }else{
- $(document).on("mousemove", function (ev) {
- self.move(ev, obj);
- });
- $(document).on("mouseup", function (ev) {
- self.end(ev, obj);
- });
- }
- },
- //jquery调取函数时候用
- loadJqueryfn: function(){
- var self=this;
- $.extend({
- //返回按照index排序的回调函数
- sortBox:function(obj){
- var arr=[];
- for (var s = 0; s < $(obj).length; s++) {
- arr.push($(obj).eq(s));
- }
- for ( var i = 0; i < arr.length; i++) {
- for ( var j = i + 1; j < arr.length; j++) {
- if(Number(arr[i].attr("index")) > Number(arr[j].attr("index"))){
- var temp = arr[i];
- arr[i] = arr[j];
- arr[j] = temp;
- }
- }
- }
- return arr
- },
- //随机排序函数
- randomfn:function(obj){
- self.pack($(obj),true);
- },
- //开启拖拽
- disable_open:function(){
- self.disable=false;
- },
- //禁止拖拽
- disable_cloose:function(){
- self.disable=true;
- }
- });
- },
- toDisable: function(){
- var self=this;
- if(self.options.disableInput!=null){
- $(self.options.disableInput).bind("click",function(){
- if(self.disable==true){
- self.disable=false
- }else{
- self.disable=true
- }
- })
- }
- },
- start: function (ev, obj) {
- var self = this;
- self.moved=obj;
- if (self.disable == true) {
- return false
- }
- self._start = true;
- var oEvent = ev || event;
- self.disX = oEvent.clientX - obj.offsetLeft;
- self.disY = oEvent.clientY - obj.offsetTop;
- $(obj).css("zIndex",self.zIndex++);
- self.options.cbStart();
- },
- move: function (ev, obj) {
- var self = this;
- if (self._start != true) {
- return false
- }
- if(obj!=self.moved){
- return false
- }
- self._move = true;
- var oEvent = ev || event;
- var l = oEvent.clientX - self.disX;
- var t = oEvent.clientY - self.disY;
- //有父级限制
- if (self.box != null) {
- var rule = self.collTestBox(obj,self.box);
- if (l > rule.lmax) {
- l = rule.lmax;
- } else if (l < rule.lmin) {
- l = rule.lmin;
- }
- if (t > rule.tmax) {
- t = rule.tmax;
- } else if (t < rule.tmin) {
- t = rule.tmin;
- }
- }
- if(self.options.axis=="all"){
- obj.style.left = self.grid(obj, l, t).left + 'px';
- obj.style.top = self.grid(obj, l, t).top + 'px';
- }else if(self.options.axis=="y"){
- obj.style.top = self.grid(obj, l, t).top + 'px';
- }else if(self.options.axis=="x"){
- obj.style.left = self.grid(obj, l, t).left + 'px';
- }
- /* if(self.options.changeWhen=="move") {
- if (self.options.changeMode == "sort") {
- self.sortDrag(obj);
- } else if (self.options.changeMode == "point") {
- self.pointmoveDrag(obj);
- }
- }else{
- self.moveAddClass(obj);
- }*/
- if(self.options.pos==true){
- self.moveAddClass(obj);
- }
- self.options.cbMove(obj,self);
- },
- end: function (ev, obj) {
- var self = this;
- if (self._start != true) {
- return false
- }
- if(self.options.changeMode=="sort"&&self.options.pos==true){
- self.sortDrag(obj);
- }else if(self.options.changeMode=="point"&&self.options.pos==true){
- self.pointDrag(obj);
- }
- if(self.options.pos==true){
- self.animation(obj, self.aPos[$(obj).attr("index")]);
- }
- self.options.cbEnd();
- if(self.options.handle!=null){
- $(obj).find(self.options.handle).unbind("onmousemove");
- $(obj).find(self.options.handle).unbind("onmouseup");
- }else{
- $(obj).unbind("onmousemove");
- $(obj).unbind("onmouseup");
- }
- obj.releaseCapture && obj.releaseCapture();
- self._start = false;
- },
- //算父级的宽高
- collTestBox: function (obj, obj2) {
- var self = this;
- var l1 = 0;
- var t1 = 0;
- var l2 = $(obj2).innerWidth() - $(obj).outerWidth();
- var t2 = $(obj2).innerHeight() - $(obj).outerHeight();
- return {
- lmin: l1,//取的l最小值
- tmin: t1,//取的t最小值
- lmax: l2,//取的l最大值
- tmax: t2//取的t最大值
- }
- },
- //算父级宽高时候干掉margin
- grid: function (obj, l, t) {//cur:[width,height]
- var self = this;
- var json = {
- left: l,
- top: t
- };
- if ($.isArray(self.options.grid) && self.options.grid.length == 2) {
- var gx = self.options.grid[0];
- var gy = self.options.grid[1];
- json.left = Math.floor((l + gx / 2) / gx) * gx;
- json.top = Math.floor((t + gy / 2) / gy) * gy;
- return json
- } else if (self.options.grid == null) {
- return json
- } else {
- console.log("grid参数传递格式错误");
- return false
- }
- },
- findNearest: function(obj){
- var self=this;
- var iMin=new Date().getTime();
- var iMinIndex=-1;
- var ele=self.ele;
- for(var i=0;i<ele.length;i++){
- if(obj==ele[i]){
- continue;
- }
- if(self.collTest(obj,ele[i])){
- var dis=self.getDis(obj,ele[i]);
- if(dis<iMin){
- iMin=dis;
- iMinIndex=i;
- }
- }
- }
- if(iMinIndex==-1){
- return null;
- }else{
- return ele[iMinIndex];
- }
- },
- getDis: function(obj,obj2){
- var self=this;
- var l1=obj.offsetLeft+obj.offsetWidth/2;
- var l2=obj2.offsetLeft+obj2.offsetWidth/2;
- var t1=obj.offsetTop+obj.offsetHeight/2;
- var t2=obj2.offsetTop+obj2.offsetHeight/2;
- var a=l2-l1;
- var b=t1-t2;
- return Math.sqrt(a*a+b*b);
- },
- collTest: function(obj,obj2){
- var self=this;
- var l1=obj.offsetLeft;
- var r1=obj.offsetLeft+obj.offsetWidth;
- var t1=obj.offsetTop;
- var b1=obj.offsetTop+obj.offsetHeight;
- var l2=obj2.offsetLeft;
- var r2=obj2.offsetLeft+obj2.offsetWidth;
- var t2=obj2.offsetTop;
- var b2=obj2.offsetTop+obj2.offsetHeight;
- if(r1<l2 || r2<l1 || t2>b1 || b2<t1){
- return false;
- }else{
- return true;
- }
- },
- //初始布局转换
- pack: function(ele,click){
- var self=this;
- self.toDisable();
- if(self.options.pos==false){
- for (var i = 0; i < ele.length; i++) {
- $(ele[i]).css("position", "absolute");
- $(ele[i]).css("margin", "0");
- self.init(ele[i]);
- }
- }else if(self.options.pos==true) {
- var arr = [];
- if (self.options.random || click) {
- while (arr.length < ele.length) {
- var n = self.rnd(0, ele.length);
- if (!self.finInArr(arr, n)) {//没找到
- arr.push(n);
- }
- }
- }
- if (self.options.random == false || click != true) {
- var n = 0;
- while (arr.length < ele.length) {
- arr.push(n);
- n++
- }
- }
- //如果是第二次以后随机列表,那就重新排序后再随机,因为我智商不够使,不会排了
- if (self.firstRandom == false) {
- var sortarr = [];
- var n = 0;
- while (sortarr.length < ele.length) {
- sortarr.push(n);
- n++
- }
- for (var i = 0; i < ele.length; i++) {
- $(ele[i]).attr("index", sortarr[i]);
- $(ele[i]).css("left", self.aPos[sortarr[i]].left);
- $(ele[i]).css("top", self.aPos[sortarr[i]].top);
- }
- }
- //布局转化
- self.aPos = [];
- if (self.firstRandom == false) {
- //不是第一次
- for (var j = 0; j < ele.length; j++) {
- self.aPos[j] = {
- left: ele[$(ele).eq(j).attr("index")].offsetLeft,
- top: ele[$(ele).eq(j).attr("index")].offsetTop
- };
- }
- } else {
- //第一次
- for (var j = 0; j < ele.length; j++) {
- self.aPos[j] = {left: ele[j].offsetLeft, top: ele[j].offsetTop};
- }
- }
- //第二个循环布局转化
- for (var i = 0; i < ele.length; i++) {
- $(ele[i]).attr("index", arr[i]);
- $(ele[i]).css("left", self.aPos[arr[i]].left);
- $(ele[i]).css("top", self.aPos[arr[i]].top);
- $(ele[i]).css("position", "absolute");
- $(ele[i]).css("margin", "0");
- self.init(ele[i]);
- }
- self.firstRandom = false;
- }
- },
- //移动时候加class
- moveAddClass: function(obj){
- var self=this;
- var oNear=self.findNearest(obj);
- $(self.$element).removeClass(self.options.moveClass);
- if(oNear && $(oNear).hasClass(self.options.moveClass)==false){
- $(oNear).addClass(self.options.moveClass);
- }
- },
- //给li排序
- sort: function(){
- var self=this;
- var arr_li=[];
- for (var s = 0; s < self.$element.length; s++) {
- arr_li.push(self.$element[s]);
- }
- for ( var i = 0; i < arr_li.length; i++) {
- for ( var j = i + 1; j < arr_li.length; j++) {
- if(Number($(arr_li[i]).attr("index")) > Number($(arr_li[j]).attr("index"))){
- var temp = arr_li[i];
- arr_li[i] = arr_li[j];
- arr_li[j] = temp;
- }
- }
- }
- return arr_li;
- },
- //点对点的方式换位
- pointDrag: function(obj){
- var self=this;
- //先拍序
- var oNear=self.findNearest(obj);
- if (oNear) {
- self.animation(obj,self.aPos[$(oNear).attr("index")]);
- self.animation(oNear, self.aPos[$(obj).attr("index")]);
- var tmp;
- tmp = $(obj).attr("index");
- $(obj).attr("index", $(oNear).attr("index"));
- $(oNear).attr("index", tmp);
- $(oNear).removeClass(self.options.moveClass);
- } else if (self.options.changeWhen == "end") {
- self.animation(obj, self.aPos[$(obj).attr("index")]);
- }
- },
- //排序的方式换位
- sortDrag: function(obj){
- var self=this;
- //先拍序
- var arr_li=self.sort();
- //换位置
- var oNear=self.findNearest(obj);
- if(oNear){
- if(Number($(oNear).attr("index"))>Number($(obj).attr("index"))){
- //前换后
- var obj_tmp=Number($(obj).attr("index"));
- $(obj).attr("index",Number($(oNear).attr("index"))+1);
- for (var i = obj_tmp; i < Number($(oNear).attr("index"))+1; i++) {
- self.animation(arr_li[i],self.aPos[i-1]);
- self.animation(obj,self.aPos[$(oNear).attr("index")]);
- $(arr_li[i]).removeClass(self.options.moveClass);
- $(arr_li[i]).attr("index",Number($(arr_li[i]).attr("index"))-1);
- }
- }else if(Number($(obj).attr("index"))>Number($(oNear).attr("index"))){
- //后换前
- var obj_tmp=Number($(obj).attr("index"));
- $(obj).attr("index",$(oNear).attr("index"));
- for (var i = Number($(oNear).attr("index")); i < obj_tmp; i++) {
- self.animation(arr_li[i],self.aPos[i+1]);
- self.animation(obj,self.aPos[Number($(obj).attr("index"))]);
- $(arr_li[i]).removeClass(self.options.moveClass);
- $(arr_li[i]).attr("index",Number($(arr_li[i]).attr("index"))+1);
- }
- }
- }else{
- self.animation(obj,self.aPos[$(obj).attr("index")]);
- }
- },
- //运动函数(后期再加参数)
- animation: function(obj,json){
- var self=this;
- //考虑默认值
- var options=self.options.animation_options; /*|| {};
- options.duration=self.options.animation_options.duration || 800;
- options.easing=options.easing.duration.easing || 'ease-out';*/
- var self=this;
- var count=Math.round(options.duration/30);
- var start={};
- var dis={};
- for(var name in json){
- start[name]=parseFloat(self.getStyle(obj,name));
- if(isNaN(start[name])){
- switch(name){
- case 'left':
- start[name]=obj.offsetLeft;
- break;
- case 'top':
- start[name]=obj.offsetTop;
- break;
- case 'width':
- start[name]=obj.offsetWidth;
- break;
- case 'height':
- start[name]=obj.offsetHeight;
- break;
- case 'marginLeft':
- start[name]=obj.offsetLeft;
- break;
- case 'borderWidth':
- start[name]=0;
- break;
- //...
- }
- }
- dis[name]=json[name]-start[name];
- }
- var n=0;
- clearInterval(obj.timer);
- obj.timer=setInterval(function(){
- n++;
- for(var name in json){
- switch(options.easing){
- case 'linear':
- var a=n/count;
- var cur=start[name]+dis[name]*a;
- break;
- case 'ease-in':
- var a=n/count;
- var cur=start[name]+dis[name]*a*a*a;
- break;
- case 'ease-out':
- var a=1-n/count;
- var cur=start[name]+dis[name]*(1-a*a*a);
- break;
- }
- if(name=='opacity'){
- obj.style.opacity=cur;
- obj.style.filter='alpha(opacity:'+cur*100+')';
- }else{
- obj.style[name]=cur+'px';
- }
- }
- if(n==count){
- clearInterval(obj.timer);
- options.complete && options.complete();
- }
- },30);
- },
- getStyle: function(obj,name){
- return (obj.currentStyle || getComputedStyle(obj,false))[name];
- },
- //随机数
- rnd: function(n,m){
- return parseInt(Math.random()*(m-n)+n);
- },
- //在数组中找
- finInArr: function(arr,n){
- for(var i = 0 ; i < arr.length; i++){
- if(arr[i] == n){//存在
- return true;
- }
- }
- return false;
- }
- }
- })
- })(jQuery,window,document);
|