首先,你要设计好鼠标事件处理方法,主要是鼠标左键点击,左键释放,还有鼠标移动方法
其次,要了解容什么方式,画一个矩形,设计一个方法:DrawRectgle(左上角,右下角),并且要确定当调用这个方法时,要把原来已经画好的矩形清除掉(或者是根据左上,右下坐标,调整矩形的大小,这样的话,就不用清除原有的矩形)

在鼠标左键按下事件中,获取鼠标位置,保存为左上角坐标,设置开始画矩形的一个标志
在鼠标左键弹起事件中,恢复划矩形的标志为false
在鼠标移动事件中,需要判断是否同时还按下了鼠标左键,如果按下了,并且画矩形标志为true,就获取鼠标位置,保存为右下角坐标(针对鼠标向左上移动的场合,要把左上,右下位置交换一下),然后画一个矩形

// css部分
#canvas {
background-color: #AAAAAA;
position: relative;
background-size:100% 100%;
border: 2px solid blue;
} #canvas>div {
border: 2px solid green;
position: absolute;
background-color: #eaeaea;
}
#canvas>div>span {
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-family: simsun;
font-size: 9pt;
} // html部分
<div id="canvas" style="width:850px;height:477px"></div> // js部分
var canvasWidth= 850;
var canvasHeight = 477;
var allDivNum = 1;
CanvasExt = {
drawRect: function(canvas) {//参数canvas--所画素材框的区域
var that = this; // canvas 的矩形框
var canvasRect = canvas.getBoundingClientRect();
// 矩形框的左上角坐标
var canvasLeft = canvasRect.left;
var canvasTop = canvasRect.top;
var x = 0;
var y = 0; // 鼠标点击按下事件,画图准备
$(document).on('mousedown', '#canvas', function(e) {
// 解决修改时已存在素材框等,删除后再新增存在id重复问题
var date = new Date().getTime();
var id = "newDiv" + date + parseInt(Math.random()*10); var divEle = "";
// x y为鼠标的落点
x = e.clientX - canvasLeft;
y = e.clientY - canvasTop; //创建div
divEle = document.createElement('div');
divEle.setAttribute("id", id); canvas.append(divEle)
divEle.style.top = y + "px";
divEle.style.left = x + "px"; // 绑定删除操作
var menu = new BootstrapMenu('#' + id, {
actions: [{
name: '删除展示框',
onClick: function() {
del(id);
}
}]
});
var tx = 0;
var ty = 0;
var twidth = 0;
var theight = 0; // 添加拖拽操作
divEle.onmousedown = function(e) {
e.stopPropagation();// 阻止时间冒泡
var divEleRect = this.getBoundingClientRect();
var divEleLeft = e.clientX - divEleRect.left;
var divEleTop = e.clientY - divEleRect.top; this.onmousemove = function(e) {
e.stopPropagation();
tx = e.clientX - canvasLeft - divEleLeft;
ty = e.clientY - canvasTop - divEleTop;
// 重新获取当前对象的宽和高
twidth = document.getElementById(id).style.width;
twidth = parseInt(twidth);
theight = document.getElementById(id).style.height;
theight = parseInt(theight);
// 边界检测
if(tx <= 0) {
tx = 0;
this.style.left = 0 + "px";
} else if(tx + twidth > canvasWidth) {
tx = canvasWidth - twidth;
this.style.left = (canvasWidth - twidth) + "px";
} else {
this.style.left = tx + "px";
}
if(ty <= 0) {
ty = 0;
this.style.top = 0 + "px";
} else if((ty + theight) > canvasHeight) {
y = canvasHeight - theight;
this.style.top = (canvasHeight - theight) + "px";
} else {
this.style.top = ty + "px";
}
}
this.onmouseup = function(e) {
var id = $(this).attr("id");
e.stopPropagation();
this.onmousemove = null;
}
}; //鼠标移动事件,画图
var width = 0;
var height = 0;
canvas.onmousemove = function(e) {
e.stopPropagation();
// width height是鼠标移动末尾距鼠标起始位置的差值
width = e.clientX - canvasLeft - x;
height = e.clientY - canvasTop - y;
divEle.style.width = width + "px";
divEle.style.height = height + "px"; var tw = e.clientX - canvasLeft;
var th = e.clientY - canvasTop;
if(tw >= (parseInt(canvasWidth)-7) || th >=
(parseInt(canvasHeight)-7)){ // 比canvas少3px,为了易于判断 allDivNum++;
divEle.innerHTML = "<span>素材框" + allDivNum + "</span>";
canvas.onmousemove = null;
canvas.onmouseup = null;
return;
}
}
canvas.onmouseup = function(e) {
if(width < 10 || height < 10) {
canvas.removeChild(divEle);
} else {
allDivNum++;
divEle.innerHTML = "<span>素材框" + allDivNum + "</span>";
}
e.stopPropagation();
canvas.onmousemove = null;
}
}); }
};
window.onload = function() {
var canvas = document.getElementById("canvas");
CanvasExt.drawRect(canvas);
// 取消默认右击事件
document.oncontextmenu = function(e) {
e.preventDefault();
}
};

————————————————
版权声明:本文为CSDN博主「tangdou369098655」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/tangdou369098655/article/details/100677663

上传图片文件并立即显示到页面使用 javascript实现鼠标拖动画矩形框以及实现固定区域内随意拖动的更多相关文章

  1. mac nginx+php-fpm配置(安装过后nginx后访问php文件下载,访问php文件请求200显示空白页面)

    访问php文件下载是因为没配置php-fpm 两个问题主要都是nginx.conf配置的问题: /usr/local/etc/nginx/nginx.conf server {    listen 8 ...

  2. ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面

    DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认文件,那么前面介绍的StaticFileMiddleware中间件会 ...

  3. .net网站上传图片换电脑不显示 当不用网站的IP地址访问图片,只用相对路径访问时,在发布网站的时候,将上传图片的目标文件夹,包含在项目中再发布即可。

    .net网站上传图片换电脑不显示 当不用网站的IP地址访问图片,只用相对路径访问时,在发布网站的时候,将上传图片的目标文件夹,包含在项目中再发布即可.

  4. 用Seam实现:图片上传 + 保存到数据库 + 从数据库读出图片并显示到页面中

    上传图片并保存到数据库 seam给我们提供了 s:fileUpload 标签以完成文件上传功能.使用该标签时,要在web.xml中声明一个Seam的过滤器: <filter> <fi ...

  5. vue中使用axios post上传头像/图片并实时显示到页面

    在前端开发中,为了更好的用户体验,在头像上传时会先将图片显示到页面然后点击保存按钮 完成图片的上传成功 代码部分有参考他人的写法. html代码:   <div id="myPhoto ...

  6. ajax上传图片文件

    这里用的是一个隐藏的iframe,这样可以让form表单提交到这个iframe里面,用户就看不到页面的刷新了 前段时间在解决ajax上传文件时折腾了好一阵.直接用$.post上传文本信息肯定是没有问题 ...

  7. vant自动上传图片/文件

    vant自动上传文件/图片 vant上传图片与elementUI有所不同,没有自动上传功能,所以与后端进行接口对接的时候可以在after-read中将文件进行上传 html页面 <!-- 上传图 ...

  8. DefaultFilesMiddleware中间件如何显示默认页面

    DefaultFilesMiddleware中间件如何显示默认页面 DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认 ...

  9. [Ajax] 使用Ajax异步上传图片文件(非Form表单提交)

    通过表单Form提交来上传文件的方式这里就不说了: 下面介绍,通过js中使用ajax异步上传图片文件: 新建一个html页面和一个一般处理程序即可: 涉及思路: //发送2次Ajax请求完成js异步上 ...

  10. Ajax上传文件进度条显示

    要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显 ...

随机推荐

  1. 3.httprunner-extract/.env/Testcase

    参数关联-extract 场景:上一个接口的返回值,传给下一个接口当请求参数 extract:提取变量 $变量名 :引用变量 假设我们有如下场景 用户A登录之后,返回值返回用户UID,我们需要查询该用 ...

  2. Droplet——一款轻量的Golang应用层框架

    Github地址 如标题所描述的,Droplet 是一个 轻量 的 中间层框架,何为中间层呢? 通常来说,我们的程序(注意这里我们仅仅讨论程序的范围,而非作为一个系统,因此这里不设计如 LB.Gate ...

  3. 华为开发者大会2022:HMS Core 3D建模服务再升级,万物皆可驱动

    11月4日,HDC2022华为开发者大会在东莞松山湖举办.在本次大会的HMS Core创新图形能力分论坛中,HMS Core重点介绍了其在3D技术领域的创新应用方向,其中3D建模服务展示了创新的自动骨 ...

  4. 1.python基础使用

    1.git简介 git是一个免费的开源的分布式版本控制系统,可以快速高效的处理从小型到大型项目的所有事务 在实际工作中可以保留项目的所有版本,可以快速的实现版本的回滚和修改 git整体可以分为4个区域 ...

  5. MvvmLight框架的基本使用

    关于MvvmLight框架的介绍可以看这篇,说的很详细,在此记录下来以作复习,通过一个简单的例子说明MvvmLight的基本使用 https://www.cnblogs.com/3xiaolonglo ...

  6. 【iOS逆向】某营业厅算法分析

    阅读此文档的过程中遇到任何问题,请关注公众号[移动端Android和iOS开发技术分享]或加QQ群[812546729] 1.目标 使用frida stalker分析某营业厅的签名算法. 2.操作环境 ...

  7. 深度学习之logistics回归

    在开始之前,事先声明本文参考[中文][吴恩达课后编程作业]Course 1 - 神经网络和深度学习 - 第二周作业_何宽的博客-CSDN博客_吴恩达课后编程作业 加上自己的理解,希望可以不用重复看吴恩 ...

  8. Easy-Classification-分类框架设计

    1. 框架介绍 Easy-Classification是一个应用于分类任务的深度学习框架,它集成了众多成熟的分类神经网络模型,可帮助使用者简单快速的构建分类训练任务. 框架源代码:https://gi ...

  9. Kafka事务原理剖析

    一.事务概览 提起事务,我们第一印象可能就是ACID,需要满足原子性.一致性.事务隔离级别等概念,那kafka的事务能做到什么程度呢?我们首先看一下如何使用事务 Producer端代码如下 Kafka ...

  10. 【Devexpress】gridcontorl实现复制多个单元格

    1.设置复制的时候不复制标题在OptionsClipboard.CopyColumnHeaders=false 2.设置选择的方式为按照单元格选择,以及可以多选 OptionsSelection.Mu ...