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完成代码前最好对其做5件事
Apr 07 Javascript
密码框显示提示文字jquery示例
Aug 29 Javascript
Vue.js实现拖放效果的实例
Sep 30 Javascript
关于Vue.js一些问题和思考学习笔记(1)
Dec 02 Javascript
jQuery中Datatables增加跳转到指定页功能
Feb 08 Javascript
利用Javascript实现简单的转盘抽奖
Feb 13 Javascript
ES6新增的math,Number方法
Aug 06 Javascript
浅谈ES6新增的数组方法和对象
Aug 08 Javascript
node和vue实现商城用户地址模块
Dec 05 Javascript
使用react render props实现倒计时的示例代码
Dec 06 Javascript
浅谈Angular单元测试总结
Mar 22 Javascript
微信接入之获取用户头像的方法步骤
Sep 23 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
西德产收音机
2021/03/01 无线电
如何隐藏你的.php文件
2007/01/04 PHP
php查询操作实现投票功能
2016/05/09 PHP
Yii数据模型中rules类验证器用法分析
2016/07/15 PHP
jquery与google map api结合使用 控件,监听器
2010/03/04 Javascript
13个绚丽的Jquery 界面设计网站推荐
2010/09/28 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
jQuery学习笔记之jQuery构建函数的7种方法
2014/06/03 Javascript
JSON.stringify转换JSON时日期时间不准确的解决方法
2014/08/08 Javascript
jQuery提示效果代码分享
2014/11/20 Javascript
JavaScript中的getMilliseconds()方法使用详解
2015/06/10 Javascript
javascript中alert()与console.log()的区别
2015/08/26 Javascript
jQuery实现滚动切换的tab选项卡效果代码
2015/08/26 Javascript
基于Vue.js的表格分页组件
2016/05/22 Javascript
jQuery焦点图轮播插件KinSlideshow用法分析
2016/06/08 Javascript
jQuery序列化表单成对象的简单实现
2016/11/29 Javascript
bootstrap实现动态进度条效果
2017/03/08 Javascript
jQuery中animate()的使用方法及解决$(”body“).animate({“scrollTop”:top})不被Firefox支持的问题
2017/04/04 jQuery
详解vue 模版组件的三种用法
2017/07/21 Javascript
Bootstrap Fileinput 4.4.7文件上传实例详解
2018/07/25 Javascript
Vue实现可移动水平时间轴
2020/06/29 Javascript
通过实例解析chrome如何在mac环境中安装vue-devtools插件
2020/07/10 Javascript
python将图片文件转换成base64编码的方法
2015/03/14 Python
Python中的if、else、elif语句用法简明讲解
2016/03/11 Python
python对execl 处理操作代码
2020/06/22 Python
python批量处理多DNS多域名的nslookup解析实现
2020/06/28 Python
Lululemon英国官网:加拿大瑜伽服装品牌
2019/01/14 全球购物
欧缇丽加拿大官方网站:Caudalie加拿大
2019/07/18 全球购物
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
医学生实习自荐信
2013/10/01 职场文书
销售心得体会
2014/01/02 职场文书
招聘专员岗位职责
2014/03/07 职场文书
会计电算化专业自荐信
2014/03/15 职场文书
大学生第一学年自我鉴定
2014/09/12 职场文书
六查六看自查报告
2014/10/14 职场文书
公司员工宿舍管理制度
2015/08/07 职场文书