areaOffset jQuery plugin

A Weblaboron felmerült probléma alapján írtam egy jQuery kiegészítőt. Lekérdezi az <area> elem a <map> elemben levő eltolódását.

(function ($) {  
  /**
   * Lekérdezi az <area> elem a <map> elemben levő eltolódását.
   *
   * @param center {Boolean}
   *   A közép koordinátáját adja vissza.
   * @returns
   *   Az eltolódás egy objektumban, mely a követkzőképp néz ki: {top: 0, left: 0}.
   */  
  $.fn.areaOffset = function(center) {  
    var areas = this.filter('area'),  
        area = areas.length && areas[0],  
        coords = (area && $.map(area.coords.split(','), $.trim)) || [],  
        cl = coords.length,  
        offset = {    // Alapértelmezett eltolódás  
          left: 0,  
          top:  0  
        },  
        shape = area.shape.toLowerCase(),  
        xs, ys, xm, ym,  
        map, obj,  
        setFilters = $.expr.setFilters;  

    if (cl > 2) {  
      switch (shape) {  
        case 'circle':  
          // Alapértelmezetten a középpontját kapjuk,  
          // számolni kell, ha a bal-felső sarok szükséges.  
          offset = {  
            left : +coords[0] - (center ? 0 : coords[2]),  
            top  : +coords[1] - (center ? 0 : coords[2])  
          };  
          break;  
        case 'rect':  
        case 'poly':  
          if (cl % 2 == 0) {  
            xs = $.grep(coords, setFilters.even); // Páros értékek X koordináták  
            ys = $.grep(coords, setFilters.odd);  // Páratlan értékek Y koordináták  
            xm = Math.min.apply(Math, xs);        // Minimuma az X koordinátáknak  
            ym = Math.min.apply(Math, ys);        // Minimuma az Y koordinátáknak  

            // Kiszámoljuk a közepét, amennyiben szükséges.  
            offset = {  
              left : xm + (center ? (Math.max.apply(Math, xs) - xm)  / 2 : 0),  
              top  : ym + (center ? (Math.max.apply(Math, ys) - ym)  / 2 : 0)  
            };  
          }  
          break;  
        default:  
          if (center) {  
            map = areas.eq(0).closest('map');  
            obj = map.length && $('[usemap=#' + map[0].name + ']');  
            if (obj.length) {  
              offset = {  
                left: obj.height() / 2,  
                top:  obj.width() / 2  
              };  
            }  
          }  
      }  
    }  
    return offset;  
  };  
}(jQuery));

Csináltam egy példát is a használatra.

GitHub

A kiegészítő felköltözött a GitHub-ra, érdemes ott nézni, hogyan fejlődik.

comments powered by Disqus