# offset 系列属性

74 阅读1分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路

1、模仿登录界面拖动登录框

<style>
    * {
        margin: 0 auto;
        padding: 0 auto;
    }
    div {
        position: absolute;
        width: 100%;
        height: 780px;
        text-align: center;
        padding-top: 20px;
    }
    .mask {
        display: none;
        position: absolute;
        top: 0;
        left: 0;
        background-color: rgba(0, 0, 0, 0.2);
    }
    div a {
        text-decoration: none;
        color: #000;
    }
    .login {
        display: none;
        position: absolute;
        top: 50%;
        left: 50%;
        width: 200px;
        height: 200px;
        background-color: #fff;
        transform: translate(-50%, -50%);
    }
    .login span {
        position: absolute;
        top: -10px;
        left: 190px;
        display: inline-block;
        width: 30px;
        height: 30px;
    }
    .login span img {
        width: 30px;
        height: 30px;
    }
</style>
<body>
<div class="mask">
</div>
<div>
    <a href="javascript:;">点击进行登录</a>
    <div class="login">
        登录
        <span><img src="images/afternoon.png" alt=""></span>
    </div>
</div>
<script>
    var cli = document.querySelector('a');
    var mask = document.querySelector('.mask');
    var login = document.querySelector('.login');
    cli.addEventListener('click', function () {
        mask.style.display = 'block';
        login.style.display = 'block';
    })
    var btn = document.querySelector('.login').querySelector('img');
    console.log(btn);
    btn.addEventListener('click', function () {
        mask.style.display = 'none';
        login.style.display = 'none';
    })
    var x, y, x1, y1, x2, y2;
    login.addEventListener('mousedown', function (ev) {
        x = ev.pageX - login.offsetLeft;
        y = ev.pageY - login.offsetTop;
        document.addEventListener('mousemove', move);
        function move(evt) {
            login.style.left = evt.pageX - x + 'px';
            login.style.top = evt.pageY - y + 'px';
        }
        document.addEventListener('mouseup', function (ev1) {
            document.removeEventListener('mousemove', move);
        })
    })
</script>
</body>

2、模仿淘宝鼠标放在小图上可以查看大图

<style>
    body {
        margin: 0;
    }

    img {
        width: 300px;
        height: 200px;
        margin: 0;
        padding: 0;
    }

    .mask {
        display: none;
        position: absolute;
        top: 0;
        left: 0;
        width: 100px;
        height: 100px;
        background-color: yellow;
        opacity: 0.7;
        //最后这句可太重要了,功能是跟鼠标事件拜拜,不然鼠标移动事件会导致mask图层一直闪动。
        pointer-events: none;
    }
    .big {
        position: absolute;
        top: 0;
        left: 350px;
        width: 450px;
        height: 300px;
        display: none;
        overflow: hidden;
        border: 1px solid #4c4c4c;
    }
    .big img {
        position: absolute;
        top: 0;
        left: 350px;
        width: 600px;
        height: 400px;
    }
</style>

<body>
<div>
    <img src="images/haha.JPG" alt="">
    <div class="mask"></div>
    <div class="big">
        <img src="images/haha.JPG" alt=""></div>
</div>
<script>
    var pic = document.querySelector('img');
    var mask = document.querySelector('.mask');
    var bigpic = document.querySelector('.big');
    var bigimage = document.querySelector('.big').querySelector('img');
    pic.addEventListener('mouseover', function (ev) {
        mask.style.display = 'block';
        bigpic.style.display = 'block';
        pic.addEventListener('mousemove', function (ev1) {
            var maskX, maskY;
            if (ev1.pageX - mask.offsetWidth / 2 < 0) {
                maskX = 0;
            } else if (ev1.pageX - mask.offsetWidth / 2 > pic.offsetWidth - mask.offsetWidth) {
                maskX = pic.offsetWidth - mask.offsetWidth;
            } else {
                maskX = ev1.pageX - mask.offsetWidth / 2;
            }
            if (ev1.pageY - mask.offsetHeight / 2 < 0) {
                maskY = 0;
            } else if (ev1.pageY - mask.offsetHeight / 2 > pic.offsetHeight - mask.offsetHeight) {
                maskY = pic.offsetHeight - mask.offsetHeight;
            } else {
                maskY = ev1.pageY - mask.offsetHeight / 2;
            }
            mask.style.left = maskX + 'px';
            mask.style.top = maskY + 'px';
            /*bigimage的x轴最大移动距离=bigimage宽-bigpic宽,mask的x轴最大移动距离=pic宽-mask宽;这二者需成比例变动。*/          
            bigimage.style.left = -maskX / (pic.offsetWidth - mask.offsetWidth) * (bigimage.offsetWidth - bigpic.offsetWidth) + 'px';
            bigimage.style.top = -maskY / (pic.offsetHeight - mask.offsetHeight) * (bigimage.offsetHeight - bigpic.offsetHeight) + 'px';
        })
    })
    pic.addEventListener('mouseout', function () {
        mask.style.display = 'none';
        bigpic.style.display = 'none';
    })
</script>
</body>