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