首先,你要设计好鼠标事件处理方法,主要是鼠标左键点击,左键释放,还有鼠标移动方法
其次,要了解容什么方式,画一个矩形,设计一个方法: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. 即兴小探华为开源行业领先大数据虚拟化引擎openLooKeng

    @ 目录 概述 定义 背景 特点 架构 关键技术 应用场景 安装 单台部署 集群部署 命令行接口 连接器 MySQL连接器 ClickHouse连接器 概述 定义 openLooKeng 官网地址 h ...

  2. JMETER与它的组件们

    JSON提取器与Debug Sampler 我们平时会遇到很多JSON格式的接口返回,我们需要提取参数可以用JSON提取器,同时配合自带的调试器来进行调试.  JSON提取器 Name of crea ...

  3. Python基础之面向对象:1、面向对象及编程思想

    一.人狗大战 1.需求 用代码模拟人.狗打架的小游戏 人和狗种类不同,因此双方的属性各不相同 推导一: 人和狗各有不同属性 使用字典方式储存属性较为方便,并可储存多种属性 # 1.在字典内储存'人'属 ...

  4. Python基础之函数:5、内置函数、迭代器对象、异常的捕获和处理

    目录 一.重要内置函数 1.zip() 2.filter() 3.sorted() 二.常见内置函数 1. abs() 2.all.any() 3.bin.oct.hex.int() 4.bytes( ...

  5. 【Bluetooth蓝牙开发】一、开篇词 | 打造全网最详细的Bluetooth开发教程

    个人主页:董哥聊技术 我是董哥,嵌入式领域新星创作者 创作理念:专注分享高质量嵌入式文章,让大家读有所得! 文章目录 1.前言 2.蓝牙综合介绍 3.精华文章汇总 4.结语 1.前言 大家好,我是董哥 ...

  6. pagehelper使用有误导致sql多了一个limit

    接口测试报告中发现时不时有一个接口报错,但再跑一次又没有这个报错了.报错信息是sql异常,sql中有两个limit.查看后台代码和XXmapper.xml,发现确实只有一个limit.一开始开发以为是 ...

  7. C++初阶(命名空间+缺省参数+const总结+引用总结+内联函数+auto关键字)

    命名空间 概述 在C/C++中,变量.函数和后面要学到的类都是大量存在的,这些变量.函数和类的名称将都存在于全局作用域中,可能会导致很多冲突.使用命名空间的目的是对标识符的名称进行本地化,以避免命名冲 ...

  8. 嵌入式-C语言基础:数组得初始化

    #include<stdio.h> int main() { int a[10]; int size=sizeof(a)/sizeof(a[0]);//计算数组得大小 for(int i= ...

  9. Vue.js3.0练习题

    第一章:Vue 3.0 概述 1.选择题 1.1.在MVVM设计模式中,Model代表的是_______. A. 数据模型        B. 控制器       C. 视图      D.监听模型 ...

  10. Hadoop安装-分布式-Fully

    Hadoop安装-分布式-Fully 〇.所需资料 一.配置 1.基础配置 (1)系统安装 (2)hostname主机名配置 (3)ip地址.dns.hosts映射文件配置 (4)关闭防火墙与seli ...