jQuery-ui 中 拖放排序插件Sortable.js

菜鸟教程:http://www.runoob.com/jqueryui/example-sortable.html

github官方demo:https://github.com/SortableJS/Sortable

jquery-ui Sortable API中文文档:https://www.html.cn/jquery-ui-api/sortable/

例子链接:https://jqueryui.com/sortable/#placeholder

定义:该插件可以让选择的元素通过拖拽的方式进行列表排序

需要引入的文件: jQuery.js   jquery-ui.css   jquery-ui.js  (自行下载)

支持浏览器: ie9+以上(支持触屏设备)

1.如果你需要一个可以两个容器里面的列表进行互相拖拽

2.如果需要在进行拖拽的时候省了写动画效果

3.如果需要在拖拽的时候有滚动效果

4.如果需要支持css框架,例如bootstrap 

等...................

可以选择改列表排序插件

 API详细介绍:

<script>
    $(function(){
        item1:拖放的容器1的class
        item2:拖放的容器2的class
        js_parent: 容器1
        $("item1").sortble({
            item: ".panel",   //定义拖拽的元素  
            appengTo: $(".js_parent"),    //确定可移动的辅助元素在拖动时可以被添加到何处   
            axis:"x", //拖动元素在水平“x”还是“y”垂直方向进行拖放     默认值:false
            cancel: "a,button",   //选择不进行拖拽的元素
            connectWith: $(".item2"), //多个排序元素之间进行拖拽
            containment: ".js_parent",  //能进行拖拽的范围
            cursor: "move", //拖拽手势
            cursorAt: {left: 10,top:10},  //拖拽的时候鼠标出现的位置
            disabled: false,  //设置为true的时候 禁用sortable
            distance: 5,  //鼠标移动多少距离的时候进行排序事件
            dropOnEmpty:true, //定义是否可以拖拽到其他空白处
            forceHelperSize: false, //如果为true, 强迫辅助元素(helper)有一个尺寸大小
            grid: [10,20],  //移动的x,y边距
            handle: ".panel-heading",  //该参数 提供拖动的指定元素 
            helper:"clone", //不会用这个元素   相当于拖拽的镜像
            opacity:0.6, //拖拽的时候的镜像的透明度
            placeholder: "class",  //设置占位符的样式 
            revert: false, //true的时候拖放的时候有动画 true,false,number
            scroll:false,  //如果设置为 true,当到达边缘时页面会滚动
            scrollSensitivity: 53, //定义鼠标距离边缘多少距离时开始滚动
            scrollSpeed:30 //滚动条滚动速度
            tolerance:"pointer", //指定鼠标超过元素多少时重新排序,"intersect":项目至少 50% 重叠在其他项目上。"pointer":鼠标指针重叠在其他项目上。
            zIndex:999 //当被排序时,元素/助手(helper)元素的 Z-index。
            
            //事件event
            create: function( event, ui ){},  //排序事件被创建
		    activate: function(event, ui){}, //排序事件被激活
            start: function( event, ui ){},  //排序开始时触发
            stop: function( event, ui ){},  //排序结束时触发
		    beforeStop: function( event, ui){},//排序停止时触发该事件
		    change: function( event, ui ){}, //当元素发生排序且坐标已发生改变时触发此事件
		    deactivate: function( event, ui ){},//排序停止时触发该事件
		    out:function( event, ui ){},//当一个元素拖拽移出sortable对象移出并进入另一个sortable对象后触发此事件
		    over:function( event, ui ){},//当一个元素拖拽移入另一个sortable对象后触发此事件
		    remove:function(event, ui){}, //组件移出去
            receive:function(event,ui){},//当一个已连接的sortable对象接收到另一个sortable对象的元素后触发此事件
		    sort: function (event, ui){}, //当元素发生排序时触发此事件
            update(event,ui){}//当排序动作结束时且元素坐标已经发生改变时触发此事件
        }).disableSelection();
    })
        //方法
            $("item1").sortble('destroy') //改元素移除拖拽功能
            $("item1").sortble('disable') //禁用元素的拖拽功能
            $("item1").sortble('enable')  //启用元素的拖拽功能
            $("item1").sortble('option',optionName,[value])  //获取或者设置元素的参数
            $("item1").sortble('serialize' , [options]) //获取或设置序列化后的每个item元素的id属性
            $("item1").sortble('toArray') //获取序列化后的每个item元素的id属性的数组
            $("item1").sortble('refresh')//手动重新刷新当前sortable对象的item元素的排序
            $("item1").sortble('refreshPositions')  //手动重新刷新当前sortable对象的item元素的坐标
            $("item1").sortble('cancel')//取消当前sortable对象中item元素的排序改变
</script>

 实例: (结合boostrap进行使用)

需要引用的文件: jquery.js  bootstrap.min.js jquery-ui.min.js       bootstrap.css  jquery-ui.css

实现的功能: 将item1的列表拖到item2中    按住头部进行拖拽的时候,将内容区进行隐藏加上动画,排序完毕之后,内容区显示加上动画

中途遇到的问题: 按住头部的时候虽然内容隐藏了 但是镜像的内容高度并没有进行隐藏 所以会导致在自己当前列进行排序的时候出现高度问题   

解决方法: 在外部进行点击移动事件的处理  

排序前后的顺序问题: 每个列表上面都记录了data-id(该属性用来记录排序后的顺序)  data-order(该属性用来记录排序前的顺序)

存放到数组里面,传给后台,进行浏览器刷新的时候获取新的排序后的列表 (目前是这种方法,有新的方法后期更新)

 

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <link rel="stylesheet" href="js/bootstrap-3.3.7-dist/css/bootstrap.min.css"></link>
    <link rel="stylesheet" href="css/jquery-ui.css">
    <!-- 引入jquery  (bootstrap 的js 插件需要引入jquery) -->
    <script src="js/jquery.js"></script>
    <script src="js/bootstrap-3.3.7-dist/js/bootstrap.min.js"></script>
    <script src="js/jquery-ui.min.js"></script>
    <style>
        html,body{height: 100%;width: 100%;}
        body{background-color: #e2e2e2;}
        .p-m{padding: 15px;overflow: hidden;}
        .col-md-6{display: table-cell;}
        .col-main,.col-side{width: 49%;vertical-align: top;height: 100%;box-sizing: border-box;display: inline-block;min-height:1000px;}
        .portlet-placeholder {background-color: #dadada;margin: 0 5px;height: 40px;width: 99%;}
        .col-main-md{padding: 5px;width: 100%;}
        .panel {margin-bottom: 0;}
    </style>
</head>
<body>
    <div class="p-m js_content_width">
            <div class="col-main js_connectedSortable js_sortable1 ">
                <div class="col-main-md js_index test_left" data-id="drag1" data-order="order1">
                    <div class="panel panel-default  ">
                        <div class="panel-heading"><div class="panel-title">test1</div></div>
                        <div class="panel-body" >zxczxc</div>
                    </div>
                </div>
                <div class="col-main-md js_index" data-id="drag2" data-order="order2">
                    <div class="panel panel-default ">
                        <div class="panel-heading"><div class="panel-title">test2</div></div>
                        <div class="panel-body" style="height:200px" >asdasdas</div>
                    </div>
                </div>
            </div>
            <div class="col-side js_connectedSortable js_sortable2 js_left">
                <div class="col-main-md js_index" data-id="drag3" data-order="order3">
                    <div class="panel panel-default ">
                        <div class="panel-heading"><div class="panel-title">test3</div></div>
                        <div class="panel-body" style="height:200px" >fasdasd</div>
                    </div>
                </div>
                <div class="col-main-md js_index" data-id="drag4" data-order="order4">
                    <div class="panel panel-default ">
                        <div class="panel-heading"><div class="panel-title">test4</div></div>
                        <div class="panel-body" style="height:300px" >fasdasd</div>
                    </div>
                </div>
            </div>
    </div>
    <script>
    $(function () { 
        var len = $(".js_content_width").find(".js_index").length;
        var oldArr = [];
        var sortArr = [];
        var downpagY,movepagY;
        var dothisTop;
        $(".js_connectedSortable").find(".panel-heading").mousedown(function(e){
            dothisTop= this.offsetTop;
            downpagY = getXY(e);
            document.onmousemove = function(e){ 
                $(".js_connectedSortable").find(".panel-body").animate({height:"hide"},0).removeClass("in");
                movepagY = getXY(e);
            };
            //鼠标松开的时候,释放拖动
            document.onmouseup = function(e){
                    this.onmousemove = null;
                    this.onmouseup = null;
            }
        })
        $(".js_connectedSortable").sortable({
            connectWith: ".js_connectedSortable",
            containment : ".js_content_width", 
            handle: ".panel-heading",  //该参数 提供拖动的指定元素
            placeholder:"portlet-placeholder ui-corner-all", //占位符
            dropOnEmpty: true,  //true可以拖到空白处
            cursor: "move",//排序拖放时的鼠标指针样式
            revert: true, //拖到新位置的时候动画效果
            opacity: "0.6", //排序拖拽的元素的透明度
            forcePlaceholderSize: true,
            start:function(event, ui){ //当排序开始时触发该事件
                // var val = $($(ui.helper)[0]).find(".panel-title").text();
                oldArr = []
                //记录下排序之前的顺序 id order
                $(".js_content_width").find(".js_index").each(function () { 
                    var json = {
                        "id":  $(this).attr("data-id"),
                        "order": $(this).attr("data-order")
                    }
                    oldArr.push(json)
                })
            },
            sort: function (event,ui) { 
                $($(ui.helper)[0]).css({
                    top: movepagY.y - downpagY.y + dothisTop
                })
             },
            stop:function(event,ui){ //拖拽排序完之后触发的事件
                var sortArr = [];
                //排序拖拽之后的动画
                $(".js_connectedSortable").find(".panel-body").slideDown("fast").addClass("in");
                //记录排序之后的顺序
                $(".js_content_width").find(".js_index").each(function (index) { 
                    var json1 = {
                        "id":  $(this).attr("data-id"),
                        "order": oldArr[index].id
                    }
                    sortArr.push(json1)
                })
            }
        }).disableSelection();
        		//获取鼠标的位置。兼容ie678
		function getXY(e){
			var ev = e || window.event;
			var x=0,y=0;
			if(ev.pageX){
				x = ev.pageX;
				y = ev.pageY;
			}else{
				//拿到scrollTop 和scrollLeft
				var sleft = 0,stop = 0;
				//ie678---
				if(document.documentElement){
					stop =document.documentElement.scrollTop;
					sleft = document.documentElement.scrollLeft;
				}else{
				//ie9+ 谷歌 
					stop = document.body.scrollTop;
					sleft = document.body.scrollLeft;
				}	
				x = ev.clientX + sleft;
				y = ev.clientY + stop;
			}
			return {x:x,y:y};
		};
     })
    </script>
</body>
</html>





 实例演示:

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值