JavaScript实现九宫格拖拽效果


Posted in Javascript onJune 28, 2022

本文实例为大家分享了JavaScript实现九宫格拖拽效果的具体代码,供大家参考,具体内容如下

关于一些拼图游戏什么的,见人家效果做的不错,参考下别人写的代码,我也尝试着做了个。

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <title></title>
        <style type="text/css">
            body{
                margin: 0;
                padding: 0;
            }
            #wrap{
                position: relative;
            }
            #wrap div{
                position: absolute;
                width: 100px;
                height: 100px;
                font-size: 50px;
                text-align: center;
                line-height: 100px;
                border-radius: 10px;
            }
        </style>
    </head>
    <body>
        <div id="wrap"></div>
        <script type="text/javascript">
            //生成结构
            var oWrap = document.getElementById("wrap");
            var mt = ml = 10;
            for(var i = 0; i < 3; i++){
                for(var j = 0; j < 3; j++){
                    var oDiv = document.createElement("div");
                    oWrap.appendChild(oDiv);
                    oDiv.style.top = i*(oDiv.offsetHeight + mt) + "px";
                    oDiv.style.left = j*(oDiv.offsetWidth + ml) + "px";
                    oDiv.style.backgroundColor = "rgb("+Math.floor(Math.random()*256)+","+Math.floor(Math.random()*256)+","+Math.floor(Math.random()*256)+")"
                }
            }
            
            var arr = "ABCDEFGHI";
            
            var aItems = oWrap.children;
            var len = aItems.length;
            
            for(var i = 0; i < aItems.length; i++){
                aItems[i].innerHTML = arr[i];
            }
            //拖拽及交换位置
            
            for(var i = 0; i < aItems.length; i++){
                aItems[i].onmousedown = function(e){
                    var evt = e || event;
                    var x = evt.offsetX;
                    var y = evt.offsetY;
                    /*var x = evt.clientX - this.offsetLeft - oWrap.offsetLeft;
                    var y = evt.clientY - this.offsetTop - oWrap.offsetTop;*/
                    var _this = this;
                    
                    var cloneNode = this.cloneNode();
                    cloneNode.style.border = '1px dashed #cecece';
                    this.style.zIndex = 1;
                    oWrap.replaceChild(cloneNode,this);
                    oWrap.appendChild(this);
                    
                    document.onmousemove = function(e){
                        var evt = e || event;
                        var _left = evt.clientX - x - oWrap.offsetLeft;
                        var _top = evt.clientY - y - oWrap.offsetTop;
                        _this.style.left = _left + "px";
                        _this.style.top = _top + "px";
                        
                        return false;
                    }
                    
                    document.onmouseup = function(){
                        
                        //交换位置
                        var disArr = [];
                        var newArr = [];
                        console.log(aItems.length);
                        for(var i = 0; i < len; i++){
                            var disX = _this.offsetLeft - aItems[i].offsetLeft;
                            var disY = _this.offsetTop - aItems[i].offsetTop;
                            var dis = Math.sqrt(Math.pow(disX,2)+Math.pow(disY,2));
                            disArr.push(dis);
                            newArr.push(dis);
                        }
                        disArr.sort(function(a,b){
                            return a-b;
                        })
                        var minIndex = newArr.indexOf(disArr[0]);
                        
                        _this.style.left = aItems[minIndex].style.left;
                        _this.style.top = aItems[minIndex].style.top;
                        aItems[minIndex].style.left = cloneNode.style.left;
                        aItems[minIndex].style.top = cloneNode.style.top;
                        oWrap.removeChild(cloneNode);
                        document.onmousemove = null;
                        document.onmouseup = null;
                    }
                }
            }
            /*var arr = [45,32,11,90];
            var minVal = Math.min.apply(null,arr);
            var minIndex = arr.indexOf(minVal);
            console.log(minVal,arr,minIndex);*/
        </script>
    </body>
</html>

这是效果图

JavaScript实现九宫格拖拽效果

虽说实现了效果,但我写的还是不太严谨,还有诸多bug,比如上边做边没距离,实际写的话还要加上这个距离,即使距离为0,还有就是我发现拖拽的时候,如果使用qq截图的话,克隆的那个小方块没办法消失,只得重新刷新页面,有没有大佬解决下。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。


Tags in this post...

Javascript 相关文章推荐
js 操作符实例代码
Oct 24 Javascript
JS按位非(~)运算符与~~运算符的理解分析
Jul 31 Javascript
主页面中的两个iframe实现鼠标拖动改变其大小
Apr 16 Javascript
jquery操作select详解(取值,设置选中)
Feb 07 Javascript
基于AngularJS+HTML+Groovy实现登录功能
Feb 17 Javascript
基于Bootstrap漂亮简洁的CSS3价格表(附源码下载)
Feb 28 Javascript
vuejs绑定class和style样式
Apr 11 Javascript
详解require.js配置路径的用法和css的引入
Sep 06 Javascript
Element UI 自定义正则表达式验证方法
Sep 04 Javascript
Echarts动态加载多条折线图的实现代码
May 24 Javascript
微信小程序 函数防抖 解决重复点击消耗性能问题实现代码
Sep 12 Javascript
vue3 自定义图片放大器效果的示例代码
Jul 23 Vue.js
JS实现简单九宫格抽奖
Jun 28 #Javascript
Vite + React从零开始搭建一个开源组件库
Jun 25 #Javascript
React自定义hook的方法
Jun 25 #Javascript
小程序实现侧滑删除功能
Jun 25 #Javascript
小程序自定义轮播图圆点组件
Jun 25 #Javascript
微信小程序实现轮播图指示器
Jun 25 #Javascript
create-react-app开发常用配置教程
Jun 25 #Javascript
You might like
一个用mysql_odbc和php写的serach数据库程序
2006/10/09 PHP
轻松修复Discuz!数据库
2008/05/03 PHP
需要注意的几个PHP漏洞小结
2012/02/05 PHP
PHP整数取余返回负数的相关解决方法
2014/05/15 PHP
php中PDO方式实现数据库的增删改查
2015/05/17 PHP
PHP中的print_r 与 var_dump 输出数组
2016/06/13 PHP
jQuery的一些注意
2006/12/06 Javascript
jquery $.ajax()取xml数据的小问题解决方法
2010/11/20 Javascript
jq选项卡鼠标延迟的插件实例
2013/05/13 Javascript
文字溢出实现溢出的部分再放入一个新生成的div中具体代码
2013/05/17 Javascript
jquery解析xml字符串示例分享
2014/03/25 Javascript
javascript计时器详解
2015/02/28 Javascript
JavaScript实现列表分页功能特效
2015/05/15 Javascript
简介JavaScript中toUpperCase()方法的使用
2015/06/06 Javascript
SpringBoot+Vue前后端分离,使用SpringSecurity完美处理权限问题的解决方法
2018/01/09 Javascript
vue2.0 computed 计算list循环后累加值的实例
2018/03/07 Javascript
解决layui轮播图有数据不显示的情况
2019/09/16 Javascript
微信小程序实现星级评价
2019/11/20 Javascript
vue多个元素的样式选择器问题
2019/11/29 Javascript
vue select 获取value和lable操作
2020/08/28 Javascript
python通过exifread模块获得图片exif信息的方法
2015/03/16 Python
Python with用法实例
2015/04/14 Python
python使用PIL模块实现给图片打水印的方法
2015/05/22 Python
Python2.7编程中SQLite3基本操作方法示例
2017/08/09 Python
python中实现指定时间调用函数示例代码
2017/09/08 Python
numpy linalg模块的具体使用方法
2019/05/26 Python
Python实现带下标索引的遍历操作示例
2019/05/30 Python
Python Numpy计算各类距离的方法
2019/07/05 Python
python如何删除文件中重复的字段
2019/07/16 Python
Django models.py应用实现过程详解
2019/07/29 Python
python 并发编程 非阻塞IO模型原理解析
2019/08/20 Python
python中threading和queue库实现多线程编程
2021/02/06 Python
HTML5 canvas画图并保存成图片的jcanvas插件
2014/01/17 HTML / CSS
英国当代时尚和街头服饰店:18montrose
2018/12/15 全球购物
2016年全国助残日活动总结
2016/04/01 职场文书
英文诗歌翻译方法(赏析)
2019/08/16 职场文书