• js插件简单拖拽


      前端开发的时候,有好多地方用到拖拽效果,当然 http://jqueryui.com/draggable/  是个不错的选择,but 我是个打破砂锅问到底的人,抽点时间用js小小的实现了类似的插件,话不多说。

    1.  first: html和css
      <head>
          <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
          <title></title>
          <style>
              * {
                  margin: 0;
                  padding: 0;
              }
      
              #div1 {
                  position: absolute;
                  width: 100px;
                  height: 100px;
                  cursor: move;
                  background-color: red;
              }
          </style>
      </head>
      <body>
          <div id="div1">
          </div>
      </body>
      </html>

    2. now,先把主要算法实现一下:
       <script>
              window.onload = function () {
                  //获取需要拖拽的div
                  var div1 = document.getElementById("div1");
                  //添加鼠标按下事件
                  div1.onmousedown = function (evt) {
                      var oEvent = evt || event;
                      //获取按下鼠标到div left  top的距离
                      var distanceX = oEvent.clientX - div1.offsetLeft;
                      var distanceY = oEvent.clientX - div1.offsetTop;
                      //添加doc滑动时间
                      document.onmousemove = function (evt) {
                          var oEvent = evt || event;
                          //重新计算div的left top值
                          var left = oEvent.clientX - distanceX;
                          var top = oEvent.clientY - distanceY;
      
                          //left  当小于等于零时,设置为零 防止div拖出document之外
                          if (left <= 0) {
                              left = 0;
                          }
                          //当left 超过文档右边界  设置为右边界
                          else if (left >= document.documentElement.clientWidth - div1.offsetWidth) {
                              left = document.documentElement.clientWidth - div1.offsetWidth;
                          }
                          if (top <= 0) {
                              top = 0;
                          }
                          else if (top >= document.documentElement.clientHeight - div1.offsetHeight) {
                              top = document.documentElement.clientHeight - div1.offsetHeight;
                          }
      
                          //重新给div赋值
                          div1.style.top = top + "px";
                          div1.style.left = left + "px";
                      }
                      //添加鼠标抬起事件
                      div1.onmouseup = function () {
                          //清空事件
                          document.onmousemove = null;
                          div1.onmouseup = null;
                      }
                  }
              }
      
          </script>


       

    3. yeah,使用面向对象实现一下
      <style>
              * {
                  margin:0;
                  padding:0;
              }
              #div1 {
                  width: 100px;
                  height: 100px;
                  background-color: red;
              }
              #div2 {
                  background-color:yellow;
                  width:100px;
                  height:100px;
              }
          </style>
      
      <div id="div1"></div>
      <div id="div2"></div>

      js Draggle class:

       function Drag(id) {
                  this.div = document.getElementById(id);
                  if (this.div) {
                      this.div.style.cursor = "move";
                      this.div.style.position = "absolute";
                  }
      
                  this.disX = 0;
                  this.disY = 0;
                  var _this = this;
      
                  this.div.onmousedown = function (evt) {
                      _this.getDistance(evt);
      
                      document.onmousemove = function (evt) {
                          _this.setPosition(evt);
                      }
      
                      _this.div.onmouseup = function () {
                          _this.clearEvent();
                      }
                  }
              }
      
              Drag.prototype.getDistance = function (evt) {
                  var oEvent = evt || event;
                  this.disX = oEvent.clientX - this.div.offsetLeft;
                  this.disY = oEvent.clientY - this.div.offsetTop;
              }
      
              Drag.prototype.setPosition = function (evt) {
                  var oEvent = evt || event;
                  var l = oEvent.clientX - this.disX;
                  var t = oEvent.clientY - this.disY;
                  if (l <= 0) {
                      l = 0;
                  }
                  else if (l >= document.documentElement.clientWidth - this.div.offsetWidth) {
                      l = document.documentElement.clientWidth - this.div.offsetWidth;
                  }
                  if (t <= 0) {
                      t = 0;
                  }
                  else if (t >= document.documentElement.clientHeight - this.div.offsetHeight) {
                      t = document.documentElement.clientHeight - this.div.offsetHeight;
                  }
                  this.div.style.left = l + "px";
                  this.div.style.top = t + "px";
              }
      
              Drag.prototype.clearEvent = function () {
                  this.div.onmouseup = null;
                  document.onmousemove = null;
              }

      at last:最终实现:

        window.onload = function () {
                  new Drag("div1");
                  new Drag("div2");
              }

      效果如下:

      入园子已经三载有余,平时也爱在各位经营的园子溜达汲取知识。之前也有过想开一个自己的园子,但总因为这样那样的事情把这事遗忘了。最近发现身边的@考拉熊http://home.cnblogs.com/u/rccc/好早已经有了这个习惯。人啊,怎么说呢,总是向比自己强的人看起!加油 ,u can @o(∩_∩)o 哈哈

  • 相关阅读:
    遥控按键上报键值映射问题
    AutoLock类
    Mutex互斥锁
    c++ 字符串和数字转换时的特殊处理
    pytorch实现MLP并在MNIST数据集上验证
    python实现直方图均衡化,理想高通滤波与高斯低通滤波
    python实现贝叶斯网络的概率推导(Probabilistic Inference)
    python+opencv实现车牌定位
    python添加高斯噪声和椒盐噪声,实现中值滤波和均值滤波,实现Roberts算子和Sobel算子
    c++学习笔记_6
  • 原文地址:https://www.cnblogs.com/CharlieLau/p/4335721.html
Copyright © 2020-2023  润新知