分别用原生js和jQuery框架写京东淘宝的放大镜效果

放大镜.gif

所谓的放大镜效果其实是由两张图片来完成的,一张小图片一张大图片,鼠标放在小图片上移动,从而控制大图片来移动,给人一张图片被放大的错觉.上面是效果图:


1.原生js

(1)首先写html部分

<body>
    <div class="min">
        <img src="img/max2.jpg" alt="" />
        <div class="fd"></div>
    </div>
    <div class="max">
        <img src="img/mmax2.jpg"/>
    </div>
    </body>

min放小图片,max放大图片,enlarge是浅蓝色的放大镜;
图片就自己找吧...(上京东淘宝拽出来就行)

(2)css样式

<style type="text/css">
    .min{
        width: 350px;
        height: 350px;
        border: 1px solid black;
        float: left;
        position: relative;
    }
    .max{
        width: 350px;
        height: 350px;
        border: 1px solid black;
        float: left;
        display: none;
        overflow: hidden;
        position: relative;
    }
    .max img{
        position: absolute;
        top: 0;
        left: 0;
    }
    .enlarge{
        width: 150px;
        height: 150px;
        box-shadow: 0px 0px 10px black;
        background-color: skyblue;
        opacity: 0.3;
        position: absolute;
        top: 0;
        left: 0;
        display: none;
    }
</style>
max的"overflow: hidden;"是把大图片超出的部分隐藏
一开始放大镜enlarge和max都是隐藏的且不占文本流,所以都是"display: none;"
放大镜enlarge最后要随鼠标移动而移动,是通过改变其距左边的距离而实现的,所以要设置定位"position: absolute;",且"left: 0;".

(2)原生js

<script type="text/javascript">
        var min = document.querySelector(".min"),
        max = document.querySelector(".max"),
        fd = document.querySelector(".enlarge"),
        img = document.querySelector(".max img");
        min.onmouseover = function () {
            // 1.鼠标覆盖显示max和enlarge
            max.style.display = "block";
            enlarge.style.display = "block";
            // 离开时隐藏
            min.onmouseout = function () {
                max.style.display = "none";
                enlarge.style.display = "none";
            }
            // 2.enlarge的移动范围
            min.onmousemove = function () {
                // 鼠标触摸的点
                var x = event.clientX - min.offsetLeft - enlarge.offsetWidth / 2;
                var y = event.clientY - min.offsetTop - enlarge.offsetHeight / 2;
                // 最大移动距离
                var maxX = min.clientWidth - enlarge.offsetWidth;
                var maxY = min.clientHeight - enlarge.offsetHeight;
                // 边界判断
                if (x <= 0) {
                    x = 0;
                } else if (x >= maxX) {
                    x = maxX;
                }
                if (y <= 0) {
                    y = 0;
                } else if (y >= maxY) {
                    y = maxY;
                }
                // enlarge的位置
                enlarge.style.left = x + "px";
                enlarge.style.top = y + "px";
                // 移动比例 (enlarge/min = max/img)
                var yidongX = x / maxX;
                var yidongY = y / maxY;
                // 3.max的对应显示
                img.style.left = yidongX * (max.clientWidth - img.offsetWidth) + "px";
                img.style.top = yidongY * (max.clientHeight - img.offsetHeight) + "px";
            }
        }
    </script>
注释都写在代码里了,其中鼠标进入小图片时的放大镜和大图片的出现比较简单,就是"display =none或block".
放大镜中心随鼠标移动而移动,需要用的两个属性clientX与clientY,鼠标距浏览器左边和上边的距离,它俩是实时获取的,只要鼠标动其值就跟着变化.设置放大镜移动的位置即距离左边的距离 ,设为x ,x = event.clientX - min.offsetLeft - enlarge.offsetWidth / 2,即鼠标的横向距离减去小图片距左边的距离再减去放大镜本身宽度的一般,这样就是放大镜中心随鼠标移动而移动(这里的min.offsetLeft值为8,是系统自带的外边距).垂直方向和水平方向一个原理,不再赘述了.
大图片的移动.鼠标移动多少,大图片移动相应的比例就OK了,这就是简单的数学问题了,"enlarge/min = max/img".注意大图片移动方向是和放大镜移动方向相反的,注意负号.

2.jQuery框架

jQuery框架就是js写的封装起来的库,对于不太会原生js的人后者不会前段的人来说是非常好用的.框架有很多,jQ只是一种,比较常用的一种.

(1)html和css部分的写法和原生js是一样的,这里就不再写了.

(2)jQuery部分

别忘了先导入jQ文件,我这里是 jquery-1.12.3.js
<script src="js/jquery-1.12.3.js" type="text/javascript" charset="utf-8"></script>
    <script type="text/javascript">
        $(function(){
            // 1.鼠标覆盖min 显示放大镜
            $('.min').mousemove(function(e) {
                $('.max').show()
                $('.enlarge').show()
                // 放大镜移动
                // pageX/Y 相对于body内容的x/y(滚动条变化时跟随变化)
                                // offset().left 相当于 offsetLeft
                var x = e.pageX - $('.min').offset().left - $('enlarge').width() / 2
                var y = e.pageY - $('.min').offset().top - $('.enlarge').height() / 2
                // 最大移动范围
                var maxX = $('.min').width() - $('.enlarge').width()
                var maxY = $('.min').height() - $('.enlarge').height()
                // 范围约束
                if (x <= 0) {
                    x = 0;
                } else if (x >= maxX) {
                    x = maxX;
                }
                if (y <= 0) {
                    y = 0;
                } else if (y >= maxY) {
                    y = maxY;
                }
                // 设置位置
                $('.enlarge').css({
                    left: x,
                    top: y
                })
                // 2.放大镜移动 max上的图片等比例移动
                var yidongX = x / maxX
                var yidongY = y / maxY
                $('.max>img').css({
                    left: -yidongX * ($('.max>img').width() - $('.max').width()),
                    top: -yidongY * ($('.max>img').height() - $('.max').height())
                })
            }).mouseout(function() {
                $('.max').hide()
                $('.fd').hide()
            })  
        })
</script>
注释都写代码里了,思想是和原生js一样的.其实jQ要学的东西并不少,建议去W3C查询学习,像show(),hide(),offset()等都是封装好的函数.
由于jQ比较大,加载的时候会慢,很多大公司已经不再用jQ了,尽量用原生去写,建议要学前端的人一定要学好原生js
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,378评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,356评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,702评论 0 342
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,259评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,263评论 5 371
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,036评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,349评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,979评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,469评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,938评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,059评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,703评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,257评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,262评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,485评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,501评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,792评论 2 345

推荐阅读更多精彩内容