首先,你要设计好鼠标事件处理方法,主要是鼠标左键点击,左键释放,还有鼠标移动方法
其次,要了解容什么方式,画一个矩形,设计一个方法: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. OpenStack云计算平台框架

    概:  OpenStack是包含很多独立组件的一个云计算平台框架.在安装组件前,需要先将框架搭建出来,才能向其中放置组件. 搭建open stack云计算平台框架 一.安装open stack云计算平 ...

  2. .Net Core - 使用事务IDbtransaction操作DBData

    New一个流程 获取数据库连接字符串,实例化SqlConnection 打来数据库连接 Begin当前连接的事务(IDbTransaction) 操作数据库(操作数据库的时候一定要使用当前连接和事务修 ...

  3. 逆向使用 execjs时遇到 UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 28: illegal multibyte sequence

    问题: 如下图所示 今天在维护以前的爬虫代码 发现有个网站一直爬取失败,我原以为是网站逆向的部分改了,搞了好久才发现是GBK的问题 接下来告诉大家解决方案 解决方案 如下图 在下图这个subbsubp ...

  4. Codeforces Round #832 (Div. 2) A-D

    比赛链接 A 题解 知识点:贪心. 我们考虑把正数和负数分开放,显然把负数和正数放在一起的结果不会更优. 时间复杂度 \(O(n)\) 空间复杂度 \(O(1)\) 代码 #include <b ...

  5. 类视图函数 VIEW

    常用的视图函数: ListView.DetailView.UpdateView 1 ListView object_list:此属性表示对象的列表 常用场景: 1.展示数据库中信息: 2.在展示信息时 ...

  6. go工具pprof部署

    在做内存分析时,用到了pprof,这里做一下部署介绍和入门级别的使用. pprof是golang的性能工具,有两种交互方式:命令行交互和web交互,同时还支持性能分析数据的图形化展示. 部署pprof ...

  7. Docker遇见golang https://www.jianshu.com/p/37693eb8f646

    golang logo 在我国古代,传说天庭中有种种天兵天将,有看守四大天门的(docker0网桥),有负责传话的门将(REST API),有负责人间和天界联络的,如财神爷,土地公等(NAT,DNS) ...

  8. Linux中如何开启一个定时任务

    Linux的定时任务是基于cron驱动做到的 安装 Ubantu系统下安装crontab 正常情况下需要先执行:apt-get upgrade 进行升级 安装:apt-get install cron ...

  9. MASA Framework -- 跨进程事件 IntegrationEventBus入门与设计

    概述 跨进程事件总线允许发布和订阅跨服务传输的消息, 服务的发布与订阅不在同一个进程中 在Masa Framework中, 跨进程总线事件提供了一个可以被开箱即用的程序 IntegrationEven ...

  10. lightdm开机无法自启问题

    简述 由于我学习了 systemctl disable 服务 这条命令,然后开始皮,把 lightdm 自启动关了,然后开不开了 解决办法:重置 lightdm 服务配置 sudo dpkg-reco ...