js小学生图区_js实现图片区域可点击大小随意改变(适用移动端)代码实例
实现图片区域可点击,实际上使用map是可以的,但是适配效果并不好,图片只能是固定大小的值,而且点都被写死了。
在这里,我使用的js基于canvas写的一个小工具。可以圈出你需要点击的部分,然后生成一串json,在预览页面就可以看见效果了;
在实际应用中,只要用工具处理一下图片,再把数据存入数据库,就很方便了;
使用工具时,先上传图片。然后就可以圈了,圈完一定要记得,点击保存数据,,,接着就可以预览了,预览点击的效果,可以看控制台,
首先是工具
首先工具的html
*{
padding: 0;
margin: 0;
font-family: "微软雅黑";
}
.hide{
display: none;
}
canvas{
border: 1px solid red;
display: block;
margin: 0 auto;
background-position: 0 0;
background-repeat: no-repeat;
background-size: 100% 100%;
}
.cover{
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 100%;
background: rgba(0,0,0,0.4);
}
.cover p{
text-align: center;
}
.btn{
width: 800px;
margin: 0 auto;
padding-top: 10px;
}
.btn p{
padding-bottom: 10px;
}
a{
text-decoration: none;
color: #000;
}
button{
line-height: 30px;
padding: 0 10px;
cursor: pointer;
border-radius: 4px;
background: #449d44;
color: #fff;
border: none;
}
保存数据
导入数据
查看数据
预览效果
撤销
清除
基础宽度:
基础高度:
url地址:
描述:
确认
接着是工具的js代码
var canvas = document.getElementById('canvas');
var ctx = canvas.getContext('2d');
ctx.lineWidth = 1;
ctx.strokeStyle="green";
/*ctx.beginPath();
ctx.moveTo(10, 100);
ctx.lineTo(300,100);
ctx.stroke();
ctx.closePath();*/
var run = false;
var moduleList = [];
var path = [];
var $baseImg = '';
var $cover = $(".cover");
var $urlAddress = $('#urlAddress');
var $dec = $("#dec");
var $baseWidth = $('#width');
var $baseHeight = $('#height');
canvas.onmousedown = function(e){
//console.log(e.clientX);
//console.log(e.offsetX);
ctx.beginPath();
ctx.moveTo(e.offsetX, e.offsetY);
path.push({
x:e.offsetX,
y:e.offsetY
});
run = true;
}
canvas.onmousemove = function(e){
//var x = e.offsetX;
if(run){
ctx.lineTo(e.offsetX, e.offsetY);
ctx.stroke();
path.push({
x:e.offsetX,
y:e.offsetY
});
}
}
canvas.onmouseup = function(e){
run = false;
ctx.closePath();
if(path.length > 10){
$cover.removeClass('hide');
}else{
path = [];
}
}
//保存数据
function saveData(){
var data = {
"dec":"图片点击",
"version":"1",
"img":$baseImg,
"module":moduleList,
"baseWidth":$baseWidth.val(),
"baseHeight":$baseHeight.val()
}
console.log(JSON.stringify(data));
localStorage.setItem("data",JSON.stringify(data));
}
//查看数据
function seeData(flag){
var data = {
"dec":"图片点击",
"version":"1",
"img":$baseImg,
"module":moduleList,
"baseWidth":$baseWidth.val(),
"baseHeight":$baseHeight.val()
}
if(flag){
console.log(JSON.stringify(data));
}
return data;
}
//图片背景
$('#imgload').on('change',function(){
imgToBase64(this.files[0],function(result){
console.log(result);
var base64Data = 'url(' + result + ')';
$(canvas).css({'background-image': base64Data});
$baseImg = result;
});
});
//转化为base64
function imgToBase64(file,callback){
var reader = new FileReader();
reader.onload = function (e) {
callback(e.target.result);
};
reader.readAsDataURL(file); // 读取完后会调用onload方法
}
//确认信息
$cover.on('click','.contain',function(){
if($urlAddress.val() == ''){
alert('地址不能为空');
}else{
moduleList.push({
id:getName(),
path:path,
url:$urlAddress.val(),
dec:$dec.val()
});
path = [];
$cover.addClass('hide');
}
});
//修改高度和宽度
$baseWidth.on('change',function(){
$(canvas).css({'width': $(this).val()});
});
$baseHeight.on('change',function(){
$(canvas).css({'height': $(this).val()});
});
//随机获取名称
function getName(){
var timer = new Date();
var arr = JSON.stringify(timer).replace(/:|-|"/g ,'').split('.');
var str = arr.join('');
return str;
}
//导入模板
function getData(){
var data = JSON.parse(localStorage.getItem("data"));
if(data){
moduleList = data.module;;
$baseImg = data.img;
drawn(data);
}else{
alert('没有模板数据.');
}
}
//撤销
function reduo(){
moduleList.pop();
ctx.clearRect(0, 0, canvas.width, canvas.height);
drawn(seeData());
}
//清除所有
function clearAll(){
moduleList = [];
ctx.clearRect(0, 0, canvas.width, canvas.height);
}
//给数据,画出来
function drawn(data){
ctx.clearRect(0, 0, canvas.width, canvas.height);
var module = data.module;
var base64Data = 'url(' + data.img + ')';
$(canvas).css({'background-image': base64Data});
$baseWidth.val(data.baseWidth);
$baseHeight.val(data.baseHeight);
$(canvas).css({'width': data.baseWidth,'height':data.baseHeight});
//开始画
for(var i = 0; i < module.length;i++){
var path = module[i].path;
ctx.beginPath();
ctx.moveTo(path[0].x, path[0].y);
for(var j = 1; j < path.length; j++){
ctx.lineTo(path[j].x, path[j].y);
ctx.stroke();
}
ctx.closePath();
}
}
最后是preview.html预览
*{
padding: 0;
margin: 0;
}
body,html{
width: 100%;
height: 100%;
}
canvas{
background-position: 0 0;
background-repeat: no-repeat;
background-size: 100% 100%;
width: 100%;
height: 100%;
}
.wrap{
border: 1px solid red;
margin: 0 auto;
width: 800px;
height: 600px;
}
var $canvas = $('#canvas');
var canvas = $canvas[0];
var data = JSON.parse(localStorage.getItem("data"));
var ctx = canvas.getContext('2d');
ctx.lineWidth = 1;
ctx.strokeStyle="rgba(0,0,0,0)";
var module = data.module;
var rateWidth = $canvas.width()/data.baseWidth;
var rateHeight = $canvas.height()/data.baseHeight;
var base64Data = 'url(' + data.img + ')';
$canvas.css({'background-image': base64Data});
console.log(rateWidth);
console.log(rateHeight);
//判断点击了图片的某个地方
canvas.onclick = function(e){
var x = event.pageX - canvas.getBoundingClientRect().left;
var y = event.pageY - canvas.getBoundingClientRect().top;
for(var i = 0; i < module.length;i++){
var path = module[i].path;
ctx.beginPath();
ctx.moveTo(path[0].x*rateWidth, path[0].y*rateHeight);
for(var j = 1; j < path.length; j++){
ctx.lineTo(path[j].x*rateWidth, path[j].y*rateHeight);
}
ctx.closePath();
if(ctx.isPointInPath(x, y)){
clickCall(module[i]);
return;
}
}
};
//点击中了选中的区域
function clickCall(result){
console.log(result.dec);
console.log(result.url);
}
效果
以上就是本文的全部内容,希望对大家的学习有所帮助
您可能感兴趣的文章:
js小学生图区_js实现图片区域可点击大小随意改变(适用移动端)代码实例相关推荐
- js小学生图区_js 图片区域可点击,适配移动端,图片大小随意改变
实现图片区域可点击,实际上使用map是可以的,但是适配效果并不好,图片只能是固定大小的值,而且点都被写死了. 在这里,我使用的js基于canvas写的一个小工具.可以圈出你需要点击的部分,然后生成一串 ...
- js小学生图区_js读取本地图片并显示
版权声明:本文为博主原创文章,未经博主允许不得转载. 根据项目需要,需要选择本地图片并显示在页面上,然后上传至服务器.因为自身刚刚接触js,所以比较生疏,碰到问题吼,幸好有强大的网络,搜索很多有用的资 ...
- js小学生图区_多种方式实现js图片预览
js多种方式图片预览-持续更新 //设置自己的变量存储区 var Util = { file : $("#file"), image_show:$("#img_show& ...
- js小学生图区_推荐12个最好的 JavaScript 图形绘制库
众多周知,图形和图表要比文本更具表现力和说服力.图表是数据图形化的表示,通过形象的图表来展示数据,比如条形图,折线图,饼图等等.可视化图表可以帮助开发者更容易理解复杂的数据,提高生产的效率和 Web ...
- Auto.js 找图 找色 剪切图片 坐标区域计算方法
- java键盘控制英雄左右移动_js实现键盘操作实现div的移动或改变的原理及代码
昨天记录了获取键盘按键的值的事件,有了值,无非就是针对不同值做不同的操作嘛,而且之前曾经在写贪吃蛇时也用到过.结果一捯饬,又是好久的一段时间,所以感觉有必要记录下的,一方面确有可取之处,另一方面也对自 ...
- html制作心形状图片,HTML5 Canvas实现玫瑰曲线和心形图案的代码实例
效果图: 提示:把代码复制到一个html文件中并保存,直接打开即可看到效果. 实现代码: HTML5 Demo #apDiv1 { position:absolute; width:120px; he ...
- java中的js是什么意思_js和java的区别是什么?
Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承.指针等概念,因此Java语言具有功能强大和简单易用两个特征. js(JavaScript)是一种直译式 ...
- JS兼容各个浏览器的本地图片上传即时预览效果
JS兼容各个浏览器的本地图片上传即时预览效果 很早以前 在工作曾经碰到这么一个需求,当时也是纠结了很久,也是google了很久,没有碰到合适的demo,今天特意研究了下这方面的的问题,所以也就做了个简 ...
最新文章
- gradle的基本设置
- [html] 说说你对H5的ServiceWorker的理解,它有什么运用场景?
- asterisk 互联
- Java面试易错题精选
- 汽车电子研究报告:下一个苹果产业链
- Windows 2000 Server Resource Kit CD BT下载地址
- 如何使用 DiskGenius 合并分区
- 八类网线和七类网线的区别_七类网线和六类网线区别有哪些
- 深度学习面试每日一题
- 互联网周刊_11年第15期(115网盘下载)
- 继电器写法c语言单片机,51单片机-继电器编程
- OkHttp3使用介绍
- 新手使用PS心得-技巧
- 基于惯性轮倒立摆原理的自行车
- 升级版的冒泡排序Java
- 小工具:用C++读取TGA并输出数据到文本
- 正则表达式判断以字母开头的
- SAP上云——助力制造业数字化转型
- SQL注入——基于时间的盲注(sqli-labs less9)
- HDU - 相遇周期