zoukankan      html  css  js  c++  java
  • 自己编写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>
  • 相关阅读:
    跨域现象及原理分析
    git的commit撤销
    什么是幂等,什么情况下需要幂等,如何实现幂等
    flowable表简要说明
    关于SpringCloud、SpringBoot简单讲解
    常用的maven仓库地址
    Python安装第三方库常用方法
    反编译pyinstaller打包的exe安装包
    测试用例-需要添加@Transactional 这样 就不会再数据库里面留下痕迹了
    断点 太多了 调试运行特别慢-把所有的历史断点都去掉就快了
  • 原文地址:https://www.cnblogs.com/similar/p/5914561.html
Copyright © 2011-2022 走看看