div跟随鼠标移动+上浮定位+移动放置 添加与删除

html代码

<html lang="zh-CN">
<head>
  <script src="http://code.jquery.com/jquery-latest.js"></script>
<meta charset="utf-8">
</head>

<body>
<div>
  <table class="frame">
    <tr>
      <td style="width: 5%;">
        <div class="labelTitle">类别1</div>
      </td>
      <td style="width: 95%;">
        <div class="labelBody" dataa="1" style="background-color: red" distanceTime="90" duration="65" id="abc">内容<br/>222</div>
          <div class="labelBody" dataa="2" style="background-color: #b2dba1" distanceTime="0" duration="1919" id="abcd">内容<br/>送333</div>
          <div class="labelBody" dataa="3" style="background-color: #b2dba1" distanceTime="120" duration="65" id="abcde">内容<br/>送444</div>
      </td>
    </tr>
    <tr>
      <td style="width: 5%;">
        <div class="labelTitle">类别2</div>
      </td>
      <td style="width: 95%;">
        <div class="labelBody" dataa="5" style="background-color: red" distanceTime="300" duration="65" id="bc">内容<br/>送</div>
        <div class="labelBody" dataa="4" style="background-color: red" distanceTime="260" duration="65" id="bcd">内容<br/>送</div>
      </td>
    </tr>
    <tr>
      <td style="width: 5%;">
        <div class="labelTitle">类别3</div>
      </td>
      <td style="width: 95%;">
        <div class="labelBody" dataa="7" style="background-color: red" distanceTime="150" duration="65" id="c">内容<br/>送</div>
        <div class="labelBody" dataa="6" style="background-color: red" distanceTime="130" duration="65" id="cd">内容<br/>送</div>
      </td>
    </tr>
  </table>
  <table id="timeAxis"  border="1" bordercolor="#a0c6e5" style="border-collapse:collapse;" class="frame">
    <tr id="timeAxisTr">
      <td style="width:5%;" align="center">
        用户\时间
      </td>
    </tr>
    <tr style="height: 52px" class="driverTr" id="driverId">
      <th>老司机1</th>
        <div style="border-top:2px dashed #000;" class="dottedLine" id="driverIddottedLine"></div>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
        <td></td>
    </tr>
      <tr style="height: 52px" class="driverTr"  id="driverId2">
          <th>老司机2</th>
          <div class="dottedLine" id="driverId2dottedLine"></div>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
      <tr style="height: 52px" class="driverTr"  id="driverId3">
          <th>老司机3</th>
          <div style="border-bottom:2px dashed #000;" class="dottedLine" id="driverId3dottedLine"></div>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
          <td></td>
      </tr>
  </table>
<div id="textbox" style="display: none;width: 100px;height: 100px;border:1px solid #000000;position:absolute;background-color: #adadad"></div>
    <div id="divCopy" style="border:1px solid #000000;display: none;position:absolute;cursor:pointer;"></div>
</div>



<script  type="text/javascript" src="designatePlatform.js"></script>
</body>
</html>

css代码

<style type="text/css">
  /* 带边框样式 宽为页面宽度 */
  .frame { border:1px solid #000000;width:100%;}
  /*  边框 和 银灰色背景色 和 居中效果 */
  .labelTitle{ border:1px solid #000000;background-color: #d0d0d0;width:70px ;height:50px;margin-top: auto;margin-left:10%}
  /* 带边框 div左对齐 */
  .labelBody{ border:1px solid #000000;width:70px ;height:50px;float:left;cursor:pointer;/*鼠标手样式*/}
    div{
        -webkit-border-radius: 8px;
        -moz-border-radius: 8px;
        border-radius: 8px;
        -webkit-box-shadow: #666 0px 0px 10px;
        -moz-box-shadow: #666 0px 0px 10px;
        box-shadow: #666 0px 0px 10px;
    }
    .dottedLine{border-left:2px dashed #000;border-right:2px dashed #000;position:absolute;z-index:-1;display: none;}
</style>

js代码

$(function () {
    var isCopy = false;//是否触发copy方法
    var isSelectDriver;//拖动后是否选中所选司机
    var isLetGo;//释放复制的div
    //div漂浮后鼠标与div左上角的距离
    var divDistanceX;
    var divDistanceY;
    //需要添加一个判定条件  判定删选司机不为空*********************************************************************************************************************************************************************************************
    var tdWidth = document.getElementById("timeAxis").rows[1].cells[1].offsetWidth;
    var tdHeight = document.getElementById("timeAxis").rows[1].cells[1].offsetHeight;
    $(".dottedLine").css('height',tdHeight-1);
    //********************************************************************************************************************************************
    var day = new Date(Date.parse("2018-12-31" + " 00:00:00".replace(/-/g,"/")));

    // 遍历添加时间轴th开始
    var el = "";
    var time = 20;///时间轴th起始时间
    var dayNumber = 0;// 时间轴天数
    var hourNumber = 32;//时间轴th小时数
    var timeAxisTr = document.getElementById("timeAxisTr");
    for(var i = 0;i < hourNumber;i++){
        var str = "";
        if(time > 23){
            time = 0;
            ++dayNumber;
            if(dayNumber == 1)el = day.getMonth() + 1 + "-" + day.getDate() + "<br/>" + str;
            if(dayNumber == 2){
                day.setTime(day.getTime()+24*60*60*1000);
                el =day.getMonth() + 1 + "-" + day.getDate() + "<br/>";
            }
        }
        if(time < 10)str = 0;
        timeAxisTr.innerHTML += "<th colspan='2' style='text-align: center'>"+ el + str + time+":00</th>"
        ++time;
        el = "";
    }
    // 遍历添加时间轴th结束

    /**
     * 让copyDiv 跟随鼠标移动
     */
    $(window).on('mousemove', function(e) {
        if(isCopy){
            var divcopy = document.getElementById("divCopy");
            divcopy.style.left = e.pageX - divDistanceX + "px";
            divcopy.style.top = e.pageY  - divDistanceY + "px";
            if(isCopy){
                setDottedLine(divcopy);//设置虚线
            }
        }
    });

    /**
     * 鼠标在订单上浮移动时触发的显示
     */
    $(".labelBody").mousemove(function(event){
        var div = document.getElementById("textbox");
        if(div.style.display != "inline"){
            div.style.display = "inline";
            div.innerHTML = "<span>"+$(this).attr("dataa")+"</span>";
        }
        //设置左上角起点位置
        div.style.left = event.clientX +10+ "px";
        div.style.top = event.clientY + 10+"px";
        //设置虚线
        setDottedLine(this);
    });

    /**
     *  鼠标在订单上按下鼠标左键时触发的显示
     */
    $(".labelBody").mousedown(function(event){
        if(event.button == 0 || event.button == 1){
            divCopyfunction(this,false);
            this.style.backgroundColor = '#e3e3e3';
            setDottedLine(this);
        }
    });

    /**
     *  鼠标在订单上松开鼠标离开时触发的显示
     */
    $(".labelBody").mouseout(function(){
        document.getElementById("textbox").style.display = "none";
        hideDottedLine();
    });

    /**
     * 设置虚线
     * @param orderDiv 订单标签Dom对象
     */
    function setDottedLine(orderDiv){
        if($(".dottedLine").css('display') != "inline") {
            $(".dottedLine").css('display', 'inline');
        }
        var trArray = $("#timeAxis tr");
        for(var i = 1;i < trArray.length;i++){
            var tr = $(trArray[i]);
            var dottedLineDiv = $("#" + tr.attr('id') + 'dottedLine');
            var distanceTime = Number($(orderDiv).attr("distanceTime"));
            var duration = Number($(orderDiv).attr("duration"));
            //计算左上角坐标
            var blankSpace = (except(distanceTime,30)+"").split(".")[0];//前面空余格数
            var surplusTime = subtraction(distanceTime,multiplication(blankSpace,30));//剩余分钟数
            var td = tr.children('td')[blankSpace];
            var x = findPosX(td);
            if(surplusTime > 0){
                x = add(x,multiplication(except(td.offsetWidth,30),surplusTime));
            }
            //计算右上角坐标
            var addNumber = add(distanceTime,duration);
            var blankSpace = (except(addNumber,30)+"").split(".")[0];//前面空余格数
            var surplusTime = subtraction(addNumber,multiplication(blankSpace,30));//剩余分钟数
            var td = tr.children('td')[blankSpace];
            var y = findPosX(td);
            if(surplusTime > 0){
                y = add(y,multiplication(except(td.offsetWidth,30),surplusTime));
            }
            dottedLineDiv.css({
                width:subtraction(y,x),
                top:findPosY(td),
                left:x
            });
        }
    }

    /**
     * 隐藏虚线框
     */
    function hideDottedLine(){
        if($(".dottedLine").css("display") != "none"){
            $(".dottedLine").css('display', 'none');
        }
    }

    /**
     *  复制当前选中的div所有属性
     * @param div  目标dom对象
     * @param isAssignmentOrder 是否是已分配的订单
     */
    function divCopyfunction(div,isAssignmentOrder){
        isCopy = true;
        isSelectDriver = false;
        isLetGo = false;
        var divJQ = $(div);
        var divcopy = document.getElementById("divCopy");
        divcopy.style.display = "inline";
        divcopy.style.left = divJQ.offset().left;
        divcopy.style.top = divJQ.offset().top;
        divcopy.innerHTML = div.innerHTML;
        divcopy.style.backgroundColor =div.style.backgroundColor;
        var y = div.offsetHeight;
        var x = div.offsetWidth;
        divcopy.style.height = y;
        divcopy.style.width = x;
        var divcopyJQ = $(divcopy);
        divcopyJQ.attr("distanceTime",divJQ.attr("distanceTime"));
        divcopyJQ.attr("duration",divJQ.attr("duration"));
        if(isAssignmentOrder){
            divcopyJQ.attr("divId",divJQ.attr("divId"));
        }else{
            divcopyJQ.attr("divId",divJQ.attr("id"));
        }
        divcopyJQ.attr("dataa",divJQ.attr("dataa"));
        divDistanceX = except(x,2);
        divDistanceY = except(y,2);
        //松开鼠标后
        divcopy.onmouseup = function (event) {
            if(isCopy){
                isLetGo = true;
                reset (divcopy,div)
                if(isAssignmentOrder){
                    document.getElementById(divJQ.attr("divId")).style.display = "inline";
                    divJQ.remove();
                }
                setTimeout(function(){
                    isLetGo = false;
                },100);
                isCopy = false;
            }
        }
    }

    /**
     * 鼠标移动copyDiv后在时间表格中的Tr上放开后触发方法
     */
    $(".driverTr").mouseover(function (event) {
        if(isLetGo){
            hideDottedLine();
            var divCopy = document.getElementById("divCopy");
            var divCopyJQ = $(divCopy);
            var distanceTime = Number(divCopyJQ.attr("distanceTime"));//距离起始位置时间长度
            var duration = Number(divCopyJQ.attr("duration"));
            //计算左上角坐标
            var blankSpace = (except(distanceTime,30)+"").split(".")[0];//前面空余格数
            var surplusTime = subtraction(distanceTime,multiplication(blankSpace,30));//剩余分钟数
            var td = $(this).children('td')[blankSpace];
            var x = findPosX(td);
            if(surplusTime > 0){
                x = add(x,multiplication(except(td.offsetWidth,30),surplusTime));
            }
            //计算右上角坐标
            var addNumber = add(distanceTime,duration);
            var blankSpace = (except(addNumber,30)+"").split(".")[0];//前面空余格数
            var surplusTime = subtraction(addNumber,multiplication(blankSpace,30));//剩余分钟数
            var td = $(this).children('td')[blankSpace];
            var y = findPosX(td);
            if(surplusTime > 0){
                y = add(y,multiplication(except(td.offsetWidth,30),surplusTime));
            }

            var div = document.createElement("div");//创建DIV
            div.style.width = subtraction(y,x);
            div.style.height = td.offsetHeight;
            div.style.left = x;
            div.style.top = findPosY(td);
            div.style.position = "absolute";
            div.style.border = "1px solid #000000";
            div.style.opacity=0.7;
            div.style.backgroundColor = divCopy.style.backgroundColor;
            div.setAttribute("dataa",divCopyJQ.attr("dataa"));
            div.setAttribute("class","labelBody");
            div.setAttribute("divId",divCopyJQ.attr("divId"));
            div.setAttribute("distanceTime",divCopyJQ.attr("distanceTime"));
            div.setAttribute("duration",divCopyJQ.attr("duration"));
            div.innerHTML = divCopy.innerHTML;



            /**
             * 鼠标在订单上浮移动时触发的显示
             */
            $(div).mousemove(function(event){
                var div = document.getElementById("textbox");
                if(div.style.display != "inline"){
                    div.style.display = "inline";
                    div.innerHTML = "<span>"+$(this).attr("dataa")+"</span>";
                }
                //设置左上角起点位置
                div.style.left = event.clientX +10+ "px";
                div.style.top = event.clientY + 10+"px";
            });

            /**
             *  鼠标在订单上按下鼠标左键时触发的显示
             */
            $(div).mousedown(function(event){
                if(event.button == 0 || event.button == 1){
                    divCopyfunction(div,true);
                    this.style.backgroundColor = '#e3e3e3';
                }
            });

            /**
             *  鼠标在订单上松开鼠标离开时触发的显示
             */
            $(div).mouseout(function(){
                document.getElementById("textbox").style.display = "none";
                hideDottedLine();
            });

            document.getElementById("timeAxis").appendChild(div);
            document.getElementById(divCopyJQ.attr("divId")).style.display = "none";
            isLetGo = false;
            isCopy = false;
        }
    });

});

/**
 * 计算元素左上角x坐标
 * @param obj dom对象
 * @returns {number}
 */
function findPosX(obj) {
    var curleft = 0;

    if (obj.offsetParent) { //返回父类元素,大多说offsetParent返回body
        while (obj.offsetParent) {//遍历所有父类元素
            curleft += obj.offsetLeft;//当前元素的左边距
            obj = obj.offsetParent;
        }
    } else if (obj.x) curleft += obj.x;
    return curleft;
}

/**
 * 计算元素左上角y坐标
 * @param obj dom对象
 * @returns {number}
 */
function findPosY(obj) {
    var curtop = 0;

    if (obj.offsetParent) {
        while (obj.offsetParent) {

            curtop += obj.offsetTop;
            obj = obj.offsetParent;
        }
    } else if (obj.y) curtop += obj.y;
    return curtop;
}

/*
* 原有属性重置
* */
function reset (divcopy,div) {
    divcopy.style.display = "none";
    var dottedLineList = document.getElementsByClassName("dottedLine");
    for(var i = 0;i < dottedLineList.length;i++){
        dottedLineList[i].style.display = "none";
    }
    divcopy.onmousemove = undefined;
    div.style.backgroundColor = divcopy.style.backgroundColor;
}

/**
 * 加
 **/
function add (arg1, arg2) {
    if(arg1 == undefined && arg2 == undefined)return 0;
    if(arg1 == undefined)arg1 = 0;
    if(arg2 == undefined)arg2 = 0;
    var r1, r2, m, c;
    try {
        r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
        r2 = 0;
    }
    c = Math.abs(r1 - r2);
    m = Math.pow(10, Math.max(r1, r2));
    if (c > 0) {
        var cm = Math.pow(10, c);
        if (r1 > r2) {
            arg1 = Number(arg1.toString().replace(".", ""));
            arg2 = Number(arg2.toString().replace(".", "")) * cm;
        } else {
            arg1 = Number(arg1.toString().replace(".", "")) * cm;
            arg2 = Number(arg2.toString().replace(".", ""));
        }
    } else {
        arg1 = Number(arg1.toString().replace(".", ""));
        arg2 = Number(arg2.toString().replace(".", ""));
    }
    return (arg1 + arg2) / m;
};

/**
 * 减
 **/
function subtraction (arg1, arg2) {
    if(arg1 == undefined && arg2 == undefined)return 0;
    if(arg1 == undefined)arg1 = 0;
    if(arg2 == undefined)arg2 = 0;
    var r1, r2, m, n;
    try {
        r1 = arg1.toString().split(".")[1].length;
    } catch (e) {
        r1 = 0;
    }
    try {
        r2 = arg2.toString().split(".")[1].length;
    } catch (e) {
        r2 = 0;
    }
    m = Math.pow(10, Math.max(r1, r2)); //last modify by deeka //动态控制精度长度
    n = (r1 >= r2) ? r1 : r2;
    return Number(((arg1 * m - arg2 * m) / m).toFixed(n));
};

/**
 * 乘
 **/
function multiplication (arg1, arg2) {
    if(arg1 == undefined || arg2 == undefined)return 0;
    var m = 0, s1 = arg1.toString(), s2 = arg2.toString();
    try {
        m += s1.split(".")[1].length;
        m += s2.split(".")[1].length;
    } catch (e) {}
    return Number(s1.replace(".", "")) * Number(s2.replace(".", "")) / Math.pow(10, m);
};

/**
 * 除法
 **/
function except (arg1, arg2) {
    if (arg1 == undefined || arg2 == "" || arg2 == undefined || arg2 == 0) return 0;
    var t1 = 0, t2 = 0, r1, r2;
    try {
        t1 = arg1.toString().split(".")[1].length;
        t2 = arg2.toString().split(".")[1].length;
    }
    catch (e) {}
    with (Math) {
        r1 = Number(arg1.toString().replace(".", ""));
        r2 = Number(arg2.toString().replace(".", ""));
        return (r1 / r2) * pow(10, t2 - t1);
    }
}

效果图1  初始化

上浮样式

拖动后效果

拖动移出时间表格后回退

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值