搜尋
首頁web前端html教學jQuery实现放大镜效果_html/css_WEB-ITnose

1.1.1 摘要

相信大家都见过或使用过放大镜效果,甚至实现过该效果,它一般应用于放大查看商品图片,一些电商网站(例如:凡客,京东商城,阿里巴巴等)都有类似的图片查看效果。

在接下来的博文中,我们将向大家介绍通过jQuery实现放大镜效果。

目录 实现原理 mousemove事件 相对坐标 background-position属性 mousewheel事件 1.1.2 正文 实现原理

首先,我们讲解一下放大镜效果的实现方式:

方法一:准备一张高像素的大图,当鼠标放到原图上,加载显示大图的对应位置。

方法二:对原图片进行放大,也就是调整原图的长和宽。

上面我们介绍了通过两种方式实现放大镜效果,接下来,我们将以上的两种方式应用到我们的jQuery插件中。

首先,我们需要一个img元素显示原图对象,还需要一个容器作为显示框;显示框里面存放大图对象。当鼠标移动到原图上时,通过对大图进行绝对定位来显示对应的部位,实现类似放大镜的效果。

接下来,让我们定义Index.html页面,具体实现如下:

<!doctype html><html lang="en-US"><head>  <meta http-equiv="Content-Type" content="text/html;charset=utf-8">  <title>jQuery Image Zoom Demo</title>  <meta name="author" content="Jackson Huang"></head><body><div class="magnify"><div class="large"></div><img  class="small lazy"  src="/static/imghwm/default1.png"  data-src="./img/1.jpg"     style="max-width:90%" / alt="jQuery实现放大镜效果_html/css_WEB-ITnose" ></div></body></html>

上面,我们定义了small对象用于显示原图,而large对象作为一个显示框用来显示大图的对应位置。

mousemove事件

接下来,我们通过jQuery插件形式来实现放大镜效果,当鼠标移动到small对象上方时,就会在large对象中显示大图的对应位置,这就涉及到mousemove事件了,所以,我们需要实现mousemove事件的监听方法(如何定义jQuery插件可以参考《自定义jQuery插件Step by Step》)。

现在,让我们实现jquery.imagezoom.js插件吧!

;(function ($) {    $.fn.imageZoom = function (options) {    // The native width and height of the image.    var native_width = 0,        native_height = 0,        current_width = 0,        current_height = 0,        $small = $(".small"),        $large = $(".large");    $(".magnify").mousemove(function (e) {        /* Act on the event */        if (!native_width && !native_height) {            var image_object = new Image();            image_object.src = $small.attr('src');            // Gets the image native height and width.            native_height = image_object.height;            native_width = image_object.width;            // Gets the image current height and width.            current_height = $small.height();            current_width = $small.width();        } else {            // Gets .maginfy offset coordinates.            var magnify_offset = $(this).offset(),                // Gets coordinates within .maginfy.                mx = e.pageX - magnify_offset.left,                my = e.pageY - magnify_offset.top;            // Checks the mouse within .maginfy or not.            if (mx < $(this).width() && my < $(this).height() && mx > 0 && my > 0) {                $large.fadeIn(100);            } else {                $large.fadeOut(100);            } if ($large.is(":visible")) {                /* Gets the large image coordinate by ratio                    small.x / small.width = large.x / large.width                   small.y / small.height = large.y / large.height                   then we need to keep pointer in the centre,                    so deduct the half of .large width and height.                */                var rx = Math.round(mx / $small.width() * native_width - $large.width() / 2) * -1,                    ry = Math.round(my / $small.height() * native_height - $large.height() / 2) * -1,                    bgp = rx + "px " + ry + "px",                    px = mx - $large.width() / 2,                    py = my - $large.height() / 2;                $large.css({                    left: px,                    top: py,                    backgroundPosition: bgp                });            }        }    });});

上面,我实现了mousemove事件的监听方法,当鼠标移动到magnify对象中,我们需要获取当前鼠标的相对坐标位置,下面我们通过图片讲解如何获取鼠标的相对坐标位置。

相对坐标

  

图1鼠标相对坐标位置

当鼠标移动到magnify对象中,我们需要获取鼠标在magnify中的相对坐标位置,这里我们把相对坐标定义为(mx,my),通过上图我们知道相对坐标等于(pageX - offsetLeft, pageY - offsetTop)。

现在,我们已经获取鼠标在magnify对象中的坐标值,接下来,需要获取对应大图的相应坐标,这里我们把大图的对应坐标定义为(rx,ry),我们可以通过比例关系获取(rx,ry)的值。

mx / small.width (原图的宽)= rx / native_width(大图的宽)

my / small.height (原图的长)= ry / native_height(大图的长)

通过上面的比例关系,我们知道大图的坐标(rx,ry)等于(mx/small.width*native_width, my/small.height*native_height)。

通过上述的公式,我们可以获取大图对应坐标位置,当鼠标移动到magnify对象中就显示对应位置的大图部位,接下来我们需要实现大图的加载实现了。

background-position属性

在实现大图加载显示之前,首先介绍CSS中背景定位background-position的知识。

图2 CSS background-position

上面,有一个100x100像素的图片它由四种颜色组成,而且每种颜色占50 x50像素,接下来,我们将通过修改该图片CSS的background-position属性值来显示该图片的不同位置。

我们看到在大正方形下有两行小正方形,它们显示的颜色位置都不相同,这里我们通过修改每个div元素CSS的background-position属性值实现的。

例如:第一行的蓝色方形,我们设置CSS的background-position属性为:0px -50px;这相当于原图往上移动50px,第一行的其他方形也通过左右和上下移动实现的。

但第二行的方形就显得更加奇怪了,因为它们都由四种颜色组成,而且颜色的位置都不一样,这究竟是怎样实现的呢?

例如:第二行的第一个方形,我们设置CSS的background-position属性为:25px 25px;这相当于原图向下和向右移动了25px,由于image wrap的作用它会填充剩余位置的颜色。

现在,我们已经了解到了CSS的background-position属性的作用,所以我们通过修改large对象的background-position属性来显示对应的图像部分,具体实现如下:

$large.css({    left: px,    top: py,    backgroundPosition: bgp});

上面,我们通过加载大图的方式来实现放大镜效果,接下来,我们将介绍通过调整原图的长和宽来实现放大镜效果。

mousewheel事件

前面,我们通过mousemove事件来放大图片,这里我们将通过鼠标的滚轮事件实现图片放大效果。

由于,不同的浏览器有不同的滚轮事件。主要是有三种:onmousewheel(IE 6/7/8)、mousewheel(IE9,Chrome,Safari和Opera)和DOMMouseScroll(只有Firefox支持),关于这三个事件这里不做详细的介绍了。

由于不同浏览器之间存在着差异,为了实现浏览器之间的兼容,所以,我们需要监听以上三种滚轮事件(onmousewheel,mousewheel和DOMMouseScroll),具体实现如下:

$(".magnify").bind('DOMMouseScroll mousewheel onmousewheel', function(e) {});

上面,我们实现了兼容不同浏览器的滚轮事件监听方法,接下来,判断滚轮向上或向下也要考虑不同浏览器的兼容性,主流的览器(IE、Opera、Safari、Firefox、Chrome)中Firefox 使用detail,其余四类使用wheelDelta;两者只在取值上不一致,代表含义一致,detail与wheelDelta只各取两个值,detail只取±3,wheelDelta只取±120,其中正数表示为向上,负数表示向下。

由于detail和wheelDelta都有两个值表示向上或向下滚动,所以不同浏览器间可以通过以下方式实现兼容,具体实现如下:

$(".magnify").bind('DOMMouseScroll mousewheel onmousewheel', function(e) {    // cross-browser wheel delta    var e = window.event || e; // old IE support.    var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));});

上面,我们已经处理了不同浏览器滚轮监听方法,当用户滚动滚轮时需要动态地修改原图的尺寸,这里我们定义缩放比scaling为0.3,也就是说每当用户滚动一下滚轮原图就按0.3的比例进行缩放,具体实现如下:

// Gets the image scaling height and width.native_height += (native_height * scaling * delta);native_width += (native_width * scaling * delta);// Update backgroud image size.$large.css('background-size', native_width + "px " + native_height + "px");

现在,我们已经实现了通过滚轮对图片进行缩放查看的效果,完整的实现如下:

/************************************ Author: Jackson Huang* Blog: http://www.cnblogs.com/rush* Date: 8/23/2013* Reference:* http://www.sitepoint.com/html5-javascript-mouse-wheel/* http://thecodeplayer.com/walkthrough/magnifying-glass-for-images-using-jquery-and-css3***********************************/;(function($) {    $.fn.imageZoom = function(options) {        // The native width and height of the image.        var defaults = {            scaling: 0.3        };        // Combines object defaults and options.        options = $.extend(defaults, options),            native_width = 0,            native_height = 0,            current_width = 0,            current_height = 0,            $small = $(".small"),            $large = $(".large");        $(".magnify").mousemove(function(e) {            /* Act on the event */            if (!native_width && !native_height) {                var image_object = new Image();                image_object.src = $small.attr('src');                // Gets the image native height and width.                native_height = image_object.height;                native_width = image_object.width;                // Gets the image current height and width.                current_height = $small.height();                current_width = $small.width();            } else {                // Gets .maginfy offset coordinates.                var magnify_offset = $(this).offset(),                // Gets coordinates within .maginfy.                    mx = e.pageX - magnify_offset.left,                    my = e.pageY - magnify_offset.top;                // Checks the mouse within .maginfy or not.                if (mx < $(this).width() && my < $(this).height() && mx > 0 && my > 0) {                    $large.fadeIn(100);                } else {                    $large.fadeOut(100);                }                if ($large.is(":visible")) {                    /* Gets the large image coordinate by ratio                     small.x / small.width = large.x / large.width                    small.y / small.height = large.y / large.height                    then we need to keep pointer in the centre,                     so deduct the half of .large width and height.                    */                    var rx = Math.round(mx / $small.width() * native_width - $large.width() / 2) * -1,                        ry = Math.round(my / $small.height() * native_height - $large.height() / 2) * -1,                        bgp = rx + "px " + ry + "px",                        px = mx - $large.width() / 2,                        py = my - $large.height() / 2;                    $large.css({                        left: px,                        top: py,                        backgroundPosition: bgp                    });                }            }        });        $(".magnify").bind('DOMMouseScroll mousewheel onmousewheel', function(e) {            var image_object = new Image();            image_object.src = $large.attr('src');            // cross-browser wheel delta            e = window.event || e; // old IE support.            var delta = Math.max(-1, Math.min(1, (e.wheelDelta || -e.detail)));            // Gets the image scaling height and width.            native_height += (native_height * defaults.scaling * delta);            native_width += (native_width * defaults.scaling * delta);            // The image can't smaller than the original.            if (native_height < current_height) {                native_height = current_height;            }            if (native_width < current_width) {                native_width = current_width;            }            // console.log("native_height: " + native_height + " native_width: " + native_width);            // Gets .maginfy offset coordinates.            var magnify_offset = $(this).offset(),                mx = e.pageX - magnify_offset.left,                my = e.pageY - magnify_offset.top;            // Update backgroud image size.            $large.css('background-size', native_width + "px " + native_height + "px");            /* Gets the large image coordinate by ratio             small.x / small.width = large.x / large.width            small.y / small.height = large.y / large.height            then we need to keep pointer in the centre,             so deduct the half of .large width and height.            */            var rx = Math.round(mx / $small.width() * native_width - $large.width() / 2) * -1,                ry = Math.round(my / $small.height() * native_height - $large.height() / 2) * -1,                bgp = rx + "px " + ry + "px",                px = mx - $large.width() / 2,                py = my - $large.height() / 2;            $large.css({                left: px,                top: py,                backgroundPosition: bgp            });        });    };})(jQuery);

 

图3 放大镜效果

上面,我们实现了放大镜效果,当我们鼠标停留在图片上方会自动放大图片的相应部位,当然我们可以通过滚轮调整放大的比例。

1.1.3 总结

在本博文中,我们介绍了如何实现放大镜效果,总的来说,我们可以通过两种方式实现放大镜效果,而且在博文中都给出了详细的介绍,通过mousemove事件实现加载大图的效果,mousewheel事件实现动态修改原图的尺寸。

这只是一个简单的程序,我们还有很大的改善空间,提供一个内容丰富和功能强大的程序是我们的目标。

参考 http://tech.pro/tutorial/681/css-tutorial-the-background-position-property http://www.sitepoint.com/html5-javascript-mouse-wheel/ http://thecodeplayer.com/walkthrough/magnifying-glass-for-images-using-jquery-and-css3

Demo

陳述
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
&gt; gt;的目的是什麼 元素?&gt; gt;的目的是什麼 元素?Mar 21, 2025 pm 12:34 PM

本文討論了HTML&lt; Progress&gt;元素,其目的,樣式和與&lt; meter&gt;元素。主要重點是使用&lt; progress&gt;為了完成任務和LT;儀表&gt;對於stati

&lt; datalist&gt;的目的是什麼。 元素?&lt; datalist&gt;的目的是什麼。 元素?Mar 21, 2025 pm 12:33 PM

本文討論了html&lt; datalist&gt;元素,通過提供自動完整建議,改善用戶體驗並減少錯誤來增強表格。Character計數:159

&lt; meter&gt;的目的是什麼。 元素?&lt; meter&gt;的目的是什麼。 元素?Mar 21, 2025 pm 12:35 PM

本文討論了HTML&lt; meter&gt;元素,用於在一個範圍內顯示標量或分數值及其在Web開發中的常見應用。它區分了&lt; meter&gt;從&lt; progress&gt;和前

視口元標籤是什麼?為什麼對響應式設計很重要?視口元標籤是什麼?為什麼對響應式設計很重要?Mar 20, 2025 pm 05:56 PM

本文討論了視口元標籤,這對於移動設備上的響應式Web設計至關重要。它解釋瞭如何正確使用確保最佳的內容縮放和用戶交互,而濫用可能會導致設計和可訪問性問題。

如何使用HTML5表單驗證屬性來驗證用戶輸入?如何使用HTML5表單驗證屬性來驗證用戶輸入?Mar 17, 2025 pm 12:27 PM

本文討論了使用HTML5表單驗證屬性,例如必需的,圖案,最小,最大和長度限制,以直接在瀏覽器中驗證用戶輸入。

我如何使用html5&lt; time&gt; 元素以語義表示日期和時間?我如何使用html5&lt; time&gt; 元素以語義表示日期和時間?Mar 12, 2025 pm 04:05 PM

本文解釋了HTML5&lt; time&gt;語義日期/時間表示的元素。 它強調了DateTime屬性對機器可讀性(ISO 8601格式)的重要性,並在人類可讀文本旁邊,增強Accessibilit

&lt; iframe&gt;的目的是什麼。 標籤?使用時的安全考慮是什麼?&lt; iframe&gt;的目的是什麼。 標籤?使用時的安全考慮是什麼?Mar 20, 2025 pm 06:05 PM

本文討論了&lt; iframe&gt;將外部內容嵌入網頁,其常見用途,安全風險以及諸如對象標籤和API等替代方案的目的。

HTML5中跨瀏覽器兼容性的最佳實踐是什麼?HTML5中跨瀏覽器兼容性的最佳實踐是什麼?Mar 17, 2025 pm 12:20 PM

文章討論了確保HTML5跨瀏覽器兼容性的最佳實踐,重點是特徵檢測,進行性增強和測試方法。

See all articles

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

AI Hentai Generator

AI Hentai Generator

免費產生 AI 無盡。

熱門文章

R.E.P.O.能量晶體解釋及其做什麼(黃色晶體)
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳圖形設置
3 週前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您聽不到任何人,如何修復音頻
3 週前By尊渡假赌尊渡假赌尊渡假赌

熱工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版

WebStorm Mac版

好用的JavaScript開發工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

強大的PHP整合開發環境

MinGW - Minimalist GNU for Windows

MinGW - Minimalist GNU for Windows

這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。