鼠标   1.操作canvas 中的 img。 右键放大缩小,左键移动img。

   2.拖动input type= range  改变图片的透明度

html 代码

<!DOCTYPE html>
<html lang="en" oncontextmenu="doNothing()">
<head>
<meta charset="UTF-8">
<title>图片已中心店的坐标缩放</title>
<style>
#box1 {
width: 500px;
height: 300px;
border: 1px solid black;
overflow: hidden;
float: left;
} #box2 {
width: 500px;
height: 300px;
border: 1px solid black;
overflow: hidden;
float: left;
margin-left: 50px;
box-sizing: border-box;
}
</style>
<script type="text/javascript">function ss() {
if (event.button == ) {
alert("aaaa");
}
document.onmousedown = ss;
}</script>
</head>
<body>
<div>
<div id="box1">
<canvas id="cas1" width="" height=""></canvas>
</div>
<div id='box2'>
<canvas id="cas2" width="" height=""></canvas>
</div>
<div style="clear: both"></div>
</div>
<input type="range" id="inp_d" value="">
</body>
<script src="http://code.jquery.com/jquery-latest.js"></script>
<script src="./index.js"></script>
</html>

js 代码

/**
* Created by Administrator on 2018/7/6.
*/
function doNothing() {
window.event.returnValue = false;
return false;
} var imgX = 0;
var imgY = 0;
var imgScale = 1;
var val = 0;
window.onload = function (event) {
var count = [
{cas2: 'cas1', box2: '#box1,#box2', path: './2.jpg', callback: imgOnload_callbak, scale: methods,icon_img:'./4.jpg,./5.jpg',inp_id:'#inp_d,#inp_d'},
{cas2: 'cas2', box2: '#box1,#box2,',path: './3.jpg', callback: imgOnload_callbak, scale: methods,icon_img:'./5.jpg,./4.jpg',inp_id:'#inp_d,#inp_d'}
];
for (var i = 0; i < count.length; i++) {
getElement(count[i].cas2, count[i].box2, count[i].path, count[i].callback, count[i].scale,count[i].icon_img,count[i].inp_id)
}
}; function getElement(cas_id, box_id, img_src, imgOnload_call, methods,icon_img,inp_id) {
var canvas = document.getElementById(cas_id);
var box = document.getElementById(box_id);
var arr = box_id.split(',');
var context = canvas.getContext('2d');
var img = new Image();
var img1 = new Image();
var img1_arr = icon_img.split(',');
img.src = img_src;
for(var i = 0; i < img1_arr.length;i++){
img1.src = img1_arr[i];
}
imgOnload_call(img, context, canvas, img1);
methods(arr, canvas, context, img,img1);
inp_methods(inp_id,context,canvas,img,img1)
} function imgOnload_callbak(img,context,canvas,img1) {
img.onload = function () {
context.globalAlpha = 1.0;
context.drawImage(img, 0, 0);
};
img1.onload = function (){
setTimeout(function(){
context.globalAlpha = 0;
context.drawImage(img1,0,0,img1.width,img1.height,0,0,img1.width,img1.height);
},50);
}
} function methods(elements, canvas, context, img,img1) {
var img_y = 1;
elements.forEach(function (item, i) {
$(item).mousedown(function (event) {
console.log(val);
var e_btn = event.button;
if (e_btn == 2) {
var e_down_y = event.clientY;
$(item).mousemove(function (event) {
var e_move_y = event.clientY;
if (e_move_y < e_down_y) {
img_y *= 1.01;
} else {
img_y /= 1.01;
}
e_down_y = e_move_y;
img_y = (img_y > 1) ? img_y : 1;
canvas.style.transform = "scale(" + img_y + "," + img_y + ")"
});
$(item).mouseup(function () {
$(item).unbind('mousemove');
$(item).unbind('mouseup');
})
}
else if (e_btn == 0) {
var e_drag_down = {
x: event.clientX,
y: event.clientY
};
$(item).mousemove(function (event) {
var e_drag_move = {
x: event.clientX,
y: event.clientY
};
var e_drag_distance = {
x: e_drag_move.x - e_drag_down.x,
y: e_drag_move.y - e_drag_down.y
};
e_drag_down = e_drag_move;
imgX += e_drag_distance.x;
imgY += e_drag_distance.y;
context.clearRect(0, 0, canvas.width, canvas.height);
context.globalAlpha = 1.0;
context.drawImage(img, 0, 0, img.width, img.height, (imgX / 5), (imgY / 5), img.width * imgScale, img.height * imgScale);
context.globalAlpha = val;
context.drawImage(img1, 0, 0, img1.width, img1.height, (imgX / 5), (imgY / 5), img1.width * imgScale, img1.height * imgScale);
});
$(item).mouseup(function () {
$(item).unbind("mousemove");
$(item).unbind('mouseup');
})
}
})
})
} function inp_methods(inp_id,context,canvas,img,img1){
var inp_id_arr = inp_id.split(',');
inp_id_arr.forEach(function(item,i){
$(item).on('input propertychange',function(){
val = $(item).val();
val = ( val < 0.1)? 0.1 : val/100;
context.clearRect(0,0,canvas.width,canvas.height);
context.globalAlpha = 1.0;
context.drawImage(img,0,0,img.width, img.height, (imgX / 5), (imgY / 5), img.width * imgScale, img.height * imgScale);
context.globalAlpha = val;
context.drawImage(img1,0,0,img1.width, img1.height, (imgX / 5), (imgY / 5), img1.width * imgScale, img1.height * imgScale);
})
});
}

有错误的地方,请大家帮忙 指正一下。谢谢!

js -- canvas img 封装的更多相关文章

  1. 【微信小程序项目实践总结】30分钟从陌生到熟悉 web app 、native app、hybrid app比较 30分钟ES6从陌生到熟悉 【原创】浅谈内存泄露 HTML5 五子棋 - JS/Canvas 游戏 meta 详解,html5 meta 标签日常设置 C#中回滚TransactionScope的使用方法和原理

    [微信小程序项目实践总结]30分钟从陌生到熟悉 前言 我们之前对小程序做了基本学习: 1. 微信小程序开发07-列表页面怎么做 2. 微信小程序开发06-一个业务页面的完成 3. 微信小程序开发05- ...

  2. Atitit js canvas的图像处理类库attilax总结与事业

    Atitit js canvas的图像处理类库attilax总结与事业 1.1. 脸部识别JavaScript类库Tracking.js1 1.2. AlloyImage特性1 1.3. CamanJ ...

  3. [JS,Canvas]日历时钟

    [JS,Canvas]日历时钟 Html: <!doctype html> <html> <head> <meta charset="UTF-8&q ...

  4. JS类的封装及实现代码

    js并不是一种面向对向的语言, 没有提供对类的支持, 因此我们不能像在传统的语言里那样 用class来定义类, 但我们可以利用js的闭包封装机制来实现js类, 我们来封装一个简的Shape类. 1. ...

  5. 【转】第7篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:全自动注册与反射方法分析

    作者: 牛A与牛C之间 时间: 2013-12-12 分类: 技术文章 | 2条评论 | 编辑文章 主页 » 技术文章 » 第7篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  6. 【转】第6篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+自动反射方法分析

    作者: 牛A与牛C之间 时间: 2013-11-21 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第6篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  7. 【转】第5篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:自动注册JS脚本+委托回调方法分析

    作者: 牛A与牛C之间 时间: 2013-11-19 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第5篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  8. 【转】第4篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:委托回调方法分析

    作者: 牛A与牛C之间 时间: 2013-11-18 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第4篇:Xilium CefGlue 关于 CLR Object 与 JS ...

  9. 【转】3篇:Xilium CefGlue 关于 CLR Object 与 JS 交互类库封装报告:官方原生方法分析

    作者: 牛A与牛C之间 时间: 2013-11-17 分类: 技术文章 | 暂无评论 | 编辑文章 主页 » 技术文章 » 第3篇:Xilium CefGlue 关于 CLR Object 与 JS ...

随机推荐

  1. AIX 6.1 Oracle 10G 数据库GoldenGate实施

    安装环境说明: 源端:AIX 6.1 10.190.1.215 目标端:Linux 10.191.1.10 1:源端创建goldengate 表空间. 表空间的要求:最小500m,大点3-5G,设置自 ...

  2. Unified BeginFrame scheduling for Chrome

    Unified BeginFrame scheduling for Chrome http://goo.gl/D1Qxrr Status: http://crbug.com/401331 and ht ...

  3. JavaScript知识复习

    JavaScript 数据类型 原始数据类型: number string boolean null undefined 对象:object: Function Array Date... 共有六种数 ...

  4. Kubernetes1.5 集成dashboard

    Kubernetes1.5 集成dashboard 配置kubernetes的dashboard相对简单.同样的,只需要从源码中获取到dashboard-controller.yaml及dashboa ...

  5. 记intel杯比赛中各种bug与debug【其五】:朴素贝叶斯分类器的实现和针对性的优化

    咱这个项目最主要的就是这个了 贝叶斯分类器用于做可以统计概率的二元分类 典型的例子就是垃圾邮件过滤 理论基础 对于贝叶斯算法,这里附上两个链接,便于理解: 朴素贝叶斯分类器的应用-阮一峰的网络日志 基 ...

  6. java源码学习

    Collection List ArrayList LinkedList Vector Stack Set HashSet TreeSet Map HashMap TreeMap LinkedHash ...

  7. 装了ubuntu后笔记本电脑的无线网卡用不了,怎么设置?

    百度经验的一篇文章 http://jingyan.baidu.com/article/ca2d939dd4f1b4eb6c31ce09.html 点击右上角的齿轮,选择“系统设置”   点击“软件和更 ...

  8. 紫书 习题 10-2 UVa 808(建立坐标+找规律)

    这次是我遇见过最迷的一次 我写的程序uDebug全过 和ac程序对拍也过,求出来的坐标是一模一样的,最后结果输出的方式也是一样的 交上去就是错的 迷 第一次遇到这种情况 大佬在哪里 #include& ...

  9. Linux Network配置

    /etc/sysconfig/network [root@mytest ~]# cat /etc/sysconfig/network NETWORKING=yes HOSTNAME=mytest /e ...

  10. C++关于二进制位操作小结

    #include <iostream> using namespace std; //二进制位逆序. int Grial(int x) { int n = 32; int count = ...