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 相关文章推荐
jQuery 插件 将this下的div轮番显示
Apr 09 Javascript
jQuery学习总结之元素的相对定位和选择器(持续更新)
Apr 26 Javascript
javascript中方便增删改cookie的一个类
Oct 11 Javascript
js获得鼠标的坐标值的方法
Mar 13 Javascript
asp.net刷新本页面的六种方法总结
Jan 07 Javascript
select下拉框插件jquery.editable-select详解
Jan 22 Javascript
ECMAScript6--解构
Mar 30 Javascript
JS实现复选框的全选和批量删除功能
Apr 05 Javascript
react 实现页面代码分割、按需加载的方法
Apr 03 Javascript
详解javascript对数组和json数组的操作
Apr 15 Javascript
JS实现纵向轮播图(初级版)
Jan 18 Javascript
快速解决Vue、element-ui的resetFields()方法重置表单无效的问题
Aug 12 Javascript
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
加强版phplib的DB类
2008/03/31 PHP
使用GD库生成带阴影文字的图片
2015/03/27 PHP
Laravel 5.3 学习笔记之 错误&amp;日志
2016/08/28 PHP
ThinkPHP框架获取最后一次执行SQL语句及变量调试简单操作示例
2018/06/13 PHP
js刷新框架子页面的七种方法代码
2008/11/20 Javascript
基于jquery的监控数据是否发生改变
2011/04/11 Javascript
解析prototype,JQuery中跳出each循环的方法
2013/12/12 Javascript
JS获取鼠标相对位置的方法
2016/09/20 Javascript
JS简单实现表格排序功能示例
2016/12/20 Javascript
微信小程序 es6-promise.js封装请求与处理异步进程
2017/06/12 Javascript
jQuery实现所有验证通过方可提交的表单验证
2017/11/21 jQuery
基于Vue的SPA动态修改页面title的方法(推荐)
2018/01/02 Javascript
vue中如何实现pdf文件预览的方法
2018/07/12 Javascript
JavaScript偏函数与柯里化实例详解
2019/03/27 Javascript
Node.js 实现远程桌面监控的方法步骤
2019/07/02 Javascript
Vue extend的基本用法(实例详解)
2019/12/09 Javascript
Vue this.$router.push(参数)实现页面跳转操作
2020/09/09 Javascript
[04:19]DOTA2完美大师赛第四天精彩集锦
2017/11/26 DOTA
python计算最小优先级队列代码分享
2013/12/18 Python
python检测远程服务器tcp端口的方法
2015/03/14 Python
Python使用numpy产生正态分布随机数的向量或矩阵操作示例
2018/08/22 Python
Python实现的IP端口扫描工具类示例
2019/02/15 Python
Python3.5面向对象编程图文与实例详解
2019/04/24 Python
Python3+Appium安装使用教程
2019/07/05 Python
Pytorch 之修改Tensor部分值方式
2019/12/27 Python
详解Python中@staticmethod和@classmethod区别及使用示例代码
2020/12/14 Python
加拿大知名的国际儿童品牌:Hatley
2016/11/09 全球购物
Coggles美国/加拿大:高级国际时装零售商
2018/10/23 全球购物
英国最受欢迎的价格比较网站之一:MoneySuperMarket
2018/12/19 全球购物
安全员岗位职责
2013/11/11 职场文书
如何写求职信
2014/05/24 职场文书
激励口号大全
2014/06/17 职场文书
通报表扬范文
2015/01/17 职场文书
春季运动会加油词
2015/07/18 职场文书
宣传稿格式范文
2015/07/23 职场文书
Python Parser的用法
2021/05/12 Python