javascripthtmljqueryimagemagnify

Image magnifier coming in all images in html


I have a website where I have implemented an image magnifier. I used the following Javascript to do so:

<img class="magnifiedImg" src="" />
.magnify{
  border-radius: 50%;
  border: 2px solid black;
  position: absolute;
  z-index: 20;
  background-repeat: no-repeat;
  background-color: white;
  box-shadow: inset 0 0 20px rgba(0,0,0,.5);
  display: none;
  cursor: none;
}

/*Size is  set in pixels... supports being written as: '250px' */
var magnifierSize = 250;

/*How many times magnification of image on page.*/
var magnification = 4;

function magnifier() {

  this.magnifyImg = function(ptr, magnification, magnifierSize) {
    var $pointer;
    if (typeof ptr == "string") {
      $pointer = $(ptr);
    } else if (typeof ptr == "object") {
      $pointer = ptr;
    }
    
    if(!($pointer.is('img'))){
      alert('Object must be image.');
      return false;
    }

    magnification = +(magnification);

    $pointer.hover(function() {
      $(this).css('cursor', 'none');
      $('.magnify').show();
      //Setting some variables for later use
      var width = $(this).width();
      var height = $(this).height();
      var src = $(this).attr('src');
      var imagePos = $(this).offset();
      var image = $(this);

      if (magnifierSize == undefined) {
        magnifierSize = '150px';
      }

      $('.magnify').css({
        'background-size': width * magnification + 'px ' + height * magnification + "px",
        'background-image': 'url("' + src + '")',
        'width': magnifierSize,
        'height': magnifierSize
      });

      //Setting a few more...
      var magnifyOffset = +($('.magnify').width() / 2);
      var rightSide = +(imagePos.left + $(this).width());
      var bottomSide = +(imagePos.top + $(this).height());

      $(document).mousemove(function(e) {
        if (e.pageX < +(imagePos.left - magnifyOffset / 6) || e.pageX > +(rightSide + magnifyOffset / 6) || e.pageY < +(imagePos.top - magnifyOffset / 6) || e.pageY > +(bottomSide + magnifyOffset / 6)) {
          $('.magnify').hide();
          $(document).unbind('mousemove');
        }
        var backgroundPos = "" - ((e.pageX - imagePos.left) * magnification - magnifyOffset) + "px " + -((e.pageY - imagePos.top) * magnification - magnifyOffset) + "px";
        $('.magnify').css({
          'left': e.pageX - magnifyOffset,
          'top': e.pageY - magnifyOffset,
          'background-position': backgroundPos
        });
      });
    }, function() {

    });
  };

  this.init = function() {
    $('body').prepend('<div class="magnify"></div>');
  }

  return this.init();
}

var magnify = new magnifier();
magnify.magnifyImg('img', magnification, magnifierSize);

The problem is the magnifier is coming on all images in my website instead it should come only where the class is mentioned, here is my live url text can anyone please tell me what is wrong in here, thanks in advance


Solution

  • Change the pointer img to .magnifiedImg and add magnifiedImg class to only the images you want to magnify

    magnify.magnifyImg('.magnifiedImg', magnification, magnifierSize);
    

    /*Size is  set in pixels... supports being written as: '250px' */
    var magnifierSize = 250;
    
    /*How many times magnification of image on page.*/
    var magnification = 4;
    
    function magnifier() {
    
      this.magnifyImg = function(ptr, magnification, magnifierSize) {
        var $pointer;
        if (typeof ptr == "string") {
          $pointer = $(ptr);
        } else if (typeof ptr == "object") {
          $pointer = ptr;
        }
        
        if(!($pointer.is('img'))){
          alert('Object must be image.');
          return false;
        }
    
        magnification = +(magnification);
    
        $pointer.hover(function() {
          $(this).css('cursor', 'none');
          $('.magnify').show();
          //Setting some variables for later use
          var width = $(this).width();
          var height = $(this).height();
          var src = $(this).attr('src');
          var imagePos = $(this).offset();
          var image = $(this);
    
          if (magnifierSize == undefined) {
            magnifierSize = '150px';
          }
    
          $('.magnify').css({
            'background-size': width * magnification + 'px ' + height * magnification + "px",
            'background-image': 'url("' + src + '")',
            'width': magnifierSize,
            'height': magnifierSize
          });
    
          //Setting a few more...
          var magnifyOffset = +($('.magnify').width() / 2);
          var rightSide = +(imagePos.left + $(this).width());
          var bottomSide = +(imagePos.top + $(this).height());
    
          $(document).mousemove(function(e) {
            if (e.pageX < +(imagePos.left - magnifyOffset / 6) || e.pageX > +(rightSide + magnifyOffset / 6) || e.pageY < +(imagePos.top - magnifyOffset / 6) || e.pageY > +(bottomSide + magnifyOffset / 6)) {
              $('.magnify').hide();
              $(document).unbind('mousemove');
            }
            var backgroundPos = "" - ((e.pageX - imagePos.left) * magnification - magnifyOffset) + "px " + -((e.pageY - imagePos.top) * magnification - magnifyOffset) + "px";
            $('.magnify').css({
              'left': e.pageX - magnifyOffset,
              'top': e.pageY - magnifyOffset,
              'background-position': backgroundPos
            });
          });
        }, function() {
    
        });
      };
    
      this.init = function() {
        $('body').prepend('<div class="magnify"></div>');
      }
    
      return this.init();
    }
    
    var magnify = new magnifier();
    magnify.magnifyImg('.magnifiedImg', magnification, magnifierSize);
    .magnify{
      border-radius: 50%;
      border: 2px solid black;
      position: absolute;
      z-index: 20;
      background-repeat: no-repeat;
      background-color: white;
      box-shadow: inset 0 0 20px rgba(0,0,0,.5);
      display: none;
      cursor: none;
    }
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <img class="magnifiedImg" src="https://demo.thebrandchimp.com/jewelit/admin/uploads/products/SLR-01_(1).jpg" />
    <img src="https://demo.thebrandchimp.com/jewelit/admin/uploads/products/SLR-01_(1).jpg" />