草庐IT

jQuery实现鼠标拖动 html 标签 改变位置、大小——多层级适用和抑制冒泡

虔浅 2025-04-08 原文

* 无意侵犯原作者版权,仅学于大众,回馈于大众。

* 如果平台或者作者认为本人本帖存在侵权或者冒犯,请发邮删贴!!!

邮箱:321270064@qq.com

最近想自己写一个“傻瓜式”的前端页面生成器,其中有一个想法,就是让未来的用户可以自己更改页面内标签的大小尺寸和位置,通过鼠标就可以完成。因为我本身是写java后端的,对前端的了解是有限的。同时,感觉磨前端也比较费时间的事情。所以,就直接在网上找了一些前端大佬的文献来看了(参考)。

以下为参考大佬文献的链接:

jQuery实现鼠标拖动div改变位置、大小的实践 - H5W3

在上述大佬的方法是完全可以实现单一标签节点的大小更改和位置更改的。但是,有还是几个问题:

1、适用单一节点;

2、对多层级出现层级事件冒泡;

3、class或者标签 获取的集合移动相互干扰;

因此,根据个人的需求。对上述大佬写的方法进行了一些微小的更改:

//js脚本
/*阻止js 事件冒泡*/
function stopPropagation(e){
  e = e || window.event;
  if(e && e.stopPropagation){
    e.stopPropagation();
  }else{
    e.cancelBubble = true;
  }
}

/*尺寸调整 上*/
function resize_up(obj,top,left,e){
  if(e.clientY - top < 10 && e.clientX - left > 10 && e.clientX-left < parseInt(obj.width()) - 10) {
    obj.css("cursor","n-resize");
    obj.mousedown(function(e) {
      stopPropagation(e);/*阻止冒泡*/
      var ismove = true;
      var y = e.pageY - obj.offset().top + obj.parent().offset().top;
      var h = e.pageY + parseInt(obj.css("height"));
      $(document).mousemove(function(e) {
        if(ismove) {
          obj.css({"height":h - e.pageY, "top":e.pageY - y});
        }
      }).mouseup(function() {
        ismove = false;
      });
    });
  }
}

/*尺寸调整 左*/
function resize_left(obj,top,left,e){
  if(e.clientX - left < 10 && e.clientY - top > 10 && e.clientY-top < parseInt(obj.height()) - 10) {
    obj.css("cursor","w-resize");
    obj.mousedown(function(e) {
      stopPropagation(e);
      var ismove = true;
      var x = e.pageX - obj.offset().left + obj.parent().offset().left;
      var w = e.pageX + parseInt(obj.css("width"));
      $(document).mousemove(function(e) {
        if(ismove) {
          obj.css({"width":w - e.pageX, "left":e.pageX - x});
        }
      }).mouseup(function() {
        ismove = false;
      });
    });
  }
}

/*尺寸调整 下*/
function resize_below(obj,top,left,e){
  if(e.clientY-top  > parseInt(obj.height()) - 10 && e.clientX - left > 10 && e.clientX-left < parseInt(obj.width()) - 10) {
    obj.css("cursor","s-resize");
    obj.mousedown(function(e) {
      stopPropagation(e);
      var ismove = true;
      var h = e.pageY - parseInt(obj.css("height"));
      $(document).mousemove(function(e) {
        if(ismove) {
          obj.css({"height":e.pageY - h});
        }
      }).mouseup(function() {
        ismove = false;
      });
    });
  }
}

/*尺寸调整 右*/
function resize_right(obj,top,left,e){
  if(e.clientX-left > parseInt(obj.width()) - 10 && e.clientY - top > 10 && e.clientY-top  < parseInt(obj.height()) - 10) {
    obj.css("cursor","e-resize");
    obj.mousedown(function(e) {
      stopPropagation(e);/*阻止冒泡*/
      var ismove = true;
      var w = e.pageX - parseInt(obj.css("width"));
      $(document).mousemove(function(e) {
        if(ismove) {
          obj.css({"width":e.pageX - w});
        }
      }).mouseup(function() {
        ismove = false;
      });
    });
  }
}

/*尺寸调整 左上角*/
function resize_topLeftCorner(obj,top,left,e){
  if(e.clientX - left < 10 && e.clientY - top < 10) {
    obj.css("cursor","nw-resize");
    obj.mousedown(function(e) {
      stopPropagation(e);/*阻止冒泡*/
      var ismove = true;
      var x = e.pageX - obj.offset().left + obj.parent().offset().left;
      var y = e.pageY - obj.offset().top + obj.parent().offset().top;
      var w = e.pageX + parseInt(obj.css("width"));
      var h = e.pageY + parseInt(obj.css("height"));
      $(document).mousemove(function(e) {
        if(ismove) {
          obj.css({"height":h - e.pageY, "width":w - e.pageX, "top":e.pageY - y, "left":e.pageX - x});
        }
      }).mouseup(function() {
        ismove = false;
      });
    });
  }
}

/*尺寸调整 左下角*/
function resize_leftBottom(obj,top,left,e){
  if(e.clientY-top  > parseInt(obj.height()) - 10 && e.clientX - left < 10) {
    obj.css("cursor","sw-resize");
    obj.mousedown(function(e) {
      stopPropagation(e);/*阻止冒泡*/
      var ismove = true;
      var x = e.pageX - obj.offset().left + obj.parent().offset().left;
      var w = e.pageX + parseInt(obj.css("width"));
      var h = e.pageY - parseInt(obj.css("height"));
      $(document).mousemove(function(e) {
        if(ismove) {
          obj.css({"width":w - e.pageX, "left":e.pageX - x,"height":e.pageY - h});
        }
      }).mouseup(function() {
        ismove = false;
      });
    });
  }
}

/*尺寸调整 右上角*/
function resize_topRightCorner(obj,top,left,e){
  if(e.clientY - top < 10 && e.clientX-left > parseInt(obj.width()) - 10) {
    obj.css("cursor","ne-resize");
    obj.mousedown(function(e) {
      stopPropagation(e);/*阻止冒泡*/
      var ismove = true;
      var y = e.pageY - obj.offset().top + obj.parent().offset().top;
      var h = e.pageY + parseInt(obj.css("height"));
      var w = e.pageX - parseInt(obj.css("width"));
      $(document).mousemove(function(e) {
        if(ismove) {
          obj.css({"height":h - e.pageY, "top":e.pageY - y,"width":e.pageX - w});
        }
      }).mouseup(function() {
        ismove = false;
      });
    });
  }
}

/*尺寸调整 右下角*/
function resize_lowerRightCorner(obj,top,left,e){
  if(e.clientX-left > parseInt(obj.width()) - 10 && e.clientY-top > parseInt(obj.height()) - 10) {
    obj.css("cursor","se-resize");
    obj.mousedown(function(e) {
      stopPropagation(e);/*阻止冒泡*/
      var ismove = true;
      var w = e.pageX - parseInt(obj.css("width"));
      var h = e.pageY - parseInt(obj.css("height"));
      $(document).mousemove(function(e) {
        if(ismove) {
          obj.css({"width":e.pageX - w,"height":e.pageY - h});
        }
      }).mouseup(function() {
        ismove = false;
      });
    });
  }
}

/*尺寸调整 中间调整位置*/
function resize_settingPosition(obj,top,left,e){
  if(e.clientX - left > 10 && e.clientX-left < parseInt(obj.width()) - 10
    && e.clientY - top  > 10 && e.clientY-top  < parseInt(obj.height()) - 10) {
    obj.css("cursor","move");
    obj.css("cursor","default");
    obj.mousedown(function(e) {
      stopPropagation(e);/*阻止冒泡*/
      var ismove = true;
        /*obj.parent().offset()是父级补偿*/
      var x = e.pageX - obj.offset().left + obj.parent().offset().left;
      var y = e.pageY - obj.offset().top + obj.parent().offset().top;
      $(document).mousemove(function(e) {
        stopPropagation(e);/*阻止冒泡*/
        /*console.log("");*/
        if(ismove) {
          obj.css({"left":e.pageX - x, "top":e.pageY - y});
        }
      }).mouseup(function() {
        ismove = false;
      });
    });
  }
}

/*调用方法*/
function resize(node){
  $(node).mousemove(function(e){
    /*这里保证接下来的操作是对操作节点本身的(相对传入节点有多个或者多层(集合))*/
    var obj = $(this);
    obj.unbind("mousedown");
    obj.css("cursor","default");
    var left = obj.offset().left;
    var top = obj.offset().top;
    /*尺寸调整 上*/
    resize_up(obj,top,left,e);
    /*尺寸调整 左*/
    resize_left(obj,top,left,e);
    /*尺寸调整 下*/
    resize_below(obj,top,left,e);
    /*尺寸调整 右*/
    resize_right(obj,top,left,e);
    /*尺寸调整 左上角*/
    resize_topLeftCorner(obj,top,left,e);
    /*尺寸调整 左下角*/
    resize_leftBottom(obj,top,left,e);
    /*尺寸调整 右上角*/
    resize_topRightCorner(obj,top,left,e);
    /*尺寸调整 右下角*/
    resize_lowerRightCorner(obj,top,left,e);
    /*尺寸调整 中间调整位置*/
    resize_settingPosition(obj,top,left,e);
  });
}

本文主要是对多层级和集合标签进行了一些处理,其他的逻辑与原文(jQuery实现鼠标拖动div改变位置、大小的实践 - H5W3)还是一样的。

方法调用:(引入jquery.js依赖)

在方法里直接传入标签 resize(“div”);也可以传入类名节点 resize(“.class”),对于单一标签通过id也是也可以的resize(“#id”);

* 无意侵犯原作者版权,仅学于大众,回馈于大众。

* 如果平台或者作者认为本人本帖存在侵权或者冒犯,请发邮删贴!!!

有关jQuery实现鼠标拖动 html 标签 改变位置、大小——多层级适用和抑制冒泡的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  3. ruby-on-rails - Rails HTML 请求渲染 JSON - 2

    在我的Controller中,我通过以下方式在我的index方法中支持HTML和JSON:respond_todo|format|format.htmlformat.json{renderjson:@user}end在浏览器中拉起它时,它会自然地以HTML呈现。但是,当我对/user资源进行内容类型为application/json的curl调用时(因为它是索引方法),我仍然将HTML作为响应。如何获取JSON作为响应?我还需要说明什么? 最佳答案 您应该将.json附加到请求的url,提供的格式在routes.rb的路径中定义。这

  4. ruby-on-rails - 使用 Sublime Text 3 突出显示 HTML 背景语法中的 ERB? - 2

    所以我在关注Railscast,我注意到在html.erb文件中,ruby代码有一个微弱的背景高亮效果,以区别于其他代码HTML文档。我知道Ryan使用TextMate。我正在使用SublimeText3。我怎样才能达到同样的效果?谢谢! 最佳答案 为SublimeText安装ERB包。假设您安装了SublimeText包管理器*,只需点击cmd+shift+P即可获得命令菜单,然后键入installpackage并选择PackageControl:InstallPackage获取包管理器菜单。在该菜单中,键入ERB并在看到包时选择

  5. ruby - 如何根据特征实现 FactoryGirl 的条件行为 - 2

    我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden

  6. ruby-on-rails - Ruby url 到 html 链接转换 - 2

    我正在使用Rails构建一个简单的聊天应用程序。当用户输入url时,我希望将其输出为html链接(即“url”)。我想知道在Ruby中是否有任何库或众所周知的方法可以做到这一点。如果没有,我有一些不错的正则表达式示例代码可以使用... 最佳答案 查看auto_linkRails提供的辅助方法。这会将所有URL和电子邮件地址变成可点击的链接(htmlanchor标记)。这是文档中的代码示例。auto_link("Gotohttp://www.rubyonrails.organdsayhellotodavid@loudthinking.

  7. jquery - 我的 jquery AJAX POST 请求无需发送 Authenticity Token (Rails) - 2

    rails中是否有任何规定允许站点的所有AJAXPOST请求在没有authenticity_token的情况下通过?我有一个调用Controller方法的JqueryPOSTajax调用,但我没有在其中放置任何真实性代码,但调用成功。我的ApplicationController确实有'request_forgery_protection'并且我已经改变了config.action_controller.consider_all_requests_local在我的environments/development.rb中为false我还搜索了我的代码以确保我没有重载ajaxSend来发送

  8. ruby-on-rails - capybara ::ElementNotFound:无法找到 xpath "/html" - 2

    我正在学习http://ruby.railstutorial.org/chapters/static-pages上的RubyonRails教程并遇到以下错误StaticPagesHomepageshouldhavethecontent'SampleApp'Failure/Error:page.shouldhave_content('SampleApp')Capybara::ElementNotFound:Unabletofindxpath"/html"#(eval):2:in`text'#./spec/requests/static_pages_spec.rb:7:in`(root)'

  9. 华为OD机试用Python实现 -【明明的随机数】 2023Q1A - 2

    华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o

  10. 基于C#实现简易绘图工具【100010177】 - 2

    C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.

随机推荐