javaScript动画3 事件对象event onmousemove

事件对象的获取(event的获取) 

var event = event || window.event;(主要用这种)

screenX、pageX和clientX的区别

PageY/pageX: 鼠标位于整个网页页面的顶部和左侧部分的距离。(页面)
ScreenY/screenX: 鼠标位于屏幕的上方和左侧的距离。(屏幕)
ClientX/clientY: 鼠标位于浏览器的左侧和顶部的距离。(浏览器大小和位置)

pageY/X兼容写法

pageY/pageX=event.clientY/clientX+scroll().top/scroll().left

新事件(onmousemove)

只要鼠标在绑定该事件的事件源上移动,哪怕1像素,也会触动这个事件。(这个事件可以直接或者间接的替代定时器)

公用js

  1 //缓动动画封装
  2 function animate(ele,target) {
  3     clearInterval(ele.timer);
  4     ele.timer = setInterval(function () {
  5         var step = (target-ele.offsetTop)/10;
  6         step = step>0?Math.ceil(step):Math.floor(step);
  7         ele.style.top = ele.offsetTop + step + "px";
  8         console.log(1);
  9         if(Math.abs(target-ele.offsetTop)<Math.abs(step)){
 10             ele.style.top = target + "px";
 11             clearInterval(ele.timer);
 12         }
 13     },25);
 14 }
 15 /**
 16  * Created by andy on 2015/12/8.
 17  */
 18 function scroll() {  // 开始封装自己的scrollTop
 19     if(window.pageYOffset != null) {  // ie9+ 高版本浏览器
 20         // 因为 window.pageYOffset 默认的是  0  所以这里需要判断
 21         return {
 22             left: window.pageXOffset,
 23             top: window.pageYOffset
 24         }
 25     }
 26     else if(document.compatMode === "CSS1Compat") {    // 标准浏览器   来判断有没有声明DTD
 27         return {
 28             left: document.documentElement.scrollLeft,
 29             top: document.documentElement.scrollTop
 30         }
 31     }
 32     return {   // 未声明 DTD
 33         left: document.body.scrollLeft,
 34         top: document.body.scrollTop
 35     }
 36 }
 37 /**
 38  * Created by Lenovo on 2016/9/2.
 39  */
 40 /**
 41  * 通过传递不同的参数获取不同的元素
 42  * @param str
 43  * @returns {*}
 44  */
 45 function $(str){
 46     var str1 = str.charAt(0);
 47     if(str1==="#"){
 48         return document.getElementById(str.slice(1));
 49     }else if(str1 === "."){
 50         return document.getElementsByClassName(str.slice(1));
 51     }else{
 52         return document.getElementsByTagName(str);
 53     }
 54 }
 55 
 56 /**
 57  * 功能:给定元素查找他的第一个元素子节点,并返回
 58  * @param ele
 59  * @returns {Element|*|Node}
 60  */
 61 function getFirstNode(ele){
 62     var node = ele.firstElementChild || ele.firstChild;
 63     return node;
 64 }
 65 
 66 /**
 67  * 功能:给定元素查找他的最后一个元素子节点,并返回
 68  * @param ele
 69  * @returns {Element|*|Node}
 70  */
 71 function getLastNode(ele){
 72     return ele.lastElementChild || ele.lastChild;
 73 }
 74 
 75 /**
 76  * 功能:给定元素查找他的下一个元素兄弟节点,并返回
 77  * @param ele
 78  * @returns {Element|*|Node}
 79  */
 80 function getNextNode(ele){
 81     return ele.nextElementSibling || ele.nextSibling;
 82 }
 83 
 84 /**
 85  * 功能:给定元素查找他的上一个兄弟元素节点,并返回
 86  * @param ele
 87  * @returns {Element|*|Node}
 88  */
 89 function getPrevNode(ele){
 90     return ele.previousElementSibling || ele.previousSibling;
 91 }
 92 
 93 /**
 94  * 功能:给定元素和索引值查找指定索引值的兄弟元素节点,并返回
 95  * @param ele 元素节点
 96  * @param index 索引值
 97  * @returns {*|HTMLElement}
 98  */
 99 function getEleOfIndex(ele,index){
100     return ele.parentNode.children[index];
101 }
102 
103 /**
104  * 功能:给定元素查找他的所有兄弟元素,并返回数组
105  * @param ele
106  * @returns {Array}
107  */
108 function getAllSiblings(ele){
109     //定义一个新数组,装所有的兄弟元素,将来返回
110     var newArr = [];
111     var arr = ele.parentNode.children;
112     for(var i=0;i<arr.length;i++){
113         //判断,如果不是传递过来的元素本身,那么添加到新数组中。
114         if(arr[i]!==ele){
115             newArr.push(arr[i]);
116         }
117     }
118     return newArr;
119 }
animate.js

案例-楼层跳跃

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        body,html{
            height: 100%;
        }
        ul{
            height: 100%;
            list-style: none;
        }
        ul li{
            height: 100%;

        }
        ol{
            list-style: none;
            position: fixed;
            top: 80px;
            left:50px;
        }

        ol li{
             50px;
            height: 50px;
            border: 1px solid #000;
            text-align: center;
            line-height: 50px;
            margin-top: -1px;
            cursor: pointer;
        }
    </style>
</head>
<body>
    <ul>
        <li>鞋子区域</li>
        <li>袜子区域</li>
        <li>裤子区域</li>
        <li>裙子区域</li>
        <li>帽子区域</li>
    </ul>
    <ol>
        <li>鞋子</li>
        <li>袜子</li>
        <li>裤子</li>
        <li>裙子</li>
        <li>帽子</li>
    </ol>

    <script src="animate.js"></script>
    <script>
        //需求:点击ol中的li,屏幕滑动到ol中的li
        //利用,window.scrollTo();利用缓动动画原理
        //1、指定ul和ol中的li的背景色,对应的li背景色相同
        //2、老三步(获取元素绑定事件)
        //3、利用缓动动画原理
        //4、用scroll事件模拟盒子距离最顶端的距离

        //0、获取元素
        var ul = document.getElementsByTagName("ul")[0];
        var ol = document.getElementsByTagName("ol")[0];
        var ulLiArr = ul.children;
        var olLiArr = ol.children;
        var target = 0;
        var leader = 0;
        var timer = null;
        //1、指定ul和ol中的li的背景色,对应的li背景色相同
        var arrColor=["pink","blue","yellow","orange","green"];
        //利用for循环给两个数组中的元素上色
        for(var i=0;i<arrColor.length;i++){
            ulLiArr[i].style.backgroundColor = arrColor[i];
            olLiArr[i].style.backgroundColor = arrColor[i];

            //属性绑定索引值
            olLiArr[i].index = i;


            //2、老三步(获取元素绑定事件)
            olLiArr[i].onclick = function () {
                //获取目标位置
                    //获取索引值
                //ul的li距离顶部的距离
                target = ulLiArr[this.index].offsetTop;


                //要用定时器,先清除定时器
                clearInterval(timer);
                //3、利用缓动动画原理
                timer = setInterval(function () {
                    //1:获取步长
                    var step = (target-leader)/10;
                    //2:二次处理步长
                    step = step>0?Math.ceil(step):Math.floor(step);
                    //3:屏幕滑动
                    leader = leader + step;
                    window.scrollTo(0,leader);
                    //4:清除定时器
                    if(Math.abs(target-leader)<=Math.abs(step)){
                        window.scrollTo(0,target);
                        clearInterval(timer);
                    }
                },25)
            }
        }

        //4、用scroll事件模拟盒子距离最顶端的距离
        window.onscroll = function () {
            //每次屏幕滑动,把屏幕卷去的头部赋值给leader,模拟,获取显示器距离顶部的距离
            leader = scroll().top;
        }

        //3、利用缓动动画原理
    </script>

</body>
</html>

案例-鼠标跟随

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        body{
            padding: 0;
            margin: 0;
            height: 5000px;
        }
        img{
            position: absolute;
            padding: 10px 0;
            border: 1px solid #ccc;
             100px;
            cursor: pointer;
        }
    </style>
</head>
<body>
<img src="images/img.jpg" />
<script src="animate.js"></script>
<script>
    //需求:点击页面的任何地方,图片移动到点击位置
    //思路:获取鼠标在页面中的位置。让图片缓慢运动到鼠标点击的位置
    //兼容ie67做pageY和pageX
    //原理:被卷去的 + 浏览器可视区



    //步骤
    //1、老三步
    //2、获取鼠标在页面中的位置
    //3、缓动,图片移动到指定位置(包括左右上下)

    //1、老三步
    var img = document.getElementsByTagName("img")[0];
    var timer = null;
    var targetx = 0;
    var targety = 0;
    var leaderx = 0;
    var leadery = 0;
    //给整个文档绑定点击事件获取鼠标位置
    document.onclick = function (event) {
        event =event ||window.event;
        //原理:被卷去的 + 浏览器可视区
        var pagey= event.pageY || scroll().top + event.clientY;
        var pagex= event.pageX || scroll().left + event.clientX;
        //调用定时器先清除定时器
        // targety = pagey-img.offsetHeight/2;
        // targetx = pagex-img.offsetWidth/2;
        targety = pagey-30;
        targetx = pagex-50;

        clearInterval(timer);
        timer = setInterval(function () {
            //1 为盒子的位置获取值
            leaderx = img.offsetLeft;
            //2 获取步长
            var stepx = (targetx-leaderx)/10;
            //3 处理步长
            stepx = stepx>0?Math.ceil(stepx):Math.floor(stepx);
            leaderx = leaderx+stepx;
            //4 赋值
            img.style.left=leaderx + "px";



            //为盒子的位置获取值
            leadery = img.offsetTop;
            //获取步长
            var step = (targety-leadery)/10;
            //处理步长
            step = step>0?Math.ceil(step):Math.floor(step);
            leadery = leadery+step;
            //赋值
            img.style.top=leadery + "px";
            //清定时器
            if(Math.abs(targety-img.offsetTop)<=Math.abs(step) && Math.abs(targetx-img.offsetLeft)<=Math.abs(stepx)){
                img.style.top=targety + "px";
                img.style.left=targetx + "px";
                clearInterval(timer);
            }
        },30)


    }
    //2、获取鼠标在页面中的位置
    //3、缓动,图片移动到指定位置(包括左右上下)



</script>
</body>
</html> 

 案例-鼠标在小盒子中的坐标

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title></title>
    <style>
        .box {
             300px;
            height: 200px;
            padding-top: 100px;
            background-color: pink;
            margin: 100px;
            text-align: center;
            font: 18px/30px "simsun";
            cursor: pointer;
        }
    </style>
</head>
<body>
    <div class="box">
    </div>


    <script src="animate.js"></script>
    <script>
        //需求:鼠标进入盒子之后移动,随时更换里面的内容.(鼠标在盒子中的坐标)
        //技术点:新事件onmousemove在事件源上,移动哪怕一像素也会触动这个事件
            //一定程度上模拟了定时器

        //步骤
        //1、 老三步和新五步
        //2、获取鼠标在整个页面的位置
        //3、获取盒子在整个页面的位置
        //4、用鼠标的位置减去盒子的位置赋值个盒子的内容


        //1、 老三步和新五步
        var div= document.getElementsByTagName("div")[0];

        div.onmousemove = function (event) {
            //新五步

            event =event ||window.event;
            //2、获取鼠标在整个页面的位置
            var pagex=event.pageX || scroll().left + event.clientX;
            var pagey=event.pagey || scroll().top + event.clientY;
            //3、获取盒子在整个页面的位置
            // var xx = div.offsetLeft;
            // var yy = div.offsetTop;
            //4、用鼠标的位置减去盒子的位置赋值个盒子的内容
            var targetx = pagex - div.offsetLeft;
            var targety = pagey - div.offsetTop;

            this.innerHTML = "鼠标在盒子中的x坐标为:"+targetx+"px;<br>鼠标在盒子中的y坐标为:"+targety+"px;"
        }

    </script>
</body>
</html> 

案例-拖拽案例 

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }

        .nav {
            height: 30px;
            background: #036663;
            border-bottom: 1px solid #369;
            line-height: 30px;
            padding-left: 30px;
        }

        .nav a {
            color: #fff;
            text-align: center;
            font-size: 14px;
            text-decoration: none;

        }

        .d-box {
             400px;
            height: 300px;
            border: 5px solid #eee;
            box-shadow: 2px 2px 2px 2px #666;
            position: absolute;
            top: 40%;
            left: 40%;
        }

        .hd {
             100%;
            height: 25px;
            background-color: #7c9299;
            border-bottom: 1px solid #369;
            line-height: 25px;
            color: white;
            cursor: move;
        }

        #box_close {
            float: right;
            cursor: pointer;
        }
    </style>

    <script src="animate.js"></script>
    <script>
        window.onload = function () {
            //需求:在指定位置按住鼠标左键移动对话框。
            //分析:鼠标按下,触动事件,移动在更换对话框的位置。
            //鼠标按下onmousedown   鼠标弹起:onmouseup   鼠标移动onmousemove
            //步骤:
            //1.老三步和新五步
            //2.把鼠标的坐标赋值给对话框。

            var box = document.getElementById("d_box");
            var drop = document.getElementById("drop");

            //1.老三步和新五步
            //先按下再触动此事件
            drop.onmousedown = function (event) {
                //获取鼠标再盒子中的坐标,将来移动的时候减去保证鼠标在盒子的指定位置
                event = event||window.event;
                var pagex = event.pageX || scroll().left + event.clientX;
                var pagey = event.pageY || scroll().top + event.clientY;
                var x = pagex - box.offsetLeft;
                var y = pagey - box.offsetTop;

                document.onmousemove = function (event) {
                    //2.把鼠标的坐标赋值给对话框。
                    event = event||window.event;
                    var xx = event.pageX || scroll().left + event.clientX;
                    var yy = event.pageY || scroll().top + event.clientY;

                    //二次操作鼠标位置  减去鼠标在盒子中的坐标
                    xx = xx - x;
                    yy = yy - y;
                    //给box赋值
                    box.style.left = xx + "px";
                    box.style.top = yy + "px";

                    //禁止文本选中(选中后取消)
                    window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();
                };
            };
            //事件解绑
            drop.onmouseup = function () {
                document.onmousemove = null;
            }
        }
    </script>

</head>
<body>
<!--顶部注册部分,无用-->
<div class="nav">
    <a href="javascript:;" id="register">注册信息</a>
</div>
<!--我们移动的对话框-->
<div class="d-box" id="d_box">
    <div class="hd" id="drop">
        <i>注册信息 (可以拖拽)</i>
        <span id="box_close">【关闭】</span>
    </div>
    <div class="bd"></div>
</div>

</body>
</html>

案例-模拟滚动条

<!DOCTYPE html>
<html>
<head lang="en">
    <meta charset="UTF-8">
    <title></title>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .box{
             300px;
            height: 500px;

            border: 1px solid red;
            margin: 50px auto;
            overflow: hidden;
            position: relative;
        }
        .scroll {
             20px;
            height: 520px;
            background-color: #ccc;
            position: absolute;
            top: 0;
            right: 0;
        }
        .bar {
             20px;
            height: 200px;
            background-color: red;
            border-radius: 10px;
            cursor: pointer;
            position: absolute;
            top: 0;
        }
        .content{
            padding: 10px;
        }

    </style>

    <script src="animate.js"></script>
    <script>
        window.onload = function () {
            //需求:模拟滚动条,鼠标拖动滚动条,滚动条动,而且内容等比例联动。
            //步骤:
            //1.根据内容和盒子的比例确定bar的高。
            //2.绑定事件(鼠标按下,然后移动)
            //3.鼠标移动,bar联动
            //4.内容等比例联动


            //0.获取相关元素
            var box = document.getElementById("box");
            var content = box.children[0];
            var scroll = box.children[1];
            var bar = scroll.children[0];

            //1.根据内容和盒子的比例确定bar的高。
            //内容的高/盒子的高 = scroll的高/bar的高
            //bar的高 = 盒子的高*scroll的高/内容的高
            var barHeight = box.offsetHeight*scroll.offsetHeight/content.offsetHeight;
            bar.style.height = barHeight + "px";

            //2 绑定事件
            bar.onmousedown = function (event) {
                event = event||window.event;

                //鼠标在页面中的位置
                var pageyy=event.pageY || scroll().top + event.clientY;

                //鼠标在盒子中的位置
                var y = pageyy - bar.offsetTop;

                //模拟拖拽案例
                document.onmousemove = function (event) {

                    //新五步获取鼠标在页面位置
                    event = event||window.event;
                    var pagey = event.pageY || scroll().top + event.clientY;
                    pagey = pagey - y;
                    //限制y的取值。大于0,小于scroll的高度-bar的高度
                    if(pagey<0){
                        pagey = 0;
                    }else if(pagey>scroll.offsetHeight-bar.offsetHeight){
                        pagey = scroll.offsetHeight-bar.offsetHeight;
                    }


                    //3 鼠标移动,bar联动
                    bar.style.top = pagey + "px";


                    //4 内容等比例联动
                    //高级比例   内容走的距离/bar走的距离=(内容的高-大盒子的高)/(scroll的高-大盒子的高)
                    var s = pagey * (content.offsetHeight-box.offsetHeight)/(scroll.offsetHeight-bar.offsetHeight);
                    //s赋值给content。通过margin移动负值移动content
                    content.style.marginTop = -s + "px";


                    //让被选文字清除。
                    window.getSelection ? window.getSelection().removeAllRanges() : document.selection.empty();

                }
            };
            //事件解绑
            document.onmouseup = function () {
                document.onmousemove = null;

            }

        }
    </script>

</head>
<body>
    <div class="box" id="box">
        <div class="content">
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            孩儿励志出湘关,学不成名终不还。<br>
            埋骨何须桑梓地,人生无处不青山。<br>
            -------------结束------------<br>
        </div>
        <div class="scroll">
            <div class="bar"></div>
        </div>
    </div>



</body>
</html>

案例-放大镜

 1 <!DOCTYPE html>
 2 <html>
 3 <head lang="en">
 4     <meta charset="UTF-8">
 5     <title></title>
 6     <style>
 7         * {margin: 0;padding: 0;}
 8         .box {
 9             width: 350px;
10             height: 350px;
11             margin:100px;
12             border: 1px solid #ccc;
13             position: relative;
14         }
15         .big {
16             width: 400px;
17             height: 400px;
18             position: absolute;
19             top: 0;
20             left: 360px;
21             border: 1px solid #ccc;
22             overflow: hidden;
23         }
24         .mask {
25             width: 175px;
26             height: 175px;
27             background: rgba(255, 255, 0, 0.4);
28             position: absolute;
29             top: 0;
30             left: 0;
31             cursor: move;
32         }
33         .small {
34             position: relative;
35         }
36     </style>
37 </head>
38 <body>
39 <div class="box">
40     <div class="small">
41         <img src="images/001.jpg" alt=""/>
42         <div class="mask"></div>
43     </div>
44     <div class="big">
45         <img src="images/0001.jpg" alt=""/>
46     </div>
47 </div>
48 </body>
49 </html>
css
  1 <!DOCTYPE html>
  2 <html>
  3 <head lang="en">
  4     <meta charset="UTF-8">
  5     <title></title>
  6     <style>
  7         * {
  8             margin: 0;
  9             padding: 0;
 10         }
 11 
 12         .box {
 13             width: 350px;
 14             height: 350px;
 15             margin: 100px;
 16             border: 1px solid #ccc;
 17             position: relative;
 18         }
 19 
 20         .big {
 21             width: 400px;
 22             height: 400px;
 23             position: absolute;
 24             top: 0;
 25             left: 360px;
 26             border: 1px solid #ccc;
 27             overflow: hidden;
 28             display: none;
 29         }
 30 
 31         .mask {
 32             width: 175px;
 33             height: 175px;
 34             background: rgba(255, 255, 0, 0.4);
 35             position: absolute;
 36             top: 0;
 37             left: 0;
 38             cursor: move;
 39             display: none;
 40         }
 41 
 42         .small {
 43             position: relative;
 44         }
 45 
 46         img {
 47             vertical-align: top;
 48         }
 49     </style>
 50 
 51 
 52     <script src="animate.js"></script>
 53     <script>
 54         window.onload = function () {
 55             //需求:鼠标放到小盒子上,让大盒子里面的图片和我们同步等比例移动。
 56             //技术点:onmouseenter==onmouseover 第一个不冒泡
 57             //技术点:onmouseleave==onmouseout  第一个不冒泡
 58             //步骤:
 59             //1.鼠标放上去显示盒子,移开隐藏盒子。
 60             //2.老三步和新五步(黄盒子跟随移动)
 61             //3.右侧的大图片,等比例移动。
 62 
 63             //0.获取相关元素
 64             var box = document.getElementsByClassName("box")[0];
 65             var small = box.firstElementChild || box.firstChild;
 66             var big = box.children[1];
 67             var mask = small.children[1];
 68             var bigImg = big.children[0];
 69 
 70             //1.鼠标放上去显示盒子,移开隐藏盒子。
 71             small.onmouseenter = function () {
 72                 show(mask);
 73                 show(big);
 74             };
 75 
 76             small.onmouseleave = function () {
 77                 hide(mask);
 78                 hide(big);
 79             };
 80             //2.老三步和新五步(黄盒子跟随移动)
 81             //绑定的事件是onmousemove事件,而事件源是small
 82             // (只要在小盒子上移动1像素,黄盒子也要跟随)
 83             small.onmousemove = function (event) {
 84                 //想移动黄盒子,必须知道鼠标在small中的位置。
 85                 // x作为mask的left值,y作mask的top值。
 86 
 87                 //新五步
 88                 event=event || window.event;
 89                 var pagex = event.pageX || scroll().left + event.clientX;
 90                 var pagey = event.pageY || scroll().top + event.clientY;
 91                 //让鼠标在黄盒子最中间
 92                 var x = pagex - box.offsetLeft - mask.offsetWidth/2;
 93                 var y = pagey - box.offsetTop - mask.offsetHeight/2;
 94                 //限制黄盒子范围
 95                 //left范围大于0,小于小盒子宽-mask的宽
 96                 if(x<0){
 97                     x=0;
 98                 }else if(x>small.offsetWidth-mask.offsetWidth){
 99                     x=small.offsetWidth-mask.offsetWidth
100                 }
101                 if(y<0){
102                     y=0;
103                 }else if(y>small.offsetHeight-mask.offsetHeight){
104                     y=small.offsetHeight-mask.offsetHeight
105                 }
106 
107                 //移动黄盒子
108                 mask.style.left =  x + "px";
109                 mask.style.top =  y + "px";
110 
111                 //右侧的大图片,等比例移动
112                 //    大图片/大盒子 = 小图片/mask盒子
113                 //    大图片走的距离/mask走的距离 = (大图片-大盒子)/(小图片-黄盒子)
114 
115                 //好理解
116                 // var bili = (bigImg.offsetWidth-big.offsetWidth)/(small.offsetWidth-mask.offsetWidth);
117 
118                 var bili = bigImg.offsetWidth/small.offsetWidth;
119 
120 
121                 var xx = bili * x;
122                 var yy = bili * y;
123 
124                 bigImg.style.marginTop = -yy + "px";
125                 bigImg.style.marginLeft = -xx + "px";
126 
127 
128             }
129 
130         }
131     </script>
132 </head>
133 <body>
134 <div class="box">
135     <div class="small">
136         <img src="images/001.jpg" alt=""/>
137         <div class="mask"></div>
138     </div>
139     <div class="big">
140         <img src="images/0001.jpg" alt=""/>
141     </div>
142 </div>
143 </body>
144 </html>
demojs

  

原文地址:https://www.cnblogs.com/zhangkui/p/8856164.html