24行代码,让你的网页元素任意放大、缩小、拖拽、移动

未结帖
0 1636
ajian lily 2016-12-13
悬赏:5飞吻

基于jQuery

$(document).on({'mousemove': function (e) {
  if (!!this.move) {
    var posix = !document.move_target ? {'x': 0,'y': 0} : document.move_target.posix,
    callback = document.call_down || function () {
      $(this.move_target).css({
        'top': e.pageY - posix.y,
        'left': e.pageX - posix.x
      });
    };
    callback.call(this, e, posix);
  }
}, 'mouseup': function (e) {
    if (!!this.move) {
      var callback = document.call_up || function () {};
      callback.call(this, e);
      $.extend(this, {
        'move': false,
        'move_target': null,
        'call_down': false,
        'call_up': false
      });
    }
  }
});


拖拽实例图:

将代码剥离,只要写5行就可以实现拖拽了,是不是很简单:

$('#box').mousedown(function(e) {
  var offset = $(this).offset();
  this.posix = {'x': e.pageX - offset.left, 'y': e.pageY - offset.top};
  $.extend(document, {'move': true, 'move_target': this});
});


放大、缩小

我们给拖拽增加点功能,支持放大、缩小,先看实例图:

将代码剥离,原先的代码保留不变,增加一个绑定事件:

var $box = $('#box').on('mousedown', function (e) {
  var offset = $(this).offset();
  this.posix = {'x': e.pageX - offset.left, 'y': e.pageY - offset.top};
  $.extend(document, {
    'move': true,
    'move_target': this
  });
}).on('mousedown', '#coor', function (e) {
  var posix = {
    'w': $box.width(),
    'h': $box.height(),
    'x': e.pageX,
    'y': e.pageY
  };
  $.extend(document, {
    'move': true,
    'call_down': function (e) {
      $box.css({
        'width': Math.max(30, e.pageX - posix.x + posix.w),
        'height': Math.max(30, e.pageY - posix.y + posix.h)
      });
    }
  });
  return false;   
});


原理分析:

放大、缩小、拖拽都离不开在网页上拖动鼠标,对于前端来说就是document的mousemove,当鼠标在网页上移动的时候,无时无刻不在触发mousemove事件,当鼠标触发事件时,什么时候需要执行我们特定的操作,这就是我们要做的了。我在mousemove中增加了几个对象来判定是否进行操作:

  • move:是否执行触发操作

  • move_target:操作的元素对象

  • move_target.posix:操作对象的坐标

  • call_down:mousemove的时候的回调函数,传回来的this指向document

  • call_up:当鼠标弹起的时候执行的回调函数,传回来的this指向document

小提示:

  • 简单的操作,只需要设定move_target对象,设置move_target的时候不要忘记了move_target.posix哦;

  • 复杂的操作可以通过call_down、call_up进行回调操作,这个时候是可以不用设置move_target对象的

深入研究

拖拽和放大、缩小实现了,但是有个问题,当我们鼠标点击并滑动的时候,是会选中文本的,为了避免这个问题,大家可以自行百度

css 阻止文本选中

.no_select{
  -webkit-user-select: none;  /* Chrome all / Safari all */
  -moz-user-select: none;     /* Firefox all */
  -ms-user-select: none;      /* IE 10+ */
  user-select: none;          /* Likely future */
  cursor: default;
}


附上整个例子源码,新建个 HTML 文件粘贴进去,浏览器打开,即可操作测试:

<!DOCTYPE html>
<html>
<head>
  <meta charset="UTF-8">
  <meta name="author" content="http://orzcss.com/">
  <title>24行代码,让你的网页元素任意放大、缩小、拖拽、移动</title>
  <style>
    .no_select {
      -webkit-user-select: none;
      -moz-user-select: none;
      -ms-user-select: none;
      user-select: none;
      cursor: default;
    }
#box {
      background: red;
      cursor: pointer;
      color: #fff;
      height: 200px;
      position: absolute;
      width: 200px;
    }
    #coor {
      background: #0f0;
      cursor: move;
      display: inline-block;
      height: 20px;
      width: 20px;
    }
  </style>
</head>
<body>
  <div id="box">
    <a id="coor">+</a>
    移动红色方块,则拖拽红色方块<br>需要放大红色方块则拖拽绿色方块
  </div>
  <script src="http://www.orzhtml.com/wp-content/themes/orzhtml1.0/jquery/1.8.3/jquery.js?ver=1.0"></script>
  <script>
    $(document).on({'mousemove': function (e) {
      if (!!this.move) {
        var posix = !document.move_target ? {'x': 0,'y': 0} : document.move_target.posix,
        callback = document.call_down || function () {
          $(this.move_target).css({
            'top': e.pageY - posix.y,
            'left': e.pageX - posix.x
          });
        };
        callback.call(this, e, posix);
      }
    }, 'mouseup': function (e) {
        if (!!this.move) {
          var callback = document.call_up || function () {};
          callback.call(this, e);
          $.extend(this, {
            'move': false,
            'move_target': null,
            'call_down': false,
            'call_up': false
          });
        }
      }
    });
    // 例子测试
    var $box = $('#box').mousedown(function (e) {    
      var offset = $(this).offset();    
      this.posix = {
        'x': e.pageX - offset.left,
        'y': e.pageY - offset.top
      };
      $.extend(document, {
        'move': true,
        'move_target': this
      });
    }).on('mousedown', '#coor', function (e) {
      var posix = {
        'w': $box.width(),
        'h': $box.height(),
        'x': e.pageX,
        'y': e.pageY
      };
      $.extend(document, {
        'move': true,
        'call_down': function (e) {
          $box.css({
            'width': Math.max(30, e.pageX - posix.x + posix.w),
            'height': Math.max(30, e.pageY - posix.y + posix.h)
          });
        }
      });
      return false;
    });
  </script>
</body>
</html>


网页的放大、缩小、拖拽事件就研究到这里了~~

热忱回答0


最近热帖

近期热议

  1. javascript——prototype与__proto 9
  2. Mysql 中出现的Data truncated for column 3
  3. 在nginx中使用x-sendfile的解决方案 3
  4. 高版本jQuery面插件实现Ajax上传图片 1
  5. Thinkphp Socket.class.php 类的使用 1
  6. 使用ionic3创建第一个App 0
  7. ios-oc html5 0
  8. nginx.conf 0
  9. 基于ionic3.4.0的项目搭建 0
  10. php 缩略图 0