拖动同级别元素显示辅助线,辅助对齐,吸附.

采用jqueryUi      draggable  组件开发。

引用JS  :

  <script src="https://cdn.bootcss.com/jquery/1.11.1/jquery.js"></script>

  <script src="https://cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.js"></script>

  <link href="https://cdn.bootcss.com/jqueryui/1.12.1/jquery-ui.css" rel="stylesheet">

css部分:

  body {

    font-family: courier new, courier;

    font-size: 12px;

    padding:0;

    margin:0;

  }

  .draggable_list{

    width:500px;height:500px;background:#ccc;position:relative;left:200px;top:200px;

  }

  .draggable {

    border: 1px solid #ccc;

    display: inline-block;

    cursor: move;

    position: absolute;

  }

  .guide {

    display: none;

    position: absolute;

    left: 0;

    top: 0;

  }

  #guide-h {

    border-top: 1px dashed #55f;

    width: 100%;

  }

  #guide-v {

    border-left: 1px dashed #55f;

    height: 100%;

  }

html 部分:

<div class="draggable_list">

  <!--需要拖动的div-->

  <div class="draggable">第一个11111111111111div</div>

  <div class="draggable">第二个22div</div>

  <div class="draggable">第三个333333div</div>

  <div class="draggable">第四个ggdgdgdiv</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>

JS 部分:

  /**

  * 指标拖动辅助标线

  */

  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;

    },

    

    /**

    * 参数说明

    * event事件的

    * offsetX:

    * outerwidth: 属性是一个只读的整数,声明了整个窗口的宽度。

    * outerheight: 属性是一个只读的整数,声明了整个窗口的高度。

    */

    

    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 - $(‘.draggable_list‘).offset().top) - innerOffsetY ,

        left: (event.pageX - $(‘.draggable_list‘).offset().left) - 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();

    }

  })

  

  function computeGuidesForElement(elem, pos, w, h) {

    if (elem != null) {

      var $t = $(elem);

      //offset:返回当前元素 的偏移量

      pos = $t.position();

      pos = {

        left: $t.position().left,

        top: $t.position().top

      }

      w = $t.outerWidth() - 1;

      h = $t.outerHeight() - 1;

    }

    return [{

      type: "h",

      left: pos.left,

      top: pos.top

    }, //垂直方向左下对齐线

    {

      type: "h",

      left: pos.left,

      top: pos.top + h

    },

    {

      type: "v",

      left: pos.left,

      top: pos.top

    },

    {

      type: "v",

      left: pos.left + w,

      top: pos.top

    },

    //您可以添加_any_其他指南在这里就好了(如指南10像素单元的左)

    {

      type: "h",

      left: pos.left,

      top: pos.top + h / 2

    },

    {

      type: "v",

      left: pos.left + w / 2,

      top: pos.top

    }];

  }

转自   @author sdj

时间: 2024-08-01 19:48:23

拖动同级别元素显示辅助线,辅助对齐,吸附.的相关文章

CSS 显示 定位 浮动 对齐元素

CSS 显示 img.normal { height:auto; } img.big { height:120px; } p.ex { height:100px; width:100px; } <body> <img class="normal" src="logocss.gif" width="95" height="84" /><br> <img class="big&q

JS-004-JavaScript 操作常见 web 元素之四-判断元素显示状态

在日常的 web 编程或 UI自动化脚本编写过程中,经常会遇到判断页面元素的显示状态,以对应的执行相应的操作.此文主要以 js 判断页面元素的存在状态为例,简单叙述一下 js 是如何判断元素的显示状态的,敬请小主们参阅.若有不足之处,敬请大神们不吝指正,不胜感激! 多不言述,小二上码咯. 以下为简单的 HTML 源码,如下所示: 1 <html> 2 <head> 3 <meta http-equiv="Content-Type" content=&quo

元素显示隐藏的9种思路

× 目录 [1]display [2]visibility [3]hidden[4]opacity[5]overflow[6]clip[7]transform[8]覆盖[9]偏移 前面的话 在网页制作中,元素的显示隐藏是非常常见的需求.本文将介绍元素显示隐藏的9种思路 思路一: display 对于元素显隐来说,最常见就是display:none | display:block,但是使用这种方法有个问题,元素的display属性在隐藏前并不都是block,还有可能是inline.inline-b

jquery中使元素显示和隐藏方法之间的区别

在实际的项目开发中,要使一个元素隐藏的方法有很多,比如css的多种属性和jquery的多种方法,虽然他们的作用都是使元素不可见,但是各个方法实现的原理是不一样的.下面主要介绍jquery各个元素隐藏方法之间的区别. 1.show()和hide() 使用hide()方法隐藏元素实际上是同时减少元素的高度.宽度以及不透明度,直到这三个属性为0,最后设置元素的css属性disolay:none.show()方法从上到下增大元素的高度,从左到右增大元素的宽度,同时增加内容的不透明度,直至元素完全显示.

编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出。

编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出. 题目描述 编写程序输入一个5x5的矩阵,将最大元素与中心元素交换,并按行列对齐输出. 输入描述 编写程序输入一个5x5的矩阵 输出描述 将最大元素与中心元素交换,并按行列对齐输出. 样例输入 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 样例输出 1 2 3 4 5 6 7 8 9 10 11 12 25 14 15 16 17 18

Jquery not选择器实现元素显示隐藏

初初认识jQuery的not选择器,想要实现的功能是,点击第一个div,显示第二个div,点击第一个div以外的地方,隐藏第二个div. 具体代码如下: <!DOCTYPE html> <html> <head> <script src="http://libs.baidu.com/jquery/1.10.2/jquery.min.js"> </script> <script> $(document).ready(

AngularJS入门(用ng-hide指令实现元素显示和隐藏)

控制html元素显示和隐藏有n种方法:html的hidden.css的display.jquery的hide()和show().bootstrap的.hide.今天的重点不是显示和隐藏,而是监听某个布尔变量值,自动改变元素显示和隐藏状态.监听函数.if判断.选择dom.设置dom,5行代码搞不定吧,而且毫无技术含量. 看代码: <!DOCTYPE html> <html ng-app> <head> <meta charset="utf-8"&

jQuery判断当前元素显示状态并控制元素的显示与隐藏

1.jQuery判断一个元素当前状态是显示还是隐藏 $("#id").is(':visible');   //true为显示,false为隐藏 $("#id").is(':hidden');   //true为隐藏,false为显示 if($("#id").is(':hidden')){ //逻辑代码 } 2.jQuery控制css的display $("#id").show();    //表示display:block $

AmazeUI 点击元素显示全屏

无论是点击图片还是按钮来显示全屏,具体代码如下: 点击按钮: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title></title> <script type="text/javascript" src="js/jquery.min.js"></script> <script ty