`

动态拖拉效果小例

IE 
阅读更多
// 事件注册,调用示例:_attachEvent(document, "mousemove", moveHandler);

function _attachEvent(obj, evt, func) {
    if(obj.addEventListener) {
        obj.addEventListener(evt,func,true); 
    } else if(obj.attachEvent) {
        obj.attachEvent("on"+evt,func);
    } else { 
        eval("var old"+func+"="+obj+".on"+evt+";");
        eval(obj+".on"+evt+"="+func+";");
    }
}

// 事件注销,调用示例:_detachEvent(document, "mousemove", moveHandler);

function _detachEvent(obj, evt, func) {
    if(obj.removeEventListener) { //DOM事件模型

        obj.removeEventListener(evt,func,true);
    } else if(obj.detachEvent) { //IE5+ 事件模型

        obj.detachEvent("on"+evt,func);
    } else  { //IE事件模型

        eval(obj+".on"+evt+"=old"+func+";");
    }
}

// 禁止默认行为,调用示例:_cancelDefault(event);

function _cancelDefault(e)
{
    if(e.preventDefault) e.preventDefault(); //2级DOM

    else e.returnValue=false; //IE

}

// 阻止事件冒泡, 调用示例:_cancelBubble(event);

function _cancelBubble(e)
{
    if(e.stopPropagation) e.stopPropagation(); //2 级DOM

    else e.cancelBubble=true; //IE

}
function gid(id)
{
    return document.getElementById(id);
}
// 激发指定对象的拖动事件,使用空的shadow,速度更快。§ 参数分别为 拖动对象, event, 方向(1水平,2垂直,null任意), 最大X坐标, 最大Y坐标

function DragByShadow(dragObj,event, direction, maxX, maxY)
{
        
    var objShadow;
    var parentOffsetLeft = 0, parentOffsetTop = 0;
    var obj = dragObj;
    
    // 先保存原来的尺寸,防止变形

    dragObj.style.width = dragObj.offsetWidth;
    dragObj.style.height = dragObj.offsetHeight;
//    gid('dbg').innerHTML = dragObj.offsetTop;

    // 处理父节点偏移量

    while(obj.parentNode && obj.parentNode.tagName != "BODY")
    {
        parentOffsetLeft += obj.parentNode.offsetLeft;
        parentOffsetTop += obj.parentNode.offsetTop;        
        obj = obj.parentNode;
    }
    
    if(!document.getElementById('shadow'))
    {
        objShadow=document.createElement("DIV");
        objShadow.id = 'shadow';
        objShadow.style.position='absolute';
        objShadow.style.filter = 'alpha(opacity=30,style=0)';
        objShadow.style.backgroundColor = '#ccc';        
        document.body.appendChild(objShadow);
    }
    else
        objShadow= document.getElementById('shadow');
        
            
    // 将阴影层放置在本层下面以防止遮住按钮等东西

    objShadow.style.zIndex = dragObj.style.zIndex+1;
    objShadow.style.left = parentOffsetLeft + dragObj.offsetLeft + 'px';
    objShadow.style.top = parentOffsetTop + dragObj.offsetTop + 'px';
    
    objShadow.style.width = dragObj.offsetWidth + 'px';
    objShadow.style.height = dragObj.offsetHeight + 'px';
    
    
    dragStart(objShadow,event, direction, maxX, maxY);
    objShadow.style.display='none';
    _attachEvent(document, 'mouseup', dragEnd);

    
    _cancelBubble(event);

    //下面禁止执行默认动作

    _cancelDefault(event);
    function dragEnd()
    {
        if(!direction)
        {
            // 未指定方向时,随意拖动

            dragObj.style.left = objShadow.offsetLeft-parentOffsetLeft + 'px';
            dragObj.style.top = objShadow.offsetTop-parentOffsetTop + 'px';
        } else if( direction == 1) {
            // 水平移动

            dragObj.style.left = objShadow.style.left;
        } else if( direction == 2) {
            // 垂直移动

            dragObj.style.top = objShadow.style.top;
        }
        

        // 删除阴影层,防止缓存

        document.body.removeChild(objShadow);
        
        // 注销事件

        _detachEvent(document, 'mouseup', dragEnd);
        
        //不要再让事件进一步传播.

        _cancelBubble(event);
        if(dragObj.layerid)  //有蒙层的模块要改变蒙层的高度、宽度等。

            ChangeLayer(dragObj);
    }
}

// 激发指定对象的拖动事件,实时拖动。§ 参数分别为 拖动对象, event, 方向(1水平,2垂直,null任意), 最大X坐标, 最大Y坐标

function dragStart(dragObj,event, direction, maxX, maxY)
{ 
    // 先保存原来的尺寸,防止变形

    dragObj.style.width = dragObj.offsetWidth;
    dragObj.style.height = dragObj.offsetHeight;
    
    pointX=event.clientX-parseInt(dragObj.offsetLeft);
    pointY=event.clientY-parseInt(dragObj.offsetTop);
    
    _attachEvent(document, "mousemove", moveHandler);
    _attachEvent(document, 'mouseup', dragEnd);

    _cancelBubble(event);

    //下面禁止执行默认动作

    _cancelDefault(event);
    
    function moveHandler(e)  {
        dragObj.style.display = '';
        //把元素移动到鼠标当前的位置,根据初始鼠标点击的偏移量进行调整

        if(!direction)
        {
            // 未指定方向时,随意拖动

            dragObj.style.left=(e.clientX-pointX)+"px";
            dragObj.style.top=(e.clientY-pointY)+"px";
        } else if( direction == 1) {
            // 水平移动

            dragObj.style.left=(e.clientX-pointX)+"px";
        } else if( direction == 2) {
            // 垂直移动

            dragObj.style.top=(e.clientY-pointY)+"px";
        }
        //不要再让其他元素看到该事件.

        _cancelBubble(event);
    }
    function dragEnd()
    {
        // 注销事件

        _detachEvent(document, 'mousemove', moveHandler);
        _detachEvent(document, 'mouseup', dragEnd);
        
        //不要再让事件进一步传播.

        _cancelBubble(event);
    }
}
</script>

<SCRIPT>
function $(id){return document.getElementById(id);}
</script>
<DIV onselectstart="return false" onmousedown=dragStart(this,event) 
ondragstart="return false" 
style="LEFT: 50px; CURSOR: move; POSITION: absolute; TOP: 220px"><IMG id=i1 
title="drag me" src="/Article/ArticleImage/31/3092/JavascriptDragDrop1.jpg">随意拖动 </DIV>

<DIV onselectstart="return false" onmousedown=dragStart(this,event,1) 
ondragstart="return false" 
style="LEFT: 50px; CURSOR: pointer; POSITION: absolute; TOP: 50px"><IMG id=i2 
title="Drag me(horizontal)" src="/Article/ArticleImage/31/3092/JavascriptDragDrop2.jpg">水平移动 
</DIV>

<DIV onmouseup="$('i3').src='/Article/ArticleImage/31/3092/JavascriptDragDrop3.jpg';" 
onselectstart="return false" 
onmousedown="$('i3').src='/Article/ArticleImage/31/3092/JavascriptDragDrop4.jpg';dragStart(this,event,2)" 
ondragstart="return false" 
style="LEFT: 350px; CURSOR: pointer; POSITION: absolute; TOP:50px"><IMG id=i3 
title="Drag me(vertical)" src="/Article/ArticleImage/31/3092/JavascriptDragDrop3.jpg">垂直移动 
</DIV>
1
4
分享到:
评论

相关推荐

    DIV 拖拉大小 移动位置

    本话题主要围绕`DIV`元素的拖拉大小和移动位置来展开,涉及到的技术主要是JavaScript,特别是ECMAScript的相关特性,以及一个名为`interact.js`的库。 `DIV`是HTML中的一个常用布局元素,它允许开发者通过CSS定义...

    JavaScript特效100例

    1. 图片拖拉缩放效果(仿PHOTOSHOP):这个效果模拟了Adobe Photoshop中的图片编辑功能,让用户可以通过鼠标拖动和缩放来查看和操作图片。实现这一效果的关键在于监听鼠标事件(mousedown, mousemove, mouseup),并...

    Trimble自动驾驶系统工作原理及应用效果.pdf

    田间操作步骤以直线导航为例,包括定义AB线,驾驶员手动调转拖拉机,根据界面提示使拖拉机接近提示线位置,点击黄色方向盘图标,图标变为绿色,进入自动驾驶状态。 Trimble自动驾驶系统在生产中的应用效果显著,...

    Delphi技巧100例——源码.

    Delphi技巧100例——源码. sample\1.5-Delphi界面使用技巧 sample\2.1-用Delphi写扬声器音乐 sample\2.2-我的加法器 sample\2.3-简单文本加密 sample\2.4-文件搜索 sample\3.1-布幕表单 sample\3.2-不规则的表单 ...

    【统计学】第四章统计综合指标(补充例题).doc

    首先,我们以一个拖拉机厂的生产情况为例。在这个例子中,统计综合指标的应用体现在对不同类型拖拉机产量的衡量上。通过计算自然单位、双重单位和标准单位的总量指标,我们不仅可以获得各类型拖拉机的数量,还能...

    机械设计或文档或dwg文件CAD-20马力轮式拖拉机的半轴与制动器设计.zip

    设计时需要考虑制动力矩、散热性能、磨损寿命以及在湿滑或泥泞地面的制动效果。此外,对于农业设备,制动系统的可靠性尤其重要,因为它直接影响到操作人员的安全。 描述中的“CAD”指的是计算机辅助设计,这是一种...

    弹出可拖动的Div,里面还有树形菜单

    这个Div通常用于展示一些临时信息或者提供交互功能,比如本例中的树形菜单。下面我们将深入探讨如何实现这样的功能,并结合提供的文件结构进行分析。 首先,标题和描述中的"弹出可拖动的Div"指的是一个可以动态显示...

    河北省石家庄市八年级物理下册 第九章 第1节 压强课件 (新版)新人教版

    5. **探究二:受力面积与作用效果的关系**:当压力相同时,受力面积越小,压力的作用效果越明显。 6. **压强**:压强是衡量单位面积上所受压力的物理量,用来表示压力的作用效果。定义为物体单位面积上受到的压力。...

    农业物联网技术在现代农业中的应用——以济南市为例.zip

    以济南市为例,我们可以通过分析其具体实践来探讨农业物联网技术的应用。 首先,农业物联网的核心是通过传感器设备收集农田环境的各种数据,如温度、湿度、光照、土壤成分等,这些数据可以实时传输到云端进行处理和...

    第二节、怎样描述力.doc

    以开门为例,若力作用在离门轴较近或较远的位置,感受到的力的大小及开门的效果将有很大区别。 在明确了力的三要素之后,接下来我们需要了解力的单位。力的国际标准单位是牛顿,符号为N。这个单位是为了纪念伟大的...

    低代码可以做什么?拿道一云七巧低代码平台为例说说.docx

    1. 全栈可视化编程:支持编辑时的点选、拖拽和配置操作,编辑完成后所及即所得(WYSIWYG)的预览效果。 2. 全生命周期管理:支持应用的完整生命周期管理,从设计阶段开始,历经开发、构建、测试和部署,一直到上线后...

    正交分解法整体法和隔离法 知识讲解 基础.doc

    - 例1展示了如何在没有摩擦的情况下,用全部法和隔离法分析两个物体组成的系统,求解A对B的作用力。 - 变式1中,通过隔离法分析物体B,找到A对B的作用力。 - 变式2考察了摩擦力对连接体中物体运动的影响,通过...

    河南省洛阳市第一高级中学2020学年高二物理12月月考试题(含解析).doc

    在本例中,拖拉机的拉力F沿水平和竖直方向分解,水平分力为F与水平方向夹角的余弦值,即Fcosα。 8. 作用力与反作用力:根据牛顿第三定律,作用力和反作用力总是成对出现,大小相等、方向相反,作用在不同的物体上...

    重庆市高中物理 《力的分解》课件 新人教必修1.ppt

    例2中,重力对斜面上物体的影响分为两个效果,一个是对斜面的压力,另一个是使物体下滑的趋势,分别由两个分力来体现。通过动画和实例演示,帮助学生理解力的分解在不同情境下的具体应用。 此外,课件还展示了在...

    2016沪科版物理八年级第六章第二节《怎样描述力》ppt课件

    - **典例1**:题目询问力的作用效果与哪些因素有关。正确选项为B,即力的作用点。这道题旨在考察学生对于力的作用效果与力的三要素之间的关系的理解。 通过这些知识点的学习,学生可以更深入地理解力的本质以及力...

    部编版一年级下册道德与法治教案-全册(2020必考).pdf

    以“我们爱整洁”为例,可以先通过师生交流、讨论学生的日常生活习惯来导入新课,然后介绍“整洁”的含义,并具体到个人卫生、房间整洁、学校环境整洁等生活细节。在“Teaching points”环节,可以通过穿衣、洗漱、...

    泛微最佳技术文档:数据看板功能详解

    PC 端效果以“我的演示-数据中心 DEMO”中的管理层驾驶舱为例,pc 端整体实现效果如下: 数据面板元素可以用于展示各类统计数据,自带同比、环比极端规则,能够穿透到数据中心统计界面; 饼形图元素可以用于展示...

    powerpoint使用技巧.pptx

    * 插入的公式,实际上是一个内嵌的图片,默认情况下比较小,影响演示效果,需要将其调整、定位一下。 四、如何带走自己的字体 我们通常有这样的担心,在一台电脑上制作好的演示文稿,复制到另一台电脑上播放时,...

    通过拖拽的方法自动生成html

    2. **实时预览**:在拖放过程中,用户可以实时看到页面的效果,这极大地提高了设计效率和准确性。这种即时反馈减少了反复检查代码的需要。 3. **布局管理**:工具通常还提供网格系统和对齐辅助线,帮助用户精确地...

    一年级道德与法治教学体会.docx

    以“我们爱整洁”单元为例,教师可以组织学生走出教室,实地调查社区或学校的卫生状况,之后让学生在课堂上分享他们的所见所感。这样的活动不仅增强了学生的观察力,更是在无形中提高了他们的卫生习惯,使其变成了一...

Global site tag (gtag.js) - Google Analytics