zoukankan      html  css  js  c++  java
  • 【转】jquery-ui draggable中div拖动出现辅助线方便对齐(优化)

    <html>
      <head>
        <link rel="stylesheet" href="./jquery-ui-1.12.1/jquery-ui.min.css" />
        <title>实现div拖拽时出现辅助线,以方便和其它div很容易的对齐</title>
      </head>
    
      <body>
        <div class="container">
          <!-- 需要拖动的div -->
          <div class="draggable">第一个div</div>
          <div class="draggable">第二个div</div>
          <div class="draggable">第三个div</div>
          <div class="draggable">第四个div</div>
          <div class="draggable">第五个div</div>
          <div class="draggable">第六个div</div>
    
          <!-- 拖动辅助线 -->
          <div id="guide-h" class="guide"></div>
          <div id="guide-v" class="guide"></div>
        </div>
    
        <script src="./jquery-ui-1.12.1/external/jquery/jquery.js"></script>
        <script src="./jquery-ui-1.12.1/jquery-ui.min.js"></script>
        <script type="text/javascript">
          var MIN_DISTANCE = 8 //捕获的最小距离
          var guides = [] // 指标拖动辅助标线
          var innerOffsetX, innerOffsetY
    
          $('.draggable').draggable({
            start: function(event, ui) {
              guides = $.map($('.draggable').not(this), computeGuidesForElement)
              // offsetX、offsetY:源元素(srcElement)的X, Y坐标
              innerOffsetX = event.offsetX
              innerOffsetY = event.offsetY
            },
            drag: function(event, ui) {
              // 迭代所有的guids,记住最近的h和v guids
              var guideV,
                guideH,
                distV = MIN_DISTANCE + 1,
                distH = MIN_DISTANCE + 1,
                offsetV,
                offsetH
    
              var chosenGuides = {
                top: {
                  dist: MIN_DISTANCE + 1
                },
                left: {
                  dist: MIN_DISTANCE + 1
                }
              }
              var $t = $(this)
              // pageX、pageY:文档坐标x、y
              var pos = {
                // top: event.pageY - innerOffsetY,
                // left: event.pageX - innerOffsetX
                top: event.clientY - innerOffsetY,
                left: event.clientX - innerOffsetX
              }
              // outerHeight、outerWidth:整个浏览器的高度、宽度
              var w = $t.outerWidth() - 1
              var h = $t.outerHeight() - 1
              var elemGuides = computeGuidesForElement(null, pos, w, h)
              $.each(guides, function(i, guide) {
                $.each(elemGuides, function(i, elemGuide) {
                  if (guide.type == elemGuide.type) {
                    var prop = guide.type == 'h' ? 'top' : 'left'
                    var d = Math.abs(elemGuide[prop] - guide[prop])
                    if (d < chosenGuides[prop].dist) {
                      chosenGuides[prop].dist = d
                      chosenGuides[prop].offset = elemGuide[prop] - pos[prop]
                      chosenGuides[prop].guide = guide
                    }
                  }
                })
              })
    
              if (chosenGuides.top.dist <= MIN_DISTANCE) {
                $('#guide-h')
                  .css('top', chosenGuides.top.guide.top)
                  .show()
    
                ui.position.top = chosenGuides.top.guide.top - chosenGuides.top.offset
              } else {
                $('#guide-h').hide()
                ui.position.top = pos.top
              }
    
              if (chosenGuides.left.dist <= MIN_DISTANCE) {
                $('#guide-v')
                  .css('left', chosenGuides.left.guide.left)
                  .show()
    
                ui.position.left = chosenGuides.left.guide.left - chosenGuides.left.offset
              } else {
                $('#guide-v').hide()
                ui.position.left = pos.left
              }
            },
    
            stop: function(event, ui) {
              $('#guide-v, #guide-h').hide()
            }
          })
    
          /**
           * 计算 DOM 元素辅助线
           * @param {String, Object} elem DOM 选择器
           * @param {Object} pos 位置坐标
           * @param {Number} w 宽度
           * @param {Number} h 高度
           * @returns {Array} 辅助线对象数组
           */
          function computeGuidesForElement(elem, pos, w, h) {
            if (elem != null) {
              var $t = $(elem)
              // offset - 返回当前元素的偏移量
              pos = $t.offset()
              w = $t.outerWidth() - 1
              h = $t.outerHeight() - 1
            }
            // type,方向类型,h - 垂直方向;v - 水平方向。
            const guids = [
              // 垂直方向 - 顶端对齐线
              { type: 'h', left: pos.left, top: pos.top },
              // 垂直方向 - 中心对齐线
              { type: 'h', left: pos.left, top: pos.top + h / 2 },
              // 垂直方向 - 中心对齐线
              { type: 'h', left: pos.left, top: pos.top + h },
    
              // 水平方向 - 左侧对齐线
              { type: 'v', left: pos.left, top: pos.top },
              // 水平方向 - 中心对齐线
              { type: 'v', left: pos.left + w / 2, top: pos.top },
              // 水平方向 - 左侧对齐线
              { type: 'v', left: pos.left + w, top: pos.top }
            ]
            return guids
          }
        </script>
        <style type="text/css">
          * {
            padding: 0px;
            margin: 0px;
          }
    
          body {
            height: 100%;
            overflow-x: hidden;
            overflow-y: hidden;
          }
    
          .container {
            width: 100vw;
            min-height: 90vh;
            margin: 0px auto;
            position: relative;
            overflow: auto;
            border-bottom: 1px gray solid;
          }
    
          .draggable {
            width: 200px;
            height: 100px;
            border: 1px solid #ccc;
            display: inline-block;
            cursor: move;
            position: absolute !important;
            top: 0px;
            left: 0px;
          }
    
          .guide {
            display: none;
            position: absolute;
            left: 0;
            top: 0;
          }
    
          #guide-h {
            border-top: 1px red solid;
            width: 100%;
          }
    
          #guide-v {
            border-left: 1px red solid;
            height: 100%;
          }
        </style>
      </body>
    </html>
  • 相关阅读:
    Excel中输入身份证后3位变成0,怎么办?
    Css中如何使英文和拼音变成全大写、全小写和首字母大写?
    css中 font常用的样式属性
    Css的向左浮动、先右浮动、绝对定位、相对定位的简单使用
    如何解决Css属性text-overflow:ellipsis 不起作用(文本溢出显示省略号)
    mysql 基本语法学习1(数据库、数据表、数据列的操作)
    sql server中如何将两个字段数据合并成一个字段显示(字段与字段添加特殊符号)
    Linq to Entity 求最大小值Max/Min返回null的处理方法
    C#匿名对象在其它方法体内怎么取到相应的值(不想建立对应的类并转化的情况下)?
    【转发】JQuery中操作Css样式的方法
  • 原文地址:https://www.cnblogs.com/jardeng/p/14049544.html
Copyright © 2011-2022 走看看