自己编写jQuery插件 之 放大镜

一. 效果图

二. 原理讲解

 1. 用到了两张图片,一张小图,一张大图。

 2. 小图用于直接在页面上显示,大图则用于放大镜内显示

 3. 放大镜实际是一个div,而大图则是这个div的背景图

 4. 小图与大图是等比例的,从而达到最佳放大效果

 5. 当没设置大图时,则大图为小图本身,此种情况放大效果不明显,相当于没放大一样

 6. 这里借助于鼠标移动事件(即:mousemove),通过鼠标在小图上的移动坐标 和 大小图的比例(比例计算得来),从而计算出放大镜内的背景图对应的坐标位置。

三. 插件实现代码

(function () {
    $.fn.magnifier = function (options) {

        //默认参数设置
        var settings = {
            diameter: 150,                   //放大镜的直径大小
            backgroundImg: "img/larger.jpg"  //放大镜内的图片(即大图)
        };

        //合并参数
        if (options){
            $.extend(settings, options);
        }

        //链式原则
        return this.each(function () {
            
            var root = $(this),                 //存储当前对象           
                wRoot = root.width(),           //当前对象宽
                hRoot = root.height(),          //当前对象高
                offset = root.offset(),         //偏移量 left 和 top
                magnifier = $(".magnifier"),    //放大镜对象
                wRatio = 0,                     //缩放比率-宽度
                hRatio = 0,                     //缩放比率-高度
                backgroundImg = settings.backgroundImg ? settings.backgroundImg : root.attr("src"); //大图(当没有大图时,为小图本身)

            //设置放大镜样式
            magnifier.css({
                width : settings.diameter+"px", 
                height : settings.diameter+"px", 
                borderRadius : (settings.diameter / 2) + "px",
                backgroundImage: "url('" + backgroundImg + "')" }); //将图片放入放大镜内

            /* 图片加载完,计算缩放比例
             * 由于图片原本不在DOM文档里,
             * 因此页面加载时不会触发load事件,
             * 因此要通过执行appendTo来触发load事件 */
            $("<img style='display:none;' src='" + backgroundImg + "' />").load(function () {
                wRatio = $(this).width() / wRoot;
                hRatio = $(this).height() / hRoot;
            }).appendTo(root.parent());

            //放大镜及其背景图片位置控制
            function _position(e) {

                var lPos = parseInt(e.pageX - offset.left),
                    tPos = parseInt(e.pageY - offset.top);

                //判断鼠标是否在图片上
                if (lPos < 0 || tPos < 0 || lPos > wRoot || tPos > hRoot) {

                    magnifier.hide(); //不在隐藏放大镜

                } else {

                    magnifier.show(); //反之显示放大镜

                    //控制放大镜内背景图片的位置   (settings.diameter / 2)半径
                    lPos = ((e.pageX - offset.left) * wRatio - settings.diameter / 2) * (-1);
                    tPos = ((e.pageY - offset.top) * hRatio - settings.diameter / 2) * (-1);

                    magnifier.css({ backgroundPosition: lPos + 'px ' + tPos + 'px' });

                    //控制放大镜本身位置
                    lPos = e.pageX - settings.diameter / 2;
                    tPos = e.pageY - settings.diameter / 2;

                    magnifier.css({ left: lPos + 'px', top: tPos + 'px' });
                }
            }

            //放大镜
            magnifier.mousemove(_position);

            //当前对象
            root.mousemove(_position);

        });
    };
})();

四. Html结构

<div class="box">
     <img src="img/small.jpg" id="img-small" width="500" height="333" /> <!-- 小图 -->
     <div class="magnifier"></div> <!-- 放大镜div (上一个版本此div是直接定义在js里面的) -->
</div>

五.  放大镜样式

/*放大镜样式*/
.magnifier{
    background-position: 0px 0px;
    background-repeat: no-repeat;
    position: absolute;
    box-shadow: 0 0 5px #777, 0 0 10px #aaa inset;
    display: none;
    width: 150px;
    height: 150px;
    border-radius: 75px;
    border:2px solid #FFF;
    cursor: none;
}

 之前放大镜及其样式都是写在js代码里面的,为了做到更好的分离,所以此次修改后将放大镜div和css样式抽出来了。

六. 使用示例

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>jQuery放大镜插件</title>
    <link rel="stylesheet" type="text/css" href="css/style.css" />
</head>
<body>
    <h2 class="title">jQuery放大镜插件</h2>

    <div class="box">
        <img src="img/small.jpg" id="img-small" width="500" height="333" /> <!-- 小图 -->
        <div class="magnifier"></div> <!-- 放大镜div -->
    </div>

    <script type="text/javascript" src="script/jquery.min.js"></script>
    <script type="text/javascript" src="script/jquery.similar.magnifier.js"></script>
    <script type="text/javascript">
        $("#img-small").magnifier();
    </script>
</body>
</html>
原文地址:https://www.cnblogs.com/similar/p/5914561.html