基于jquery自定義圖片熱區(qū)效果
更新時間:2012年07月21日 10:23:55 作者:
前陣子接到個需求,聯(lián)通網(wǎng)上營業(yè)廳經(jīng)常需要專題頁面做宣傳,但是由于專題頁面會有按鈕,以及各個圖片的鏈接,省分的人沒有html基礎(chǔ),沒人維護(hù),量又比較大,需要開發(fā)出一個可自定義圖片熱區(qū)鏈接的后臺,于是就有了這個
現(xiàn)在整理下發(fā)出來,希望大家共同學(xué)習(xí)吧
先看效果圖:

用了jquery.image-maps.js這個插件 下載地址 http://www.dbjr.com.cn/jiaoben/57930.html
原理是:
通過拖動計算出當(dāng)前熱區(qū)可移動模塊的left top right bottom
對應(yīng)area的 coords 屬性集成上面的位置,就可以實現(xiàn)熱區(qū)了。
對應(yīng)的模塊代碼是:
<!--模塊展示 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">添加熱點(diǎn)</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">熱點(diǎn)'+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">熱點(diǎn)'+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">熱點(diǎn)'+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">熱點(diǎn)'+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("請輸入本熱點(diǎn)對應(yīng)的鏈接地址");
bind_map_event();
define_css();
//添加map熱區(qū)
});
//修改鏈接地址
$(".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;
});
//點(diǎn)擊取消拖動
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('熱點(diǎn)'+index);
index ++;
});
index = 1;
_position_conrainer.find('.map-position').each(function(){
$(this).attr('ref',index).find('.link-number-text').html('熱點(diǎn)'+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();
先看效果圖:

用了jquery.image-maps.js這個插件 下載地址 http://www.dbjr.com.cn/jiaoben/57930.html
原理是:
通過拖動計算出當(dāng)前熱區(qū)可移動模塊的left top right bottom
對應(yīng)area的 coords 屬性集成上面的位置,就可以實現(xiàn)熱區(qū)了。
對應(yīng)的模塊代碼是:
復(fù)制代碼 代碼如下:
<!--模塊展示 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代碼:
復(fù)制代碼 代碼如下:
(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">添加熱點(diǎn)</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">熱點(diǎn)'+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">熱點(diǎn)'+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">熱點(diǎn)'+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">熱點(diǎn)'+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("請輸入本熱點(diǎn)對應(yīng)的鏈接地址");
bind_map_event();
define_css();
//添加map熱區(qū)
});
//修改鏈接地址
$(".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;
});
//點(diǎn)擊取消拖動
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('熱點(diǎn)'+index);
index ++;
});
index = 1;
_position_conrainer.find('.map-position').each(function(){
$(this).attr('ref',index).find('.link-number-text').html('熱點(diǎn)'+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();
相關(guān)文章
jQuery使用EasyUi實現(xiàn)三級聯(lián)動下拉框效果
本篇文章主要介紹了jQuery使用EasyUi實現(xiàn)三級聯(lián)動效果,實例使用EasyUi實現(xiàn)三級聯(lián)動技巧,非常具有實用價值,需要的朋友可以參考下。2017-03-03jquery清空textarea等輸入框?qū)崿F(xiàn)代碼
jquery清空textarea等輸入框在工作中很常見,接下來的代碼簡單實用,感興趣的朋友可以參考下哈,希望對你有所幫助2013-04-04jQuery方法簡潔實現(xiàn)隔行換色及toggleClass的使用
隔行換色的展示效果想必大家早已熟悉了吧,今天在幫大家回憶一下本例中主要用到的方法是toggleClass(),感興趣的你可不要錯過了哈,希望可以幫助到你2013-03-03jQuery Autocomplete簡介_動力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了jQuery Autocomplete簡介,jQuery UI Autocomplete是jQuery UI的自動完成組件,是我用過的最強(qiáng)大、最靈活的Autocomplete,它支持本地的Array/JSON數(shù)組、通過ajax請求的Array/JSON數(shù)組、JSONP、以及Function(最靈活)等方式來獲取數(shù)據(jù)2017-07-07