首先,你要设计好鼠标事件处理方法,主要是鼠标左键点击,左键释放,还有鼠标移动方法
其次,要了解容什么方式,画一个矩形,设计一个方法: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. DevOps | 如何快速提升团队软件开发成熟度,快速提升研发效能?

    今天一个小伙伴问我,如何「快速提升」一个团队的软件开发成熟度?我犯难了.我个人理解一个团队的软件开发成熟度涉及的东西很多,但最简单最直接的方法就是发钱涨工资,可是估计很多公司不愿意,那就只有扣了. 快 ...

  2. 十五、资源控制之Deployment

    资源控制器之Deployment Deployment 为 Pod 和 ReplicaSet 提供了一个声明式定义(declarative)方法,用来替代以前的ReplicationControlle ...

  3. 微信小程序之顶部导航栏

    wxml: <!--导航条--><view class="navbar"> <text wx:for="{{navbar}}" d ...

  4. Java多线程-ThreadPool线程池(三)

    开完一趟车完整的过程是启动.行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速.频繁地踩刹车等动作.因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油. 而一个Java线程 ...

  5. CSP2022游记

    第一次几乎完全没有准备的比赛 也是倒数第二场比赛 Day -1 上了一天文化课,晚上还有强基班. 强基班上完之后来机房写了几个板子就开始颓废了 基本上就抱着摆烂的心态 不过是第一次在学校拿到手机 还在 ...

  6. Sprint产品待办列表的优先级要怎么排?

    在梳理产品待办事项列表的过程中,产品负责人需要先做优先级排列,保证我们 在一定的时间盒内能够交付需要优先级最高.最具价值的用户故事. 那这个用户故事的优先级要怎么排列,我们怎样选择用户故事的实现顺序? ...

  7. HTTPS - 揭秘 TLS 1.2 协议完整握手过程--此文为转发文,一定要结合wirshark工具看,很清楚

    winshark 筛选条件为:tls and ip.src==xxx 本文通过对一次 TLS 握手过程的数据抓包分析做为切入点,希望能进一步的帮助大家理解 HTTPS 原理. HTTPS 是建立在 S ...

  8. Python冷知识:如何找出新版本增加或删除了哪些标准库?

    "内置电池"是 Python 最为显著的特性之一,它提供了 200 多个开箱即用的标准库.但是,历经了 30 多年的发展,很多标准库已经成为了不得不舍弃的历史包袱,因为它们正在&q ...

  9. OSI传输层TCP与UDP协议、应用层简介、socket模块介绍及代码优化、半连接池的概念

    目录 传输层之TCP与UDP协议 应用层 socket模块 socket基本使用 代码优化 半连接池的概念 传输层之TCP与UDP协议 TCP与UDP都是用来规定通信方式的 通信的时候可以随心所欲的聊 ...

  10. Git同步操作

    同步github数据 先要进入仓库文件夹 新建仓库文件夹要初始化或将远程仓库clone下来 git init或git clone https://github.com/用户名称/仓库名称.git 新建 ...