92JavaScript:原生位置交换

九宫格,里面有九张图片,用鼠标拖动其中1张图片置于另1张图片之上时并松开鼠标后,它俩的位置交换。**html 代码**

```html:run<!doctype html><html><head>    <meta charset="utf-8">    <title>九宫格--位置交换</title>    <style type="text/css">        * {            padding: 0;            margin: 0;            list-style: none;        }

        ul {            width: 480px;            height: 480px;            padding: 5px;            background: #CFC;            position: relative;            margin: 100px auto;        }

        li {            width: 150px;            height: 150px;            margin: 5px;            cursor: move;            -webkit-user-select: none;            background: #FF9;            overflow: hidden;            float: left;        }

        img {            width: 100%;            height: 100%;            border: none;        }

    </style></head>

<body><ul>    <li><img src="http://www.qdfuns.com/misc.php?mod=attach&genre=editor&aid=46ac759c68ba5e51fc613502729240cf"></li>    <li><img src="http://www.qdfuns.com/misc.php?mod=attach&genre=editor&aid=46ac759c68ba5e51fc613502729240cf"></li>    <li><img src="http://www.qdfuns.com/misc.php?mod=attach&genre=editor&aid=46ac759c68ba5e51fc613502729240cf"></li>    <li><img src="http://www.qdfuns.com/misc.php?mod=attach&genre=editor&aid=46ac759c68ba5e51fc613502729240cf"></li>    <li><img src="http://www.qdfuns.com/misc.php?mod=attach&genre=editor&aid=46ac759c68ba5e51fc613502729240cf"></li>    <li><img src="http://www.qdfuns.com/misc.php?mod=attach&genre=editor&aid=46ac759c68ba5e51fc613502729240cf"></li>    <li><img src="http://www.qdfuns.com/misc.php?mod=attach&genre=editor&aid=46ac759c68ba5e51fc613502729240cf"></li>    <li><img src="http://www.qdfuns.com/misc.php?mod=attach&genre=editor&aid=46ac759c68ba5e51fc613502729240cf"></li>    <li><img src="http://www.qdfuns.com/misc.php?mod=attach&genre=editor&aid=46ac759c68ba5e51fc613502729240cf"></li></ul></body></html>

<script>    /*第一步:准备方法*/    function on(ele, type, fn) {        if (ele.addEventListener) {            ele.addEventListener(type, fn, false);

        } else {            if (!ele["onEvent" + type]) {                ele["onEvent" + type] = [];                ele.attachEvent("on" + type, function () {                    run.call(ele)                });            }            var a = ele["onEvent" + type];            for (var i = 0; i < a.length; i++) {                if (a[i] == fn)return;            }            a.push(fn);        }    }

    function run() {        var e = window.event;        var type = e.type;        e.target = e.srcElement;        e.pageX = (document.documentElement.scrollLeft || document.body.scrollLeft) + e.clientX;        e.pageY = (document.documentElement.scrollTop || document.body.scrollTop) + e.clientY;        e.preventDefault = function () {            e.returnValue = false;        };        e.stopPropagation = function () {            e.cancelBubble = true;        };        var a = this["onEvent" + type];        if (a && a.length) {            for (var i = 0; i < a.length; i++) {                if (typeof a[i] == "function") {                    a[i].call(this, e);                } else {                    a.splice(i, 1);                    i--;                }            }        }    }

    function off(ele, type, fn) {        if (ele.removeEventListener) {            ele.removeEventListener(type, fn, false);        } else {            var a = ele["onEvent" + type];            if (a && a.length) {                for (var i = 0; i < a.length; i++) {                    if (a[i] == fn) {                        a[i] = null;                        return;                    }                }            }        }    }

    function processThis(fn, context) {        return function (e) {            fn.call(context, e);        };    }

    function EventEmitter() {    }    EventEmitter.prototype.on = function (type, fn) {        if (!this["emitter" + type]) {            this["emitter" + type] = [];        }        var a = this["emitter" + type];        for (var i = 0; i < a.length; i++) {            if (a[i] == fn)return this;        }        a.push(fn);        return this;    };    EventEmitter.prototype.run = function (type, e) {        var a = this["emitter" + type];        if (a && a.length) {            for (var i = 0; i < a.length; i++) {                if (typeof a[i] == "function") {                    a[i].call(this, e);                } else {                    a.splice(i, 1);                    i--;                }            }        }    };    EventEmitter.prototype.off = function (type, fn) {        var a = this["emitter" + type];        if (a && a.length) {            for (var i = 0; i < a.length; i++) {                if (a[i] == fn) {                    a[i] = null;                    break;                }            }        }        return this;    };

    function Drag(ele) {        this.x = null;        this.y = null;        this.mx = null;        this.my = null;        this.ele = ele;        this.obj = ele;        this.DOWN = processThis(this.down, this);        this.MOVE = processThis(this.move, this);        this.UP = processThis(this.up, this);        on(this.ele, "mousedown", this.DOWN);//对于这个on来说,我们只是使用者        //this.on;对于这个on来说,我们是开发者,    }    Drag.prototype.__proto__ = EventEmitter.prototype;    //这是更安全的继承方法,一般在Node里都是采用这种方式实现继承。IE不支持    Drag.prototype = new EventEmitter;//相对这种方式来说,上边的写法更安全    Drag.prototype.down = function (e) {        this.x = this.ele.offsetLeft;        this.y = this.ele.offsetTop;        this.mx = e.pageX;        this.my = e.pageY;        if (this.ele.setCapture) {            this.ele.setCapture();            on(this.ele, "mousemove", this.MOVE);            on(this.ele, "mouseup", this.UP);        } else {            on(document, "mousemove", this.MOVE);            on(document, "mouseup", this.UP);        }        e.preventDefault();        this.run("abcde1", e);    };    Drag.prototype.move = function (e) {        this.ele.style.left = this.x + (e.pageX - this.mx) + "px";        this.ele.style.top = this.y + (e.pageY - this.my) + "px";        this.run("abcde2", e);    };    Drag.prototype.up = function (e) {        if (this.ele.releaseCapture) {            this.ele.releaseCapture();            off(this.ele, "mousemove", this.MOVE);            off(this.ele, "mouseup", this.UP);        } else {            off(document, "mousemove", this.MOVE);            off(document, "mouseup", this.UP);        }        this.run("abcde3", e);    };

    var oRange = {l: 0, r: 600, t: 0, b: 300};    //相当于重新写了一个计算元素拖拽位置的方法,用这个方法,把原来的Drag.prototype.move覆盖掉    Drag.prototype.addRange = function (obj) {        this.oRange = obj;        this.on("abcde2", this.range);    };    Drag.prototype.range = function range(e) {        var oRange = this.oRange;        var l = oRange.l, r = oRange.r, t = oRange.t, b = oRange.b;        var currentL = this.x + (e.pageX - this.mx);        var currentT = this.y + (e.pageY - this.my);        if (currentL >= r) {            this.ele.style.left = r + "px";        } else if (currentL <= l) {            this.ele.style.left = l + "px";        } else {            this.ele.style.left = currentL + "px";        }        if (currentT >= b) {            this.ele.style.top = b + "px";        } else if (currentT <= t) {            this.ele.style.top = t + "px";        } else {            this.ele.style.top = currentT + "px";        }    };

    Drag.prototype.border = function (width, color, style) {        //允许不传参数,如果参数没有传,则这里给它指定默认的值        if (!width)width = "2";        if (!color)color = "#666";        if (!style)style = "dashed";        this.borderStyle = {width: width, color: color, style: style};        this.on("abcde1", this.addBorder);        this.on("abcde3", this.removeBorder);    };    Drag.prototype.addBorder = function () {        var bs = this.borderStyle;        this.ele.style.border = bs.width + "px " + bs.color + " " + bs.style;    };    Drag.prototype.removeBorder = function () {        this.ele.style.border = "none";    };

    function Linear(t, b, c, d) {        return c * t / d + b;    }    function animate(ele, obj, duration, effect, callback) {        var oBegin = {};//用来保存多个方向begin;        var oChange = {};//用来保存多个方向的change;        var flag = 0;//用来记录各个方向的距离是否有效        for (var attr in obj) {            var target = obj[attr]            var begin = animate.getCss(ele, attr);            var change = target - begin;            if (change) {//判断一下此方向的运动距离有效,不为0                oBegin[attr] = begin;                oChange[attr] = change;                flag++;            }        }        if (!flag)return;//如果各个方向的运动距离都是0,则结束动画的执行        var interval = 15;        var times = 0;        clearInterval(ele.timer);        function step() {            times += interval;            if (times < duration) {                for (var attr in oChange) {                    var change = oChange[attr];                    var begin = oBegin[attr];                    //var val=times/duration*change+begin;                    var val = Linear(times, begin, change, duration);                    animate.setCss(ele, attr, val);                }            } else {                for (var attr in oChange) {                    var target = obj[attr];                    animate.setCss(ele, attr, target);                }                clearInterval(ele.timer);                ele.timer = null;                if (typeof callback == "function") {                    callback.call(ele);                }            }        }

        ele.timer = setInterval(step, interval);    }

    animate.getCss = function (ele, attr) {        if (window.getComputedStyle) {            return parseFloat(window.getComputedStyle(ele, null)[attr]);        } else {            if (attr == "opacity") {                var val = ele.currentStyle.filter;                //"alpha(opacity=50)";//匹配到这样的一个字符串,然后把这个字符串中的数字部分拿到                var reg = /alpha\(opacity=(\d+(?:\.\d+)?)\)/;                if (reg.test(val)) {                    return RegExp.$1 / 100;                } else {                    //如果没有给IE中的不透明度赋值,则上边的正则为false                    return 1;//如果没有给不透明度赋值,则应该把默认值1返回                }                //方法没有返回值,则此方法执行结束后留下一个undefined。即:没有返回值的方法返回的是undefined            } else {                return parseFloat(ele.currentStyle[attr]);            }        }    };

    animate.setCss = function (ele, attr, val) {        if (attr == "opacity") {            ele.style.opacity = val;            ele.style.filter = "alpha(opacity=" + val * 100 + ")";        } else {            ele.style[attr] = val + "px";        }    };

    /*第二步:碰撞检测*/    var oLis = document.getElementsByTagName("li");    //如下代码,循环倒着做就可以,这是为什么呢?一定要搞清楚    for (var i = oLis.length - 1; i >= 0; i--) {        var oLi = oLis.item(i);        oLi.style.left = (oLi.l = oLi.offsetLeft) + "px";        oLi.style.top = (oLi.t = oLi.offsetTop) + "px";        oLi.style.position = "absolute";        oLi.style.margin = 0;        new Drag(oLi).on("abcde1", increaseIndex).on("abcde3", changePosition).on("abcde2", test);    }    var index = 0;    function increaseIndex() {        this.ele.style.zIndex = ++index;    }    function goHome() {        animate(this.ele, {left: this.ele.l, top: this.ele.t}, 700);    }

    //如果两个元素撞上了,则返回true;没有撞上,则返回false    function isHited(b, r) {        if (b.offsetLeft + b.offsetWidth < r.offsetLeft || b.offsetTop                + b.offsetHeight < r.offsetTop || b.offsetLeft > r.offsetLeft                + r.offsetWidth || b.offsetTop > r.offsetTop + r.offsetHeight)        {            return false;        } else {            return true;        }    }

    function test() {        this.aHited = [];        for (var i = 0; i < oLis.length; i++) {            var oLi = oLis.item(i);            if (oLi == this.ele)continue;            if (isHited(this.ele, oLi)) {                this.aHited.push(oLi);                oLi.style.backgroundColor = "red";            } else {                oLi.style.backgroundColor = "";            }        }    }

    function changePosition() {        var a = this.aHited;        if (a && a.length) {            for (var i = 0; i < a.length; i++) {                var oLi = a[i];                //计算被拖拽的元素和撞上的元素之间的距离,并且把距离保存到distance属性上                oLi.distance = Math.sqrt(Math.pow(this.ele.offsetLeft - oLi.offsetLeft, 2)                        + Math.pow(this.ele.offsetTop - oLi.offsetTop, 2));                oLi.style.backgroundColor = "";            }            //排序,找出和被拖拽元素最短的那个元素            a.sort(function (a, b) {                return a.distance - b.distance            });            var shortest = a[0];            shortest.style.backgroundColor = "orange";            this.ele.style.backgroundColor = "orange";            //交换位置            animate(shortest, {left: this.ele.l, top: this.ele.t}, 700);            animate(this.ele, {left: shortest.l, top: shortest.t}, 700);            var l = this.ele.l, t = this.ele.t;            this.ele.l = shortest.l;            this.ele.t = shortest.t;            shortest.l = l;            shortest.t = t;        } else {//如果没有撞上的元素,则返回原始位置            animate(this.ele, {left: this.ele.l, top: this.ele.t}, 700);        }    }</script>```

原文地址:https://www.cnblogs.com/gushixianqiancheng/p/10967164.html

时间: 2024-10-02 15:46:36

92JavaScript:原生位置交换的相关文章

二进制文件每两个的字节位置交换

(一).写作缘由: 写这篇博客的目的是是为了方便下次使用或者帮助其他需要的人.在打CTF的时候,偶尔会遇到还原一些文件,笔者遇到的是分析数据流量的时候,提取出了一个未知文件,用二进制编辑器打开,搜所文件头,发现和某个文件头有点相似,但是每两个字节位置颠倒了,于是就想到把每两个字节交换位置,就像下面这种: (二).演示及效果: 在命令行执行前后如下图: (三).贴上代码: 代码是C写的,有点多不太美观,功能太单一, 也没弄啥模块化,编写环境是windows. #include <stdio.h>

java实现原数组根据下标分隔成两个子数组并且在原数组中交换两个子数组的位置

此类实现:输出一行数组数据,根据输入的下标,以下标位置为结束,将原数组分割成两组子数组.并交换两个子数组的位置,保持子数组中的元素序号不变.如:原数组为7,9,8,5,3,2 以下标3为分割点,分割为子数组一:7,9,8,5.和子数组二:3,2.经过交换算法后的结果应为:3,2,7,9,8,5 有两种交换算法<1>前插法:将子数组3,2另存在一个临时数组中,将原数组7,9,8,5,3,2每一位向后移两个位置  再将子数组3,2插入到移动好元素位置的原数组中.<2>逆置法:将原数组7

Jquery 动态交换两个div位置并添加Css动画效果

前端网页开发中我们经常会遇到需要动态置换两个DIV元素的位置,常见的思路大多是不考虑原始位置,直接采用append或者appendTo方式将两元素进行添加,该法未考虑原始位置,仅会添加为元素的最后一子元素. 今天将给大家介绍一种位置交换方式(判断兄弟元素是否存在),并添加简单的css效果. 设计思路 判断元素后边是否存在兄弟元素:存在则通过insertBefore方法将另一元素添加至其兄弟元素前,否则则直接采用appendTo方法添加至父元素. 核心代码 1.判断其后边是否存在兄弟元素 1 fu

【jquery 交换位置】jquery交换Div位置

Jquery 动态交换两个div位置并添加Css动画效果 <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title>jquery交换Div位置</title> </head> <body> <div id="top" style="width:100%;height:100px"&

简介支持向量机热门(认识SVM三位置)

支持向量机通俗导论(理解SVM的三层境地) 作者:July .致谢:pluskid.白石.JerryLead.出处:结构之法算法之道blog. 前言 动笔写这个支持向量机(support vector machine)是费了不少劲和困难的,原因非常简单,一者这个东西本身就并不好懂,要深入学习和研究下去需花费不少时间和精力,二者这个东西也不好讲清楚.尽管网上已经有朋友写得不错了(见文末參考链接),但在描写叙述数学公式的时候还是显得不够.得益于同学白石的数学证明,我还是想尝试写一下.希望本文在兼顾通

java字符串第一个字符与最后一个字符颠倒位置测试

最近做了一个需求,就是 通过OA 连接到我们系统,然后request里 带有base64加密后的字符串,并且第一个与最后一个位置颠倒了,所以需要先恢复正常的加密串,然后在解密. 所以首先工作是 先测试还原加密串,就是第一个与最有一个字符位置交换一下. 测试代码如下:  private static void test2() {   String st="012345=";   String firstChar=String.valueOf(st.charAt(0));   String

控件拖拽置换位置

简单的一个控件拖拽交换位置Demo,有些场景下会用到,关于此类功能网上有很多例子,而且Google官方API中也有相应的接口,对这种业务需求进行了一定逻辑封装.这里没有采用官方接口,单纯的从触摸事件入手来简单的实现控件位置交换. 写代码之前先理清楚实现的思路,这里从控件的触摸事件入手,触摸事件有ACTION_DOWN.ACTION_MOVE.ACTION_UP这几个状态,下面先把实现逻辑的思路写出来: 1.界面加载完成后用一个List记录各个子控件相对于父控件的坐标,同时将这些子控件放入一个Li

DS单链表--结点交换

题目描述 用C++实现含头结点的单链表,然后实现单链表的两个结点交换位置. 注意不能简单交换两个结点包含数据,必须通过修改指针来实现两个结点的位置交换 交换函数定义可以参考: swap(int  pa, int pb)  //pa和pb表示两个结点在单链表的位置序号 swap (ListNode * p, ListNode * q)  //p和q表示指向两个结点的指针 输入 第1行先输入n表示有n个数据,接着输入n个数据 第2行输入要交换的两个结点位置 第3行输入要交换的两个结点位置 输出 第一

[CQOI2012]交换棋子(最小费用最大流)

[CQOI2012]交换棋子(luogu) Description 题目描述 有一个n行m列的黑白棋盘,你每次可以交换两个相邻格子(相邻是指有公共边或公共顶点)中的棋子, 最终达到目标状态.要求第i行第j列的格子只能参与mi,j次交换. 输入格式 第一行包含两个整数n,m(1<=n, m<=20).以下n行为初始状态,每行为一个包含m个字符的01串, 其中0表示黑色棋子,1表示白色棋子.以下n行为目标状态,格式同初始状态. 以下n行每行为一个包含m个0~9数字的字符串,表示每个格子参与交换的次