基于jquery自定义图片热区效果


Posted in Javascript onJuly 21, 2012

现在整理下发出来,希望大家共同学习吧

先看效果图:
基于jquery自定义图片热区效果
用了jquery.image-maps.js这个插件 下载地址 https://3water.com/jiaoben/57930.html
原理是:
通过拖动计算出当前热区可移动模块的left top right bottom
对应area的 coords 属性集成上面的位置,就可以实现热区了。
对应的模块代码是:

<!--模块展示 begin--> 
<div class="modeShow"> 
<div id="debug"></div> 
<div class="imgMap mapBox"> 
<img src="../images/hot_images_map.png" name="test" border="0" usemap="#Map1" width="980" height="450" ref='imageMaps' /> 
<map name="Map1"> 
<area shape="rect" coords="300,80,500,150" href="mall.10010.com" /> 
</map> 
</div> 
</div> 
<!--模块展示 end—>

js代码:
(function($) { 
jQuery.fn.imageMaps = function(setting) { 
var $container = this; 
if ($container.length == 0) return false; 
$container.each(function(){ 
var container = $(this); 
var $images = container.find('img[ref=imageMaps]'); 
$images.wrap('<div class="image-maps-conrainer image-maps-conrainerEdit" style="position:relative;"></div>').css('border','1px solid #ccc'); 
$images.each(function(){ 
var _img_conrainer = $(this).parent(); 
_img_conrainer.append('<div class="button-conrainer"><a href="javascript:void(0)" class="addHot">添加热点</a><a href="javascript:void(0)" class="addImg">上传图片</a><a class="delSub delMode" href="javascript:void(0)">删除×</a></div>').append('<div class="link-conrainer"><ul></ul><div class="clr"></div></div><div class="clr"></div><span class="numFloor">模块-1</span>').append($.browser.msie ? $('<div class="position-conrainer" style="position:absolute"></div>').css({ 
background:'#fff', 
opacity:0 
}) : '<div class="position-conrainer" style="position:absolute"></div>'); 
var _img_offset = $(this).offset(); 
var _img_conrainer_offset = _img_conrainer.offset(); 
_img_conrainer.find('.position-conrainer').css({ 
top: _img_offset.top - _img_conrainer_offset.top, 
left: _img_offset.left - _img_conrainer_offset.left, 
width:$(this).width(), 
height:$(this).height(), 
border:'1px solid transparent' 
}); 
var map_name = $(this).attr('usemap').replace('#',''); 
if(map_name !=''){ 
var index = 1; 
var _link_conrainer = _img_conrainer.find('.link-conrainer ul'); 
var _position_conrainer = _img_conrainer.find('.position-conrainer'); 
var image_param = $(this).attr('name') == '' ? '' : '['+ $(this).attr('name') + ']'; 
container.find('map[name='+map_name+']').find('area[shape=rect]').each(function(){ 
var coords = $(this).attr('coords'); 
$(this).attr('ref',"1"); 
_link_conrainer.append('<li ref="'+index+'" class="map-link"><span class="link-number-text">热点'+index+'</span>: <input type="text" size="60" name="link'+index+'" class="linkHref" value="'+$(this).attr('href')+'" /><input type="hidden" class="rect-value" name="rect'+index+'" value="'+coords+'" /></li>'); 
coords = coords.split(','); 
_position_conrainer.append('<div ref="'+index+'" class="map-position" style="left:'+coords[0]+'px;top:'+coords[1]+'px;width:'+(coords[2]-coords[0])+'px;height:'+(coords[3]-coords[1])+'px;"><div class="map-position-bg"></div><span class="link-number-text">热点'+index+'</span><span class="delete">X</span><span class="resize"></span></div>'); 
index++; 
}); 
} 
}); 
}); 
$container.find('.button-conrainer .addHot').live("click",function(){ 
var _link_conrainer = $(this).parent().parent().find('.link-conrainer ul'); 
var _position_conrainer = $(this).parent().parent().find('.position-conrainer'); 
var index = _link_conrainer.find('.map-link').length +1; 
var _coordsMap = $(this).parent().parent().next('map'); 
var image = $(this).parent().parent().find('img[ref=imageMaps]').attr('name'); 
image = (image == '' ? '' : '['+ image + ']'); 
_link_conrainer.append('<li ref="'+index+'" class="map-link"><span class="link-number-text">热点'+index+'</span>: <input type="text" size="60" name="link'+index+'" class="linkHref" value="" /><input type="hidden" class="rect-value" name="rect'+index+'" value="300,80,500,150" /></li>'); 
_position_conrainer.append('<div ref="'+index+'" class="map-position" style="left:300px;top:80px;width:200px;height:70px;"><div class="map-position-bg"></div><span class="link-number-text">热点'+index+'</span><span class="delete">X</span><span class="resize"></span></div>'); 
var coords = _link_conrainer.find('input[name=rect'+ index +']').val(); 
_coordsMap.append('<area ref="'+index+'" href="" coords="'+ coords +'" shape="rect">'); 
$("input[name='link"+index+"']").val("请输入本热点对应的链接地址"); 
bind_map_event(); 
define_css(); 
//添加map热区 
}); 
//修改链接地址 
$(".linkHref").live("blur",function(){ 
var valueHref = $(this).val(); 
var thisRef = $(this).parent().attr('ref'); 
var appArea = $(this).parents(".link-conrainer").parent().next('map'); 
$(this).val(valueHref); 
appArea.find('area[ref='+thisRef+']').attr("href",valueHref); 
}); 
//绑定map事件 
function bind_map_event(){ 
$('.position-conrainer .map-position .map-position-bg').each(function(){ 
var map_position_bg = $(this); 
var conrainer = $(this).parent().parent(); 
map_position_bg.unbind('mousedown').mousedown(function(event){ 
map_position_bg.data('mousedown', true); 
map_position_bg.data('pageX', event.pageX); 
map_position_bg.data('pageY', event.pageY); 
map_position_bg.css('cursor','move'); 
return false; 
}).unbind('mouseup').mouseup(function(event){ 
map_position_bg.data('mousedown', false); 
map_position_bg.css('cursor','default'); 
return false; 
}); 
conrainer.mousemove(function(event){ 
if (!map_position_bg.data('mousedown')) return false; 
var dx = event.pageX - map_position_bg.data('pageX'); 
var dy = event.pageY - map_position_bg.data('pageY'); 
if ((dx == 0) && (dy == 0)){ 
return false; 
} 
var map_position = map_position_bg.parent(); 
var p = map_position.position(); 
var left = p.left+dx; 
if(left <0) left = 0; 
var top = p.top+dy; 
if (top < 0) top = 0; 
var bottom = top + map_position.height(); 
if(bottom > conrainer.height()){ 
top = top-(bottom-conrainer.height()); 
} 
var right = left + map_position.width(); 
if(right > conrainer.width()){ 
left = left-(right-conrainer.width()); 
} 
map_position.css({ 
left:left, 
top:top 
}); 
map_position_bg.data('pageX', event.pageX); 
map_position_bg.data('pageY', event.pageY); 
bottom = top + map_position.height(); 
right = left + map_position.width(); 
var newArea = new Array(left,top,right,bottom).join(','); 
var mapApp = conrainer.parent().next('map'); 
mapApp.find('area[ref='+map_position.attr('ref')+']').attr("coords",newArea); 
$('.link-conrainer li[ref='+map_position.attr('ref')+'] .rect-value').val(newArea); 
return false; 
}).mouseup(function(event){ 
map_position_bg.data('mousedown', false); 
map_position_bg.css('cursor','default'); 
return false; 
}); 
}); 
$('.position-conrainer .map-position .resize').each(function(){ 
var map_position_resize = $(this); 
var conrainer = $(this).parent().parent(); 
map_position_resize.unbind('mousedown').mousedown(function(event){ 
map_position_resize.data('mousedown', true); 
map_position_resize.data('pageX', event.pageX); 
map_position_resize.data('pageY', event.pageY); 
return false; 
}).unbind('mouseup').mouseup(function(event){ 
map_position_resize.data('mousedown', false); 
return false; 
}); 
//点击取消拖动 
conrainer.unbind('click').click(function(event){ 
map_position_resize.data('mousedown', false); 
return false; 
}); 
conrainer.mousemove(function(event){ 
if (!map_position_resize.data('mousedown')) return false; 
var dx = event.pageX - map_position_resize.data('pageX'); 
var dy = event.pageY - map_position_resize.data('pageY'); 
if ((dx == 0) && (dy == 0)){ 
return false; 
} 
var map_position = map_position_resize.parent(); 
var p = map_position.position(); 
var left = p.left; 
var top = p.top; 
var height = map_position.height()+dy; 
if((top+height) > conrainer.height()){ 
height = height-((top+height)-conrainer.height()); 
} 
if (height <20) height = 20; 
var width = map_position.width()+dx; 
if((left+width) > conrainer.width()){ 
width = width-((left+width)-conrainer.width()); 
} 
if(width <50) width = 50; 
map_position.css({ 
width:width, 
height:height 
}); 
map_position_resize.data('pageX', event.pageX); 
map_position_resize.data('pageY', event.pageY); 
bottom = top + map_position.height(); 
right = left + map_position.width(); 
var newArea = new Array(left,top,right,bottom).join(','); 
var mapApp = conrainer.parent().next('map'); 
mapApp.find('area[ref='+map_position.attr('ref')+']').attr("coords",newArea); 
$('.link-conrainer li[ref='+map_position.attr('ref')+'] .rect-value').val(newArea); 
return false; 
}).mouseup(function(event){ 
map_position_resize.data('mousedown', false); 
return false; 
}); 
}); 
$('.position-conrainer .map-position .delete').unbind('click').click(function(){ 
var ref = $(this).parent().attr('ref'); 
var _link_conrainer = $(this).parent().parent().parent().find('.link-conrainer ul'); 
var _coordsMap = $(this).parent().parent().parent().next('map'); 
var _position_conrainer = $(this).parent().parent().parent().find('.position-conrainer'); 
_link_conrainer.find('.map-link[ref='+ref+']').remove(); 
_position_conrainer.find('.map-position[ref='+ref+']').remove(); 
_coordsMap.find('area[ref='+ref+']').remove(); 
var index = 1; 
_link_conrainer.find('.map-link').each(function(){ 
$(this).attr('ref',index).find('.link-number-text').html('热点'+index); 
index ++; 
}); 
index = 1; 
_position_conrainer.find('.map-position').each(function(){ 
$(this).attr('ref',index).find('.link-number-text').html('热点'+index); 
index ++; 
}); 
index = 1; 
_coordsMap.find('area').each(function(){ 
$(this).attr('ref',index); 
index ++; 
}); 
}); 
} 
bind_map_event(); 
function define_css(){ 
//样式定义 
$container.find('.map-position .resize').css({ 
display:'block', 
position:'absolute', 
right:0, 
bottom:0, 
width:5, 
height:5, 
cursor:'nw-resize', 
background:'#000' 
}); 
} 
define_css(); 
}; 
})(jQuery);

页面引用:$('.imgMap').imageMaps();
Javascript 相关文章推荐
jquery 最简单的属性菜单
Oct 08 Javascript
jquery中的常用事件bind、hover、toggle等示例介绍
Jul 21 Javascript
js实现用户离开页面前提示是否离开此页面的方法(包括浏览器按钮事件)
Jul 18 Javascript
Node.js环境下编写爬虫爬取维基百科内容的实例分享
Jun 12 Javascript
JS实现的手机端精简幻灯片效果
Sep 05 Javascript
Bootstrap CSS组件之导航条(navbar)
Dec 17 Javascript
AngularJS  ng-repeat遍历输出的用法
Jun 19 Javascript
使用JS实现气泡跟随鼠标移动的动画效果
Sep 16 Javascript
实现两个文本框同时输入的实例
Sep 25 Javascript
jQuery创建及操作xml格式数据示例
May 26 jQuery
JS实现无限轮播无倒退效果
Sep 21 Javascript
vue mvvm数据响应实现
Nov 11 Javascript
Js四则运算函数代码
Jul 21 #Javascript
Javascript对象中关于setTimeout和setInterval的this介绍
Jul 21 #Javascript
javascript算法题 求任意一个1-9位不重复的N位数在该组合中的大小排列序号
Jul 21 #Javascript
Javascript中找到子元素在父元素内相对位置的代码
Jul 21 #Javascript
分享XmlHttpRequest调用Webservice的一点心得
Jul 20 #Javascript
基于jquery的可多选的下拉列表框
Jul 20 #Javascript
基于jquery的DIV随滚动条滚动而滚动的代码
Jul 20 #Javascript
You might like
PHP中使用TCPDF生成PDF文档实例
2014/07/01 PHP
PHP生成条形图的方法
2014/12/10 PHP
PHP文件缓存类实现代码
2015/10/26 PHP
PHP工程师VIM配置分享
2015/12/15 PHP
PHP+MySQL实现无极限分类栏目的方法
2015/12/23 PHP
详解PHP中的序列化、反序列化操作
2017/03/21 PHP
thinkphp5.1 文件引入路径问题及注意事项
2018/06/13 PHP
PHP结合jquery ajax实现上传多张图片,并限制图片大小操作示例
2019/03/01 PHP
不错的新闻标题颜色效果
2006/12/10 Javascript
extJs 文本框后面加上说明文字+下拉列表选中值后触发事件
2009/11/27 Javascript
JS 面向对象之神奇的prototype
2011/02/26 Javascript
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
2013/05/13 Javascript
JavaScript实现网页截图功能
2014/10/16 Javascript
jQuery+ajax简单实现文件上传的方法
2016/06/03 Javascript
vue.js指令和组件详细介绍及实例
2017/04/06 Javascript
学习使用Bootstrap页面排版样式
2017/05/11 Javascript
JS实现简易的图片拖拽排序实例代码
2017/06/09 Javascript
微信小程序获取微信运动步数的实例代码
2017/07/20 Javascript
富文本编辑器vue2-editor实现全屏功能
2019/05/26 Javascript
layui switch 开关监听 弹出确定状态转换的例子
2019/09/21 Javascript
[04:49]2014DOTA2国际邀请赛 Newbee顺利挺进总决赛 ImbaTV独家专访
2014/07/19 DOTA
在Python的Django框架中编写错误提示页面
2015/07/22 Python
python+ffmpeg视频并发直播压力测试
2018/03/06 Python
python3+PyQt5 实现Rich文本的行编辑方法
2019/06/17 Python
python使用配置文件过程详解
2019/12/28 Python
Python约瑟夫生者死者小游戏实例讲解
2021/01/04 Python
基于html5 canvas实现漫天飞雪效果实例
2014/09/10 HTML / CSS
Godiva巧克力英国官网:比利时歌帝梵巧克力
2018/08/28 全球购物
美国正宗设计师眼镜在线零售商:EYEZZ
2019/03/23 全球购物
Linux机考试题
2015/10/16 面试题
交通事故协议书范文
2014/04/16 职场文书
企业法人代表任命书
2014/06/06 职场文书
演讲稿开场白台词
2014/08/25 职场文书
2014年超市工作总结
2014/11/19 职场文书
2015年党员自评材料
2014/12/17 职场文书
2015年医院后勤工作总结
2015/05/20 职场文书