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动画和停止动画实例代码
Mar 01 Javascript
无缝滚动js代码通俗易懂(自写)
Jun 19 Javascript
jQuery获得页面元素的绝对/相对位置即绝对X,Y坐标
Mar 06 Javascript
node.js中的Socket.IO使用实例
Nov 04 Javascript
js全选按钮的实现方法
Nov 17 Javascript
JS与HTML结合使用marquee标签实现无缝滚动效果代码
Jul 05 Javascript
JS常用加密编码与算法实例总结
Dec 22 Javascript
jQuery实现页面倒计时并刷新效果
Mar 13 Javascript
bootstrap常用组件之头部导航实现代码
Apr 20 Javascript
JavaScript中使用import 和require打包后实现原理分析
Mar 07 Javascript
json 带斜杠时如何解析的实现
Aug 12 Javascript
解决Vue打包上线之后部分CSS不生效的问题
Nov 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
phpmyadmin中配置文件现在需要绝密的短语密码的解决方法
2007/02/11 PHP
php删除页面记录 同时刷新页面 删除条件用GET方式获得
2012/01/10 PHP
Yii+MYSQL锁表防止并发情况下重复数据的方法
2016/07/14 PHP
PHP判断用户是否已经登录(跳转到不同页面或者执行不同动作)
2016/09/22 PHP
动态获取复选框checkbox选中个数的jquery代码
2013/06/25 Javascript
javascript实现倒计时N秒后网页自动跳转代码
2014/12/11 Javascript
js弹出框、对话框、提示框、弹窗实现方法总结(推荐)
2016/05/31 Javascript
BootStrap入门教程(二)之固定的内置样式
2016/09/19 Javascript
JS实现动画兼容性的transition和transform实例分析
2016/12/13 Javascript
AngularJS ionic手势事件的使用总结
2017/08/09 Javascript
vuex 的简单使用
2018/03/22 Javascript
ES6的解构赋值实例详解
2019/05/06 Javascript
React+TypeScript+webpack4多入口配置详解
2019/08/08 Javascript
微信小程序转发事件实现解析
2019/10/22 Javascript
让python的Cookie.py模块支持冒号做key的方法
2010/12/28 Python
Python单元测试框架unittest简明使用实例
2015/04/13 Python
python3.6下Numpy库下载与安装图文教程
2019/04/02 Python
python实现抖音点赞功能
2019/04/07 Python
Python分支语句与循环语句应用实例分析
2019/05/07 Python
Python实现操纵控制windows注册表的方法分析
2019/05/24 Python
python用win32gui遍历窗口并设置窗口位置的方法
2019/07/26 Python
关于matplotlib-legend 位置属性 loc 使用说明
2020/05/16 Python
使用keras实现非线性回归(两种加激活函数的方式)
2020/07/05 Python
HTML5地理定位_动力节点Java学院整理
2017/07/12 HTML / CSS
Bogner美国官网:滑雪服中的”Dior”
2018/01/30 全球购物
英国最受信任的在线眼镜商之一:Fashion Eyewear
2019/10/31 全球购物
香港莎莎官网Sasa.com:亚洲著名国际化妆品商城
2019/11/10 全球购物
几个Shell Script面试题
2014/04/18 面试题
销售行业个人求职自荐信
2013/09/25 职场文书
机电一体化专业应届本科生求职信
2013/09/27 职场文书
会议活动邀请函
2014/01/27 职场文书
工程专业应届生求职信
2014/02/19 职场文书
企业安全生产演讲稿
2014/05/09 职场文书
大型活动组织方案
2014/05/10 职场文书
三八红旗手先进事迹材料
2014/05/13 职场文书
护士医德医风心得体会
2016/01/25 职场文书