小练习:元素的拖放

看到很多地方都用到了拖放,因此就自己尝试写了一个,刚开始以为很简单,结果到处都是陷阱。

不多说了,先放写好的程序,在来说说其中遇到的问题。

不过大家可以先自己写写,再来看可能效果更好。

<!doctype html>
<html>
<head>
    <meta charset="utf-8">
    <style>
        #drag{
            position: fixed;
            top:100px;
            left: 100px;
            width: 100px;
            height: 100px;
            background: #cdc;
        }
    </style>
</head>
<body>
    <div id="drag">
    </div>
</body>
    <script>
        var dragFn, pX, pY, sX,sY, dropFn, dragFlag=false, w=window;

        var dom=document.getElementById("drag");

        dom.addEventListener("mousedown",dragFn=function  (event) {
            dragFlag=true;
            console.log(dom.style.left+"");
            pX =  parseInt(w.getComputedStyle(dom , null)[‘left‘]); //获得初始位置
            pY = parseInt(w.getComputedStyle(dom , null)[‘top‘]);
            sX=event.clientX-pX;
            sY=event.clientY-pY;  //
        });

        addEventListener(‘mouseup‘, dropFn = function(){ dragFlag = false; });//设置为false,禁止拖动

        addEventListener(‘mousemove‘, mFn = function(event){ onDrag(event); })

        function onDrag(event) {
                if(dragFlag){ //先检验是否可以拖动

                    var l= (event.clientX -sX);
                    var t = (event.clientY -  sY);

                    var wl=window.innerWidth-dom.offsetWidth;
                    var wt=window.innerHeight-dom.offsetHeight;  //页面的宽度减去dom的宽度

                    if (l<0){l=0;}
                    if (l>wl){l=wl;} //不得超出屏幕的宽度
                    if (t<0){t=0;}
                    if (t>wt){t=wt;}

                        dom.style.left = l+ ‘px‘;
                        dom.style.top = t+ ‘px‘;
                }
            }
    </script>
</html>

问题1:添加事件

刚开始我把事件都添加在dom上,然后就发生了奇怪的事,即使鼠标松开了,我在移动还是会动的,

dom.addEventListener("mousedown",dragFn=function  (event) {
......
}
dom.addEventListener(‘mouseup‘, dropFn = function(){ dragFlag = false; });//设置为false,禁止拖动

dom.addEventListener(‘mousemove‘, mFn = function(event){ onDrag(event); })

后面我再去参考别人的,发现人家都只是在鼠标按下的时候添加到dom上,而其他时候就只是绑定事件而已。

dom.addEventListener("mousedown",dragFn=function  (event) {
......
}
addEventListener(‘mouseup‘, dropFn = function(){ dragFlag = false; });//设置为false,禁止拖动

addEventListener(‘mousemove‘, mFn = function(event){ onDrag(event); })

问题2:就是pageX,innerWidth,innerHeight,clientX,之间的区别与联系。具体参看我写的另一篇文章。

问题3:就是元素的样式获取

刚开始我采用style.left的方式获取,但是始终为零。

后面我才知道,style.left只能获取写在标签上的样式,不能获取写在css上的和style中的,如下图所示。

因此我就改用其他方法,总不能将样式写在标签上。

这样就可以成功获得这些样式了。

后面等我学了设计模式和jQuery之后,我在把它写成一个小的插件,

时间: 2024-10-10 02:56:59

小练习:元素的拖放的相关文章

给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序

[问题] 找出反序的个数 给定一整型数组,若数组中某个下标值大的元素值小于某个下标值比它小的元素值,称这是一个反序. 即:数组a[]; 对于i < j 且 a[i] > a[j],则称这是一个反序. 给定一个数组,要求写一个函数,计算出这个数组里所有反序的个数. [代码] #include <stdio.h> #include <stdlib.h> #include <string.h> int sumNum = 0; void merge(int *a,

[LeetCode] Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

Given a n x n matrix where each of the rows and columns are sorted in ascending order, find the kth smallest element in the matrix. Note that it is the kth smallest element in the sorted order, not the kth distinct element. Example: matrix = [ [ 1, 5

查找数组中第i小的元素

查找并输出数组中第i小的元素,这样的题目我们可以先对数组进行排序,然后输出相对应的第i小的元素:还有另外一种方法,一种解决选择问题的分治算法,该算法是以快速排序算法为模型的,与快速排序一样,我们仍然将输入数组进行划分,但与快速排序不同的是,快速排序会递归处理划分的两边,而该选择方法select只处理划分的一边.这一差异会在性能分析中体现出来:快速排序的期望运行时间为O(nlog(n)),而select的选择期望运行时间是O(n). 1.对数组进行排序,然后输入第i小的元素,这里排序算法用的是插入

选择第n小的元素之python实现源码

def partition(A, p, r): j = p+1 for i in range(p+1, r+1): if(A[i] < A[p]): tmp = A[i] A[i] = A[j] A[j] = tmp j = j + 1 tmp = A[p] A[p] = A[j-1] A[j-1] = tmp return j - 1 def select(A, p, r, i): if(p == r): return A[p] q = partition(A, p, r) #print q

支持元素惯性拖放和多点触摸手势的js插件

interact.js是一款支持元素惯性拖放和多点触摸手势的js插件.该插件支持在桌面设备和移动手机设备中拖放元素,拖动结束时带有惯性效果.并且支持移动设备的多点触摸手势.它的特点有: 带惯性和吸附效果 支持多元互动 跨浏览器和设备,支持桌面和移动版本的Chrome, Firefox 和 Opera浏览器以及IE8+浏览器 可以和SVG元素相互作用 轻量级,无任何外部依赖 除非要支持IE8或修改鼠标样式,否则不用修改任何DOM元素 效果演示:http://www.htmleaf.com/Demo

查找数列中第K小的元素(C语言版)

今天在看<算法:C语言实现>时,在快速排序那一章最后一节讲述了利用快速排序的思想,快速排序每次划分后在枢轴的左边的元素都比枢轴小,在枢轴右边的数都比枢轴大(或相等),而划分后枢轴本身就放在了(有序时)它自身应该在的位置,在每次划分后判断枢轴下标和k的大小就可以快速找出数列中第k小的数了. 看完之后,我想既然利用快速排序的思想可以很快的找到第k小的数,那么能不能利用计数排序的思想来查找第k小的数呢,仔细一想,完全可以!计数排序是利用一个计数数组C来记录待排序数组中各个不同数值出现的次数,然后通过

378 Kth Smallest Element in a Sorted Matrix 有序矩阵中第K小的元素

给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第k小的元素.请注意,它是排序后的第k小元素,而不是第k个元素.示例:matrix = [   [ 1,  5,  9],   [10, 11, 13],   [12, 13, 15]],k = 8,返回 13.说明:你可以假设 k 的值永远是有效的, 1 ≤ k ≤ n2 .详见:https://leetcode.com/problems/kth-smallest-element-in-a-sorted-matrix/des

leetcode 二叉搜索树中第K小的元素 python

二叉搜索树中第K小的元素 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. 示例 1: 输入: root = [3,1,4,null,2], k = 1 3 / 1 4   2 输出: 1 示例 2: 输入: root = [5,3,6,2,4,null,null,1], k = 3 5 / 3 6 / 2 4 / 1 输出: 3 进阶:如果二叉搜索树经常被修改(插入/删除操作)并且

230. 二叉搜索树中第K小的元素

230. 二叉搜索树中第K小的元素 题意 给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. 解题思路 中序遍历,利用Python3中提供的生成器方法: 中序遍历,判断存储结点值的数组是否到到k,则表明访问的一个结点就是第k个最小的元素: 先获取跟结点处于的位置(第几个最小的元素),如果它比k小,则从右子结点中找,如果它比k大,则从左子节点中找: 实现 class Solution:    

二叉树中第 K小的元素

给定一个二叉搜索树,编写一个函数 kthSmallest 来查找其中第 k 个最小的元素. 说明:你可以假设 k 总是有效的,1 ≤ k ≤ 二叉搜索树元素个数. 思路: 二叉搜索树因其有序,故采用中序遍历,可以得到第K小的元素. /** * Definition for a binary tree node. * struct TreeNode { * int val; * TreeNode *left; * TreeNode *right; * TreeNode(int x) : val(x