jQuery拖拽通过八个点改变div大小

jQuery拖拽通过八个点改变div大小

js:

(function($) { 

 /**
  * 默认参数
  */
 var defaultOpts = {
  stage: document, //舞台
  item: 'resize-item', //可缩放的类名
 }; 

 /**
  * 定义类
  */
 var ZResize = function(options) {
  this.options = $.extend({}, defaultOpts, options);
  this.init();
 } 

 ZResize.prototype = {
  init: function() {
   this.initResizeBox();
  },
  /**
   * 初始化拖拽item
   */
  initResizeBox: function() {
   var self = this;
   $(self.options.item).each(function () {
    //创建面板
    var width = $(this).width();
    var height = $(this).height();
    var resizePanel = $('<div class"resize-panel"></div>');
    resizePanel.css({
     width: width,
     height: height,
     top: 0,
     left: 0,
     position: 'absolute',
     'background-color': 'rgba(0,0,0,0.5)',
     cursor: 'move',
     display: 'none'
    });
    self.appendHandler(resizePanel, $(this));
    /**
     * 创建控制点
     */
    var n = $('<div class="n"></div>');//北
    var s = $('<div class="s"></div>');//南
    var w = $('<div class="w"></div>');//西
    var e = $('<div class="e"></div>');//东
    var ne = $('<div class="ne"></div>');//东北
    var nw = $('<div class="nw"></div>');//西北
    var se = $('<div class="se"></div>');//东南
    var sw = $('<div class="sw"></div>');//西南 

    //添加公共样式
    self.addHandlerCss([n, s, w, e, ne, nw, se, sw]);
    //添加各自样式
    n.css({
     'top': '-4px',
     'margin-left': '-4px',
     'left': '50%',
     'cursor': 'n-resize'
    });
    s.css({
     'bottom': '-4px',
     'margin-left': '-4px',
     'left': '50%',
     'cursor': 's-resize'
    });
    e.css({
     'top': '50%',
     'margin-top': '-4px',
     'right': '-4px',
     'cursor': 'e-resize'
    });
    w.css({
     'top': '50%',
     'margin-top': '-4px',
     'left': '-4px',
     'cursor': 'w-resize'
    });
    ne.css({
     'top': '-4px',
     'right': '-4px',
     'cursor': 'ne-resize'
    });
    nw.css({
     top: '-4px',
     'left': '-4px',
     'cursor': 'nw-resize'
    });
    se.css({
     'bottom': '-4px',
     'right': '-4px',
     'cursor': 'se-resize'
    });
    sw.css({
     'bottom': '-4px',
     'left': '-4px',
     'cursor': 'sw-resize'
    }); 

    // 添加项目
    self.appendHandler([n, s, w, e, ne, nw, se, sw], resizePanel); 

    //绑定拖拽缩放事件
    self.bindResizeEvent(resizePanel, $(this)); 

    //绑定触发事件
    self.bindTrigger($(this));
   });
   self.bindHidePanel();
  },
  //控制点公共样式
  addHandlerCss: function(els) {
   for(var i = 0; i < els.length; i++) {
    el = els[i];
    el.css({
     position: 'absolute',
     width: '8px',
     height: '8px',
     background: '#ff6600',
     margin: '0',
     'border-radius': '2px',
     border: '1px solid #dd5500',
    });
   }
  },
  /**
   * 插入容器
   */
  appendHandler: function(handlers, target) {
   for(var i = 0; i < handlers.length; i++) {
    el = handlers[i];
    target.append(el);
   }
  },
  /**
   * 显示拖拽面板
   */
  triggerResize: function(el) {
   var self = this;
   el.siblings(self.options.item).children('div').css({
    display: 'none'
   });
   el.children('div').css({
    display: 'block'
   });
  },
  /**
   * 拖拽事件控制 包含8个缩放点 和一个拖拽位置
   */
  bindResizeEvent: function(el) { 

   var self = this;
   var ox = 0; //原始事件x位置
   var oy = 0; //原始事件y位置
   var ow = 0; //原始宽度
   var oh = 0; //原始高度 

   var oleft = 0; //原始元素位置
   var otop = 0;
   var org = el.parent('div'); 

   //东
   var emove = false;
   el.on('mousedown','.e', function(e) {
    ox = e.pageX;//原始x位置
    ow = el.width();
    emove = true;
   }); 

   //南
   var smove = false;
   el.on('mousedown','.s', function(e) {
    oy = e.pageY;//原始x位置
    oh = el.height();
    smove = true;
   }); 

   //西
   var wmove = false;
   el.on('mousedown','.w', function(e) {
    ox = e.pageX;//原始x位置
    ow = el.width();
    wmove = true;
    oleft = parseInt(org.css('left').replace('px', ''));
   }); 

   //北
   var nmove = false;
   el.on('mousedown','.n', function(e) {
    oy = e.pageY;//原始x位置
    oh = el.height();
    nmove = true;
    otop = parseInt(org.css('top').replace('px', ''));
   }); 

   //东北
   var nemove = false;
   el.on('mousedown','.ne', function(e) {
    ox = e.pageX;//原始x位置
    oy = e.pageY;
    ow = el.width();
    oh = el.height();
    nemove = true;
    otop = parseInt(org.css('top').replace('px', ''));
   }); 

   //西北
   var nwmove = false;
   el.on('mousedown','.nw', function(e) {
    ox = e.pageX;//原始x位置
    oy = e.pageY;
    ow = el.width();
    oh = el.height();
    otop = parseInt(org.css('top').replace('px', ''));
    oleft = parseInt(org.css('left').replace('px', ''));
    nwmove = true;
   }); 

   //东南
   var semove = false;
   el.on('mousedown','.se', function(e) {
    ox = e.pageX;//原始x位置
    oy = e.pageY;
    ow = el.width();
    oh = el.height();
    semove = true;
   }); 

   //西南
   var swmove = false;
   el.on('mousedown','.sw', function(e) {
    ox = e.pageX;//原始x位置
    oy = e.pageY;
    ow = el.width();
    oh = el.height();
    swmove = true;
    oleft = parseInt(org.css('left').replace('px', ''));
   }); 

   //拖拽
   var drag = false;
   el.on('mousedown', function(e) {
    ox = e.pageX;//原始x位置
    oy = e.pageY;
    otop = parseInt(org.css('top').replace('px', ''));
    oleft = parseInt(org.css('left').replace('px', ''));
    drag = true;
   }); 

   $(self.options.stage).on('mousemove', function(e) {
    if(emove) {
     var x = (e.pageX - ox);
     el.css({
      width: ow + x
     });
     org.css({
      width: ow + x
     });
    } else if(smove) {
     var y = (e.pageY - oy);
     el.css({
      height: oh + y
     });
     org.css({
      height: oh + y
     });
    } else if(wmove) {
     var x = (e.pageX - ox);
     el.css({
      width: ow - x,
      // left: oleft + x
     });
     org.css({
      width: ow - x,
      left: oleft + x
     });
    } else if(nmove) {
     var y = (e.pageY - oy);
     el.css({
      height: oh - y,
      // top: otop + y
     });
     org.css({
      height: oh - y,
      top: otop + y
     });
    } else if(nemove) {
     var x = e.pageX - ox;
     var y = e.pageY - oy;
     el.css({
      height: oh - y,
      // top: otop + y,
      width: ow + x
     });
     org.css({
      height: oh - y,
      top: otop + y,
      width: ow + x
     });
    } else if(nwmove) {
     var x = e.pageX - ox;
     var y = e.pageY - oy;
     el.css({
      height: oh - y,
      // top: otop + y,
      width: ow - x,
      // left: oleft + x
     });
     org.css({
      height: oh - y,
      top: otop + y,
      width: ow - x,
      left: oleft + x
     });
    } else if(semove) {
     var x = e.pageX - ox;
     var y = e.pageY - oy;
     el.css({
      width: ow + x,
      height: oh + y
     });
     org.css({
      width: ow + x,
      height: oh + y
     });
    } else if(swmove) {
     var x = e.pageX - ox;
     var y = e.pageY - oy;
     el.css({
      width: ow - x,
      // left: oleft + x,
      height: oh + y
     });
     org.css({
      width: ow - x,
      left: oleft + x,
      height: oh + y
     });
    } else if(drag) {
     var x = e.pageX - ox;
     var y = e.pageY - oy;
     org.css({
      left: oleft + x,
      top: otop + y
     });
    }
   }).on('mouseup', function(e) {
    emove = false;
    smove = false;
    wmove = false;
    nmove = false;
    nemove = false;
    nwmove = false;
    swmove = false;
    semove = false;
    drag = false;
   });
  },
  /**
   * 点击item显示拖拽面板
   */
  bindTrigger: function(el) {
   var self = this;
   el.on('click', function(e) {
    e.stopPropagation();
    self.triggerResize(el);
   });
  },
  /**
   * 点击舞台空闲区域 隐藏缩放面板
   */
  bindHidePanel: function(el) {
   var stage = this.options.stage;
   var item = this.options.item;
   $(stage).bind('click', function() {
    $(item).children('div').css({
     display: 'none'
    });
   })
  }
 } 

 window.ZResize = ZResize; 

})(jQuery);

html:

<!doctype html>
<html> 

<head>
 <meta charset="utf-8">
 <title>jQuery拖拽放大缩小插件idrag</title>
 <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
 <style type="text/css">
 .item1 {
  width: 405px;
  height: 291px;
  cursor: move;
  position: absolute;
  top: 30px;
  left: 30px;
  background-color: #FFF;
  border: 1px solid #CCCCCC;
  -webkit-box-shadow: 10px 10px 25px #ccc;
  -moz-box-shadow: 10px 10px 25px #ccc;
  box-shadow: 10px 10px 25px #ccc;
 } 

 .item2 {
  width: 200px;
  height: 100px;
  cursor: move;
  position: absolute;
  top: 400px;
  left: 100px;
  background-color: #FFF;
  border: 1px solid #CCCCCC;
  -webkit-box-shadow: 10px 10px 25px #ccc;
  -moz-box-shadow: 10px 10px 25px #ccc;
  box-shadow: 10px 10px 25px #ccc;
  line-height: 100px;
  text-align: center;
 } 

 body {
  background-color: #F3F3F3;
 }
 </style>
</head> 

<body>
 <div id="mydiv" style="width:800px; height:800px; border-style:solid">
  <div id="div1" class="resize-item item1">
   <img src="images/dog.png" width="100%" height="100%">
  </div>
  <div class="resize-item item2">
   你是我的小小狗
  </div>
 </div>
 <script src="jquery.min.js"></script>
 <script type="text/javascript" src='jquery.ZResize.js'></script>
 <script type="text/javascript">
  new ZResize({
   stage: "#mydiv", //舞台
   item: '#div1', //可缩放的类名
  });
 </script>
</body> 

</html> 

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • jQuery拖拽div实现思路

    思路是利用jquery的mousemove,mousedown,mouseup三个事件,定义两个相对位置,分别是 1.组件左上角与屏幕左上角的相对位置 2.鼠标所在坐标与组件左上角的相对位置. 具体函数如下: 复制代码 代码如下: .drag{ position:absolute; background:#0000CC; top:100px;left:200px; padding:0; } 复制代码 代码如下: $(document).ready(function(){ var move=fal

  • jquery拖动改变div大小

    本文实例为大家分享了jquery拖动改变div大小的具体代码,供大家参考,具体内容如下 <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>jQuery 版"元素拖拽改变大小"原型 </title> <script type="text/jav

  • jquery div拖动效果示例代码

    复制代码 代码如下: <%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-

  • jQuery拖动div、移动div、弹出层实现原理及示例

    代码演示: http://www.imqing.com/demo/movediv.html 大概原理: 使div的position为绝对定位absolute,然后控制其top与left值,需要监听鼠标事件,主要用到mousedown, mousemove, mouseup. 在mousedown后,记录mousedown时鼠标与需要移动的div的位置,然后取得两者之差,得到在鼠标移动后,div的位置.即: left = 当前鼠标位置.x - (鼠标点击时的.x值 - div的初始位置x值) to

  • jQuery使用drag效果实现自由拖拽div

    偶然间看到了以前做的一个简洁的div拖拽效果,修改了一下加点注释,经测试完美通过firefox/chrome/ie6-11,现拿来分享一下. 先说一下实现原理及要点,最主要的有三步.第一步是mousedown事件,鼠标mousedown的时候记录此时的鼠标X轴和Y轴以及拖拽框的left和top,并且给拖拽标记赋值true,代表拖拽动作就绪.第二步是mousemove事件,此时动态获取鼠标的X轴和Y轴,然后计算出来拖拽框新的left和top并赋值使其实现拖拽效果.第三步是mouseup事件,鼠标弹

  • JQuery加载图片自适应固定大小的DIV

    如何在固定大小的div中放置一个图片,当图片较小时显示实际大小,当图片超过div 大小时图片 自动适应div 的大小 jquery图片自适应大小实现过程的主要代码: 代码如下: 复制代码 代码如下: .divImg{ max-height:200px; max-width:200px; width: expression(this.width > 200 && this.width > this.height ? 200 : auto); height: expression(

  • 利用JQuery+EasyDrag 实现弹出可拖动的Div,同时向Div传值,然后返回Div选中的值

    原来我们要写一个客户端的特效,要写一两天的JavaScript,然后再调试一两天,才可以看见端倪.现在我们只要使用JQuery和他的 plugin,就可以任意的实现我们脑海中的特效,感谢他们的编写者对人类的贡献(一百个西红柿砸过来..............). 我今天实现的需求是一个需要从列表页面中选择要导出到word中的列,然后在将选中列的内容导出到word中,同时为了增加通用性,列的个数不是固定的,也就是说这张表格可能是4列,也可能是5列,待选择的列数目不固定.例如:有下面的一张表格,然后

  • JQuery Dialog(JS 模态窗口,可拖拽的DIV)

    效果图 调用示意图 交互示意图 如上图所示,这基本是JQueryDialog的完整逻辑流程了. 1.用户点击模态窗口的"提交"按钮时,调用JQueryDialog.Ok()函数,这个函数对应了用户提交事件. 2.用OO的概念来说,JQueryDialog.Ok()其实是一个虚函数,它的逻辑封装在子窗口ContentWindow.Ok()中,这一点我借鉴了FCKEditor,如下代码所示: JS代码 复制代码 代码如下: var JQueryDialog = { /// <summ

  • jquery实现拖拽调整Div大小

    今天写了一天这个jquery插件: 可以实现对div进行拖拽来调整大小的功能. 复制代码 代码如下: (function ($) {     $.fn.dragDivResize = function () {         var deltaX, deltaY, _startX, _startY;         var resizeW, resizeH;         var size = 20;         var minSize = 10;         var scroll

  • jquery动态调整div大小使其宽度始终为浏览器宽度

    有时候我们需要设置宽度为整个浏览器宽度的div,当然我们可以使用相对布局的方式做到这一点,不过我们也可以用jquery来实现. 复制代码 代码如下: <!doctype html> <html> <head> <meta charset="utf-8"> <title>jquery test</title> <script src="jquery-1.11.1.min.js"><

随机推荐