(function ($){ var addCSSRule = (function(style){ var sheet = document.head.appendChild(style).sheet; return function(selector, css){ var propText = Object.keys(css).map(function(p){ return p+":"+css[p] }).join(";"); sheet.insertRule(selector + "{" + propText + "}", sheet.cssRules.length); return sheet; } })(document.createElement("style")); var magnifier = function(magnifierNode) { var self = this; self.rootNode = magnifierNode; self.magnifierImage = new Image(); self.magnifierContent = null; self.magnifierImage.src = self.rootNode.attr('magnifierImage'); self.magnifierRoot = null; self.currentAngleSheet = null; self.init = function(){ self.rootNode.bind('mouseenter', self.mouseover); } self.mouseover = function(event) { if ( self.magnifierRoot == null ) { self.magnifierRoot = $('').addClass('magnifierWrapper').attr('pointer-events', 'none'); self.magnifierContent = $('').addClass('magnifierContent').css('backgroundImage', 'url(' + self.rootNode.attr('magnifierImage') + ')'); self.magnifierRoot.append(self.magnifierContent); // register other handlers self.rootNode.bind('mousemove', self.mousemove); self.rootNode.bind('mouseout', self.mouseout); // macht im Opera Problem ... $("body").append(self.magnifierRoot); } self.mousemove(event); }; self.mousemove = function(event) { self.setPosition(event.pageX,event.pageY, event.offsetX, event.offsetY); }; self.mouseout = function(event) { var rootOffset = self.rootNode.offset(); // Check Position over Element before removing! if ( rootOffset.left > event.offsetX || (rootOffset.left + self.rootNode.width()) < event.offsetX || rootOffset.top < event.offsetY || (rootOffset.top + rootOffset.height) > event.offsetY ) { // Clean up self.rootNode.unbind('mousemove', self.mousemove); self.rootNode.unbind('mouseout', self.mouseout); if ( self.magnifierRoot ) { self.magnifierRoot.remove(); self.magnifierRoot = null; } } }; self.setPosition = function(x, y, contentX, contentY) { if ( !self.magnifierImage || !contentX || !contentY ) { return; } // Background position var posX = -(contentX / self.rootNode.width() * self.magnifierImage.width - self.magnifierContent.width() / 2); var posY = -(contentY / self.rootNode.height() * self.magnifierImage.height - self.magnifierContent.height() / 2); // Radial position var position = (1 / self.rootNode.width() * (self.rootNode.width() - contentX)); var arc = -(110 * position + 35) * Math.PI / 180; var left0 = 202; var top0 = 0; var left = left0 * Math.cos(arc) - top0 * Math.sin(arc) - 165; var top = left0 * Math.sin(arc) + top0 * Math.cos(arc) + 113; var angle = 'rotate(' + (position * -110) + 'deg)'; if ( self.currentAngleSheet != null ) { $(self.currentAngleSheet).remove(); } self.currentAngleSheet = addCSSRule("div.magnifierWrapper:after,svg.magnifierWrapper:after", { '-webkit-transform': angle, '-moz-transform': angle, '-o-transform': angle, '-ms-transform': angle }); self.magnifierContent.css({ 'backgroundPositionX': posX, 'backgroundPositionY': posY, 'margin-left' : left, 'margin-top': top }); if ( !self.magnifierRoot || !x || !y ) { return; } self.magnifierRoot.offset({ left:x - 18, top: y - self.magnifierRoot.height() }); }; }; $(function(){ $('img.magnifierImage').each(function(index, item){ (new magnifier($(item))).init(); }); }); })(jQuery);