JavaScript网页特效(一)图片放大镜

浏览带有图片的购物网站时,有时鼠标放在图片上,可以放大局部看清楚图片。今天要实现的就是这个效果。

用到的事件

(1)onmouseover:鼠标指针悬浮在指定的对象时发生
(2)onmouseout:鼠标指针离开指定对象时发生
(3)onmousemove:鼠标指针移动时发生

用到的属性

放大镜要点
offsetWidth,offsetHeight返回的是div的宽高度
offsetLeft,offsetTop返回的是div距离父容器左边和上边的高度
event.clientX,event.clientY返回事件发生时,鼠标指针相对于客户窗口的X坐标
这里注意:offsetLeft和style.left的三点区别:
(1)style.left返回的是字符串,如30px,而offsetLeft返回的是数值,如30
(2)style.left是可读写的,offsetleft是只读的。如果要修改div的位置,只能修改style.left
(3)style.left需要事先定义,否则取到的值为空(取不到css样式中定义的left)

css样式

<style type="text/css">
        *{
            margin: 0;
            padding: 0;
        }
        #container{
            display: block;
            width: 400px;
            height: 255px;
            margin: 50px;
            position: relative;
            border:1px solid #ccc;
        }
        #small-box{
            position: relative;
            z-index: 1;
        }
        #float-box{
            display: none;
            width: 160px;
            height: 120px;
            position: absolute;
            background: #ffffcc;
            opacity: 0.5;
            border:1px solid #ccc;
        }
        #mark{
            position: absolute;
            display: block;
            width: 400px;
            height: 255px;
            background: #fff;
            opacity: 0;
            z-index: 10;
        }
        #big-box{
            display: none;
            position: absolute;
            top: 0;
            left: 460px;
            width: 400px;
            height: 300px;
            overflow: hidden;
            border:1px solid #ccc;
            z-index: 1;
        }
        #big-box img{
            position: absolute;
            z-index: 5;
        }
    </style>

html代码

<div id="container">
    <div id="small-box">
        <div id="mark"></div>
        <div id="float-box"></div>
        <img src="./images/macbook-small.jpg">
    </div>
    <div id="big-box">
        <img src="./images/macbook-big.jpg">
    </div>
</div>

js代码

<script type="text/javascript">
    window.onload = function(){
        var container = document.getElementById('container');
        var smallbox=document.getElementById('small-box');
        var floatbox=document.getElementById('float-box');
        var mark=document.getElementById('mark');
        var bigbox=document.getElementById('big-box');
        var bigboxImg=bigbox.getElementsByTagName('img')[0];
        mark.onmouseover=function (){
            floatbox.style.display = 'block';
            bigbox.style.display='block';
        }
        mark.onmouseout=function(){
            floatbox.style.display='none';
            bigbox.style.display='none';
        }
        mark.onmousemove=function(event){
            var _event = event || window.event;//兼容多个浏览器的event参数模式
            //取得放大镜距离容器smallbox左边和上边的距离
            var left = _event.clientX-container.offsetLeft-smallbox.offsetLeft-floatbox.offsetWidth/2;
            var top=_event.clientY-container.offsetTop-smallbox.offsetTop-floatbox.offsetHeight/2;
            //使放大镜不超出容器smallbox
            if (left<0) {
                left=0;
            }else if (left>(mark.offsetWidth-floatbox.offsetWidth)) {
                left=mark.offsetWidth-floatbox.offsetWidth;
            }
            if (top<0) {
                top=0;
            }else if (top>(mark.offsetHeight-floatbox.offsetHeight)) {
                top=mark.offsetHeight-floatbox.offsetHeight;
            }
            //赋值,确定放大镜的位置
            floatbox.style.left=left+"px";
            floatbox.style.top=top+"px";    
            //算出小图片和大图片的比例
            var percentX=left/(mark.offsetWidth-floatbox.offsetWidth);
            var percentY=top/(mark.offsetHeight-floatbox.offsetHeight);
            //这里加上负号是因为放大镜的移动方向和大图片的移动方向横向和纵向都是相反的
            bigboxImg.style.left=-percentX*(bigboxImg.offsetWidth-bigbox.offsetWidth)+"px";
            bigboxImg.style.top=-percentY*(bigboxImg.offsetHeight-bigbox.offsetHeight)+"px";
        }
    }

</script>

接下来要算放大镜移动时,bigbox的效果实现
这里写图片描述

//算出小图片和大图片的比例
            var percentX=left/(mark.offsetWidth-floatbox.offsetWidth);
            var percentY=top/(mark.offsetHeight-floatbox.offsetHeight);
            //这里加上负号是因为放大镜的移动方向和大图片的移动方向横向和纵向都是相反的
            bigboxImg.style.left=-percentX*(bigboxImg.offsetWidth-bigbox.offsetWidth)+"px";
            bigboxImg.style.top=-percentY*(bigboxImg.offsetHeight-bigbox.offsetHeight)+"px";
        }

最后一点注意的是,mark的遮罩层覆盖了smallbox,是因为在低版本的IE浏览器,鼠标在图片上悬浮时会出现大图的闪烁,chrome则不会。所以,加上mark解决兼容问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值