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 相关文章推荐
javascript StringBuilder类实现
Dec 22 Javascript
javascript 放大镜效果js组件 qsoft.PopBigImage.v0.35 加入了chrome支持
Apr 07 Javascript
javascript的日期对象、数组对象、二维数组使用说明
Dec 22 Javascript
JQuery中解决重复动画的方法
Oct 17 Javascript
vue.js学习笔记之绑定style样式和class列表
Oct 31 Javascript
vue-cli如何快速构建vue项目
Apr 26 Javascript
详解微信第三方小程序代开发
Jun 23 Javascript
Vue Transition实现类原生组件跳转过渡动画的示例
Aug 19 Javascript
Vue.js 的移动端组件库mint-ui实现无限滚动加载更多的方法
Dec 23 Javascript
vue中前进刷新、后退缓存用户浏览数据和浏览位置的实例讲解
Sep 21 Javascript
Vue中的基础过渡动画及实现原理解析
Dec 04 Javascript
ES11屡试不爽的新特性,你用上了几个
Oct 21 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
支持中文的PHP按字符串长度分割成数组代码
2015/05/17 PHP
php+layui数据表格实现数据分页渲染代码
2019/10/26 PHP
javascript模拟实现C# String.format函数功能代码
2013/11/25 Javascript
jquery中子元素和后代元素的区别示例介绍
2014/04/02 Javascript
jQuery中:submit选择器用法实例
2015/01/03 Javascript
jQuery获得指定元素坐标的方法
2015/04/14 Javascript
JavaScript 深层克隆对象详解及实例
2016/11/03 Javascript
jquery使用EasyUI Tree异步加载JSON数据(生成树)
2017/02/11 Javascript
基于angular2 的 http服务封装的实例代码
2017/06/29 Javascript
使用Vue自定义数字键盘组件(体验度极好)
2017/12/19 Javascript
详解Vue.js中.native修饰符
2018/04/24 Javascript
jquery实现弹窗(系统提示框)效果
2019/12/10 jQuery
jquery实现聊天机器人
2020/02/08 jQuery
vant组件中 dialog的确认按钮的回调事件操作
2020/11/04 Javascript
使用Python进行稳定可靠的文件操作详解
2013/12/31 Python
Python实现序列化及csv文件读取
2020/01/19 Python
python3 logging日志封装实例
2020/04/08 Python
Python通过format函数格式化显示值
2020/10/17 Python
巧用CSS3 border实现图片遮罩效果代码
2012/04/09 HTML / CSS
CSS3制作炫酷的下拉菜单及弹起式选单的实例分享
2016/05/17 HTML / CSS
YOINS官网:时尚女装网上购物
2017/03/17 全球购物
大专生简历的自我评价
2013/11/26 职场文书
职业生涯规划怎么写
2013/12/29 职场文书
员工工作表现评语
2014/04/26 职场文书
诚信的演讲稿范文
2014/05/12 职场文书
会计学习心得体会
2014/09/09 职场文书
祖国在我心中演讲稿600字
2014/09/23 职场文书
教师对照四风自我剖析材料
2014/09/30 职场文书
乡镇党员群众路线教育实践活动对照检查材料思想汇报
2014/10/05 职场文书
热情服务标语
2014/10/07 职场文书
2015年世界环境日活动总结
2015/02/11 职场文书
世界气象日活动总结
2015/02/27 职场文书
省级三好学生主要事迹材料
2015/11/03 职场文书
教育教学工作反思
2016/02/24 职场文书
Python使用UDP实现720p视频传输的操作
2021/04/24 Python
详解MySQL多版本并发控制机制(MVCC)源码
2021/06/23 MySQL