基于jquery自定义图片热区效果 |
本文标签:自定义,图片热区 现在整理下发出来,希望大家共同学习吧 先看效果图: ![]() 用了jquery.image-maps.js这个插件 下载地址 http://www.jb51.net/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(); |