上传图片文件并立即显示到页面使用 javascript实现鼠标拖动画矩形框以及实现固定区域内随意拖动
首先,你要设计好鼠标事件处理方法,主要是鼠标左键点击,左键释放,还有鼠标移动方法
其次,要了解容什么方式,画一个矩形,设计一个方法: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实现鼠标拖动画矩形框以及实现固定区域内随意拖动的更多相关文章
- mac nginx+php-fpm配置(安装过后nginx后访问php文件下载,访问php文件请求200显示空白页面)
访问php文件下载是因为没配置php-fpm 两个问题主要都是nginx.conf配置的问题: /usr/local/etc/nginx/nginx.conf server { listen 8 ...
- ASP.NET Core应用针对静态文件请求的处理[5]: DefaultFilesMiddleware中间件如何显示默认页面
DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认文件,那么前面介绍的StaticFileMiddleware中间件会 ...
- .net网站上传图片换电脑不显示 当不用网站的IP地址访问图片,只用相对路径访问时,在发布网站的时候,将上传图片的目标文件夹,包含在项目中再发布即可。
.net网站上传图片换电脑不显示 当不用网站的IP地址访问图片,只用相对路径访问时,在发布网站的时候,将上传图片的目标文件夹,包含在项目中再发布即可.
- 用Seam实现:图片上传 + 保存到数据库 + 从数据库读出图片并显示到页面中
上传图片并保存到数据库 seam给我们提供了 s:fileUpload 标签以完成文件上传功能.使用该标签时,要在web.xml中声明一个Seam的过滤器: <filter> <fi ...
- vue中使用axios post上传头像/图片并实时显示到页面
在前端开发中,为了更好的用户体验,在头像上传时会先将图片显示到页面然后点击保存按钮 完成图片的上传成功 代码部分有参考他人的写法. html代码: <div id="myPhoto ...
- ajax上传图片文件
这里用的是一个隐藏的iframe,这样可以让form表单提交到这个iframe里面,用户就看不到页面的刷新了 前段时间在解决ajax上传文件时折腾了好一阵.直接用$.post上传文本信息肯定是没有问题 ...
- vant自动上传图片/文件
vant自动上传文件/图片 vant上传图片与elementUI有所不同,没有自动上传功能,所以与后端进行接口对接的时候可以在after-read中将文件进行上传 html页面 <!-- 上传图 ...
- DefaultFilesMiddleware中间件如何显示默认页面
DefaultFilesMiddleware中间件如何显示默认页面 DefaultFilesMiddleware中间件的目的在于将目标目录下的默认文件作为响应内容.我们知道,如果直接请求的就是这个默认 ...
- [Ajax] 使用Ajax异步上传图片文件(非Form表单提交)
通过表单Form提交来上传文件的方式这里就不说了: 下面介绍,通过js中使用ajax异步上传图片文件: 新建一个html页面和一个一般处理程序即可: 涉及思路: //发送2次Ajax请求完成js异步上 ...
- Ajax上传文件进度条显示
要实现进度条的显示,就要知道两个参数,上传的大小和总文件的大小 html5提供了一个上传过程事件,在上传过程中不断触发,然后用已上传的大 小/总大小,计算上传的百分比,然后用这个百分比控制div框的显 ...
随机推荐
- TCP 序列号和确认号是如何变化的?
大家好,我是小林. 在网站上回答了很多人的问题,我发现很多人对 TCP 序列号和确认号的变化都是懵懵懂懂的,只知道三次握手和四次挥手过程中,ACK 报文中确认号要 +1,然后数据传输中 TCP 序列号 ...
- 搭建harbor私有仓库
2-1.项目说明 Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器,由VMware开源,其通过添加一些企业必需的功能特性,例如安全.标识和管理等,扩展了开源 Docke ...
- Nginx实用配置-2
Nginx配置-2 1.升级Openssl [root@rocky8 ~]# nginx -V #查看现在nginx的OpenSSL版本和编译情况 nginx version: nginx/1.22. ...
- HTML5和CSS3新特性
1.HTML5新标签和属性 1.1 兼容性前缀与语义化 兼容低版本的写法.比较新的浏览器,可以直接写.兼容性前缀,是每个浏览器私有的. 内核 兼容性前缀 浏览器 Gecko -moz- Firefox ...
- jmeter分布式压测对master、slave防火墙配置
首先要了解jmeter分布式压测的基础概念:master为统计结果的服务器,slave为各台压力机,如下图所示 一.结论 针对master 1.修改jmeter.properties的client.r ...
- 抠网页标题栏logo(图标)
1.打开自己需要抠的网页,例如百度页面 2.在这个网页链接后面+" /favicon.ico " 就可以提取ico图片 3.回车进去,右键鼠标,选择另存为图片就可以成功保存网页中的 ...
- 快速构建页面结构的 3D Visualization
对 Chrome 扩展功能熟悉的小伙伴,可能都有用过 Chrome 的 3D 展示页面层级关系这个功能. 可以通过 控制台 --> 右边的三个小点 --> More Tools --> ...
- 【Android】Configuration中的locale已过时
Configuration中有很多属性的设置,在编译时提示错误说locale已过时这个是设置语言的 使用最新的方法如下 configuration.setLocale(locale);
- 基于jenkins+kubernetes的cicd流程实践一:环境搭建及方案原理实现
1.基础环境:Centos7.9,kubernetes:v1.21.5 node-1@112(master):docker,containerd,harbornginx(80),git,etcd no ...
- 【每日一题】【BFS&Lambda&重建二叉树】2022年2月15日-根据先序中序重建并输出二叉树的右视图
描述 请根据二叉树的前序遍历,中序遍历恢复二叉树,并打印出二叉树的右视图 思路:重建&层次遍历记录最后一个&Lambda表达式 答案: import java.util.*; publ ...