1

How to make Zooming effect like these, when hovering the image Sample Image

2 Answers2

4

$(document).ready(function(){

 var native_width = 0;
 var native_height = 0;

 //Now the mousemove function
 $(".magnify").mousemove(function(e){
  //When the user hovers on the image, the script will first calculate
  //the native dimensions if they don't exist. Only after the native dimensions
  //are available, the script will show the zoomed version.
  if(!native_width && !native_height)
  {
   //This will create a new image object with the same image as that in .small
   //We cannot directly get the dimensions from .small because of the 
   //width specified to 200px in the html. To get the actual dimensions we have
   //created this image object.
   var image_object = new Image();
   image_object.src = $(".small").attr("src");
   
   //This code is wrapped in the .load function which is important.
   //width and height of the object would return 0 if accessed before 
   //the image gets loaded.
   native_width = image_object.width;
   native_height = image_object.height;
  }
  else
  {
   //x/y coordinates of the mouse
   //This is the position of .magnify with respect to the document.
   var magnify_offset = $(this).offset();
   //We will deduct the positions of .magnify from the mouse positions with
   //respect to the document to get the mouse positions with respect to the 
   //container(.magnify)
   var mx = e.pageX - magnify_offset.left;
   var my = e.pageY - magnify_offset.top;
   
   //Finally the code to fade out the glass if the mouse is outside the container
   if(mx < $(this).width() && my < $(this).height() && mx > 0 && my > 0)
   {
    $(".large").fadeIn(100);
   }
   else
   {
    $(".large").fadeOut(100);
   }
   if($(".large").is(":visible"))
   {
    //The background position of .large will be changed according to the position
    //of the mouse over the .small image. So we will get the ratio of the pixel
    //under the mouse pointer with respect to the image and use that to position the 
    //large image inside the magnifying glass
    var rx = Math.round(mx/$(".small").width()*native_width - $(".large").width()/2)*-1;
    var ry = Math.round(my/$(".small").height()*native_height - $(".large").height()/2)*-1;
    var bgp = rx + "px " + ry + "px";
    
    //Time to move the magnifying glass with the mouse
    var px = mx - $(".large").width()/2;
    var py = my - $(".large").height()/2;
    //Now the glass moves with the mouse
    //The logic is to deduct half of the glass's width and height from the 
    //mouse coordinates to place it with its center at the mouse coordinates
    
    //If you hover on the image now, you should see the magnifying glass in action
    $(".large").css({left: px, top: py, backgroundPosition: bgp});
   }
  }
 })
})
/*Some CSS*/
* {margin: 0; padding: 0;}
.magnify {width: 200px; margin: 50px auto; position: relative;}

/*Lets create the magnifying glass*/
.large {
 width: 175px; height: 175px;
 position: absolute;
 border-radius: 100%;
 
 /*Multiple box shadows to achieve the glass effect*/
 box-shadow: 0 0 0 7px rgba(255, 255, 255, 0.85), 
 0 0 7px 7px rgba(0, 0, 0, 0.25), 
 inset 0 0 40px 2px rgba(0, 0, 0, 0.25);
 
 /*Lets load up the large image first*/
 background: url('http://thecodeplayer.com/uploads/media/iphone.jpg') no-repeat;
 
 /*hide the glass by default*/
 display: none;
}

/*To solve overlap bug at the edges during magnification*/
.small { display: block; }
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- Lets make a simple image magnifier -->
<div class="magnify">
 
 <!-- This is the magnifying glass which will contain the original/large version -->
 <div class="large"></div>
 
 <!-- This is the small image -->
 <img class="small" src="http://thecodeplayer.com/uploads/media/iphone.jpg" width="200"/>
 
</div>

<!-- Lets load up prefixfree to handle CSS3 vendor prefixes -->
<script src="http://thecodeplayer.com/uploads/js/prefixfree.js" type="text/javascript"></script>
<!-- You can download it from http://leaverou.github.com/prefixfree/ -->

<!-- Time for jquery action -->
<script src="http://thecodeplayer.com/uploads/js/jquery-1.7.1.min.js" type="text/javascript"></script>
Nimish
  • 1,006
  • 1
  • 7
  • 19
  • I'm wondering how you wrote this entire answer in just 4min!? – caramba Jun 18 '17 at 10:54
  • 1
    @caramba see my comment on question. I have also used this for my project so shared the link. Also I made a snippet for prasad. – Nimish Jun 18 '17 at 10:56
  • +1. PSA if using js instead use https://stackoverflow.com/questions/3234256/find-mouse-position-relative-to-element for the first part. ie use client positions rather than page positions. – okzoomer Apr 05 '23 at 23:58
2

Try this one

(function ($) {
    $(document).ready(function() {
        $('.xzoom, .xzoom-gallery').xzoom({zoomWidth: 400, title: true, tint: '#333', Xoffset: 15});
        $('.xzoom2, .xzoom-gallery2').xzoom({position: '#xzoom2-id', tint: '#ffa200'});
        $('.xzoom3, .xzoom-gallery3').xzoom({position: 'lens', lensShape: 'circle', sourceClass: 'xzoom-hidden'});
        $('.xzoom4, .xzoom-gallery4').xzoom({tint: '#006699', Xoffset: 15});
        $('.xzoom5, .xzoom-gallery5').xzoom({tint: '#006699', Xoffset: 15});

        //Integration with hammer.js
        var isTouchSupported = 'ontouchstart' in window;

        if (isTouchSupported) {
            //If touch device
            $('.xzoom, .xzoom2, .xzoom3, .xzoom4, .xzoom5').each(function(){
                var xzoom = $(this).data('xzoom');
                xzoom.eventunbind();
            });
            
            $('.xzoom, .xzoom2, .xzoom3').each(function() {
                var xzoom = $(this).data('xzoom');
                $(this).hammer().on("tap", function(event) {
                    event.pageX = event.gesture.center.pageX;
                    event.pageY = event.gesture.center.pageY;
                    var s = 1, ls;
    
                    xzoom.eventmove = function(element) {
                        element.hammer().on('drag', function(event) {
                            event.pageX = event.gesture.center.pageX;
                            event.pageY = event.gesture.center.pageY;
                            xzoom.movezoom(event);
                            event.gesture.preventDefault();
                        });
                    }
    
                    xzoom.eventleave = function(element) {
                        element.hammer().on('tap', function(event) {
                            xzoom.closezoom();
                        });
                    }
                    xzoom.openzoom(event);
                });
            });

        $('.xzoom4').each(function() {
            var xzoom = $(this).data('xzoom');
            $(this).hammer().on("tap", function(event) {
                event.pageX = event.gesture.center.pageX;
                event.pageY = event.gesture.center.pageY;
                var s = 1, ls;

                xzoom.eventmove = function(element) {
                    element.hammer().on('drag', function(event) {
                        event.pageX = event.gesture.center.pageX;
                        event.pageY = event.gesture.center.pageY;
                        xzoom.movezoom(event);
                        event.gesture.preventDefault();
                    });
                }

                var counter = 0;
                xzoom.eventclick = function(element) {
                    element.hammer().on('tap', function() {
                        counter++;
                        if (counter == 1) setTimeout(openfancy,300);
                        event.gesture.preventDefault();
                    });
                }

                function openfancy() {
                    if (counter == 2) {
                        xzoom.closezoom();
                        $.fancybox.open(xzoom.gallery().cgallery);
                    } else {
                        xzoom.closezoom();
                    }
                    counter = 0;
                }
            xzoom.openzoom(event);
            });
        });
        
        $('.xzoom5').each(function() {
            var xzoom = $(this).data('xzoom');
            $(this).hammer().on("tap", function(event) {
                event.pageX = event.gesture.center.pageX;
                event.pageY = event.gesture.center.pageY;
                var s = 1, ls;

                xzoom.eventmove = function(element) {
                    element.hammer().on('drag', function(event) {
                        event.pageX = event.gesture.center.pageX;
                        event.pageY = event.gesture.center.pageY;
                        xzoom.movezoom(event);
                        event.gesture.preventDefault();
                    });
                }

                var counter = 0;
                xzoom.eventclick = function(element) {
                    element.hammer().on('tap', function() {
                        counter++;
                        if (counter == 1) setTimeout(openmagnific,300);
                        event.gesture.preventDefault();
                    });
                }

                function openmagnific() {
                    if (counter == 2) {
                        xzoom.closezoom();
                        var gallery = xzoom.gallery().cgallery;
                        var i, images = new Array();
                        for (i in gallery) {
                            images[i] = {src: gallery[i]};
                        }
                        $.magnificPopup.open({items: images, type:'image', gallery: {enabled: true}});
                    } else {
                        xzoom.closezoom();
                    }
                    counter = 0;
                }
                xzoom.openzoom(event);
            });
        });

        } else {
            //If not touch device

            //Integration with fancybox plugin
            $('#xzoom-fancy').bind('click', function(event) {
                var xzoom = $(this).data('xzoom');
                xzoom.closezoom();
                $.fancybox.open(xzoom.gallery().cgallery, {padding: 0, helpers: {overlay: {locked: false}}});
                event.preventDefault();
            });
           
            //Integration with magnific popup plugin
            $('#xzoom-magnific').bind('click', function(event) {
                var xzoom = $(this).data('xzoom');
                xzoom.closezoom();
                var gallery = xzoom.gallery().cgallery;
                var i, images = new Array();
                for (i in gallery) {
                    images[i] = {src: gallery[i]};
                }
                $.magnificPopup.open({items: images, type:'image', gallery: {enabled: true}});
                event.preventDefault();
            });
        }
    });
})(jQuery);
<link href="https://unpkg.com/xzoom@1.0.7/dist/xzoom.css" rel="stylesheet"/>
<script src="https://code.jquery.com/jquery-2.1.1.js"></script>
<script src="https://unpkg.com/xzoom@1.0.7/dist/xzoom.min.js"></script>
<script src="https://hammerjs.github.io/dist/hammer.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/foundation/6.3.1/js/foundation.min.js"></script>
<body>
  
  <div class="container">
    
    <!-- default start -->
    <section id="default" class="padding-top0">
    <div class="row">
      <div class="large-12 column"><h3>Product Zooming</h3></div>
        <hr>
      <div class="large-5 column">
        <div class="xzoom-container">
          <img class="xzoom" id="xzoom-default" src="http://www.jqueryscript.net/demo/Feature-rich-Product-Gallery-With-Image-Zoom-xZoom/images/gallery/preview/01_b_car.jpg" xoriginal="http://www.jqueryscript.net/demo/Feature-rich-Product-Gallery-With-Image-Zoom-xZoom/images/gallery/original/01_b_car.jpg" />
          <div class="xzoom-thumbs">
            <a href="http://www.jqueryscript.net/demo/Feature-rich-Product-Gallery-With-Image-Zoom-xZoom/images/gallery/original/01_b_car.jpg"><img class="xzoom-gallery" width="80" src="http://www.jqueryscript.net/demo/Feature-rich-Product-Gallery-With-Image-Zoom-xZoom/images/gallery/thumbs/01_b_car.jpg"  xpreview="http://www.jqueryscript.net/demo/Feature-rich-Product-Gallery-With-Image-Zoom-xZoom/images/gallery/preview/01_b_car.jpg" title="The description goes here"></a>
              
            <a href="http://www.jqueryscript.net/demo/Feature-rich-Product-Gallery-With-Image-Zoom-xZoom/images/gallery/original/02_o_car.jpg"><img class="xzoom-gallery" width="80" src="http://www.jqueryscript.net/demo/Feature-rich-Product-Gallery-With-Image-Zoom-xZoom/images/gallery/preview/02_o_car.jpg" title="The description goes here"></a>
              
            <a href="http://www.jqueryscript.net/demo/Feature-rich-Product-Gallery-With-Image-Zoom-xZoom/images/gallery/original/03_r_car.jpg"><img class="xzoom-gallery" width="80" src="http://www.jqueryscript.net/demo/Feature-rich-Product-Gallery-With-Image-Zoom-xZoom/images/gallery/preview/03_r_car.jpg" title="The description goes here"></a>
              
            <a href="http://www.jqueryscript.net/demo/Feature-rich-Product-Gallery-With-Image-Zoom-xZoom/images/gallery/original/04_g_car.jpg"><img class="xzoom-gallery" width="80" src="http://www.jqueryscript.net/demo/Feature-rich-Product-Gallery-With-Image-Zoom-xZoom/images/gallery/preview/04_g_car.jpg" title="The description goes here"></a>
          </div>
        </div>        
      </div>
      <div class="large-7 column"></div>
    </div>
    </section>
    <!-- default end -->
  </div>
  </body>
Abijith Ajayan
  • 238
  • 3
  • 17