自定义图片热区

前阵子接到个需求,联通网上营业厅经常需要专题页面做宣传,但是由于专题页面会有按钮,以及各个图片的链接,省分的人没有html基础,没人维护,量又比较大,需要开发出一个可自定义图片热区链接的后台,于是就有了这个。现在整理下发出来,希望大家共同学习吧

 

先看效果图:

image

 

用了jquery.image-maps.js这个插件

原理是:

通过拖动计算出当前热区可移动模块的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();

大家可以看尝试一下,DEMO地址:http://www.10010.com/static/homepage/subjectpage/27100000109246.html

posted @ 2012-07-20 10:37  亡魂  阅读(3884)  评论(6编辑  收藏  举报
返回顶部