原生JS实现九宫格拼图

摘要:
实现这个案例,需要考虑到鼠标的拖拽效果(onmousedown/onmousemove/mouseup)拖拽分解:按下鼠标---->移动鼠标----->松开鼠标1.给目标元素添加onmousedown事件,拖拽的前提是在目标元素按下鼠标左键2.当onmousedown事件发生后,此刻给document添加onmousemove事件,意味着此刻鼠标在网页的移动都将改变元素的位置3.在onmousem

实现这个案例,需要考虑到鼠标的拖拽效果(onmousedown/onmousemove/mouseup)

拖拽分解:

按下鼠标---->移动鼠标----->松开鼠标

1.给目标元素添加onmousedown事件,拖拽的前提是在目标元素按下鼠标左键

2.当onmousedown事件发生后,此刻给document添加onmousemove事件,意味着此刻鼠标在网页的移动都将改变元素的位置

3.在onmousemove事件中,设定目标元素的left和top

公式:

目标元素的left = 鼠标的clienX - (鼠标和元素的横坐标差,即offsetX)

目标元素的top = 鼠标的clientY -(鼠标和元素的纵坐标差,即offsetY)

4.当onmousedown发生以后,此刻给document添加onmouseup事件,意味着此刻鼠标在网页的任意位置松开鼠标,都会放弃拖拽效果,在onmouseup事件中,取消document的onmousemove事件即可

当然这个小案例也用到了关于DOM元素系列的操作,对于新手而言,算一个很好的综合训练

<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>九宫格</title>
    <style>#box {
            height: 300px;
             300px;
            position: relative;
            background-color: brown;
            margin: 10px auto;
        }

        span {
             100px;
            height: 100px;
            position: absolute;
            font-size: 50px;
            text-align: center;
            line-height: 100px;
            color: #FFF;
            user-select: none;
            cursor: pointer;
            font-weight: bolder;
        }

        #one {
            top: 0;
            left: 0;
            background: url(./5.jpg);
            background-size: 100% 100%;
        }

        #two {
            top: 0;
            left: 100px;
            background: url(./7.jpg);
            background-size: 100% 100%;
        }

        #three {
            top: 0;
            left: 200px;
            background: url(./9.jpg);
            background-size: 100% 100%;
        }

        #four {
            top: 100px;
            left: 0;
            background: url(./1.jpg);
            background-size: 100% 100%;
        }

        #five {
            top: 100px;
            left: 100px;
            background: url(./2.jpg);
            background-size: 100% 100%;
        }

        #six {
            top: 100px;
            left: 200px;
            background: url(./4.jpg);
            background-size: 100% 100%;
        }

        #seven {
            top: 200px;
            left: 0;
            background: url(./3.jpg);
            background-size: 100% 100%;
        }

        #eight {
            top: 200px;
            left: 100px;
            background: url(./6.jpg);
            background-size: 100% 100%;
        }

        #nine {
            top: 200px;
            left: 200px;
            background: url(./8.jpg);
            background-size: 100% 100%;
        }

        #box .cBox {
            position: absolute;
        }
    </style>
</head>

<body>
    <div id="box">
        <span id="one"></span>
        <span id="two"></span>
        <span id="three"></span>
        <span id="four"></span>
        <span id="five"></span>
        <span id="six"></span>
        <span id="seven"></span>
        <span id="eight"></span>
        <span id="nine"></span>
    </div>
</body>
<script>
    var oBox = document.getElementById("box")
    var box = document.querySelectorAll("span");

    functionBox(boxName) {
        boxName.onmousedown = function(eve) {
            var e = eve ||window.event;
            var cSpan = document.createElement("span");
            cSpan.style.background =getComputedStyle(boxName).background;
            cSpan.style.top = boxName.offsetTop + "px";
            cSpan.style.left = boxName.offsetLeft + "px";
            cSpan.className = "cBox"oBox.appendChild(cSpan)
            var offsetX = e.pageX -cSpan.offsetLeft;
            var offsetY = e.pageY -cSpan.offsetTop;
            document.onmousemove = function(eve) {
                var e = eve ||window.event;
                cSpan.style.left = e.pageX - offsetX + "px";
                cSpan.style.top = e.pageY - offsetY + "px";
            }
            document.onmouseup = function() {
                document.onmousemove = null;
                var spans = oBox.getElementsByTagName("span")
                var minSpan = null;
                var min = 1000;
                for (var i = 0; i < spans.length - 1; i++) {
                    var span =spans[i];
                    var dis =distance(cSpan, span);
                    if (dis <=min) {
                        min =dis;
                        minSpan =span;
                    }
                }
                var lsColor =getComputedStyle(minSpan).background;
                minSpan.style.background =getComputedStyle(boxName).background;
                boxName.style.background =lsColor;
                oBox.removeChild(cSpan);
                document.onmouseup = null;
            }
            return false;
        }
    }

    functiondistance(span1, span2) {
        var a = span1.offsetLeft -span2.offsetLeft;
        var b = span1.offsetTop -span2.offsetTop;
        var c = Math.sqrt(a * a + b *b);
        returnc;
    }
    for (var i = 0; i < box.length; i++) {
        Box(box[i]);
    }
</script>
</html>

ps:案例中的图片没有办法上传,想要的同学可以自行百度

完整效果:

原生JS实现九宫格拼图第1张

免责声明:内容来源于网络,仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇员工管理系统(完整版)下拉菜单下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

利用js获取图片尺寸与图片大小(高度与宽度)

利用获取图片尺寸与图片大小(高度与宽度)要注意一点的是要等 图片加载完成后才能js 获取图片宽度与高度的,所以要判断在readystate=="complete"的状态下获取大小,如果是利用file上传的话,每次都要点击清除 image=new image(); imgage.width与高度哦。<!doctype html public "-//w...

gulp搭建前端自动化开发环境

gulp是基于node编写的一个构建工具,有4个主要的API: gulp.src() - 输出符合条件的文件 gulp.dest() - 能被pipe进来,并写文件 gulp.task() - 定义任务 gulp.watch() - 监听文件   首先,默认node环境已经安装; 全局安装gulp: npm i -g gulp 新建文件夹,npm初始化:n...

js回调与异步加载的用法

以前还是菜鸟的时候(虽然现在依然很菜 -_-|| )对异步加载与回调函数的技术无比向往,但也一直没有使用过,这次因为页面逻辑太过复杂,一堆请求逻辑,如果还是用顺序请求,页面的速度。。。 领导又要挠头了。 人是被逼出来的,所以去研究下异步与回调,以下只是本人自己见解啊,用来自己回忆的,不喜勿喷: 额。。。额。。。算了,打字好麻烦,直接上代码吧,又不是看不懂...

js运算符!

算术运算符(如下) 1.“+” 加 2.“-” 减 3“*” 乘 4.“/” 除 5.“%” 取余 例:var i=3,j=8; document.write(i+j); 加 document.write(i-j); 减 document.write(i*j); 乘 document.write(i/j); 除 document.write(i%j); 取...

[WPF] VisualBrush 中的布局

今天插一篇随笔。说一说上周五遇到的一个布局问题,问题大概是这样的:需要在一个快区域上添加一张透明的背景图片,由于区域较大、并且宽高都不是固定大小,图片较小 所以图片需要居中显示。除此之外还需要在图片的透明部分添加一个非透明的纯色。 比如:最终的效果图、如下图所示: 当然如果只是为了实现这种效果、实现方案有多种,至少有三大类: 1、嵌套两个控件、分别应用纯色...

[转载]JS拖动技术 关于setCapture

<script type="text/javascript"><!--window.onload=function(){objDiv = document.getElementByIdx('drag');drag(objDiv);}; function drag(dv){dv.onmousedown=function(e){var d=...