《任务5 DOM操作-拖曳效果》任务产出汇总

ps:代码是其他提供,其中所有文字都是个人理解,如果有什么错误和想法欢迎沟通~希望对你有帮助,biu
<h1>拖动 /拖曳效果</h1>

首先把需要拖动的部分放到一个div里面,然后导入相关的.js文件
<code>
<div class="login_logo_webqq"></div>
</code>

由于IE10以上不支持document.getElementsClassName(),所以为了解决所有浏览器兼容的问题,需要把获取ClassName封装起来.

通过Class获取元素需要两个参数,一个时ClassName类名,一个是父元素,第二个参数也不是必须的,如果不写就打上document,就会寻找所有class的元素,写了就寻找这个父元素下的ClassName.

    function getByClass(clsName,parent){
      var oParent=parent?document.getElementById(parent):document,
      eles=[],

解释:如果传入parent就获取他的id然后付给变量,没有传的话就放入document
由于类名可能不唯一,所以得到的是一个数组,就把他放到这个eles数组里面.

          elements=oParent.getElementsByTagName('*');
    ```      
现在获取到父元素下面所有的元素,然后进行遍历
    
      for(var i=0,l=elements.length;i<l;i++){
        if(elements[i].className==clsName){
          eles.push(elements[i]);
        }
      }
      return eles;
    }

现在我们得到了这块元素之后,我们调用一个drag的函数,来完成拖拽.

<h2>拖动一共要经历三步

1>在标题区域按下开始拖动

2>在页面中拖动

3>释放鼠标的时候停止拖动
</h2>

window.onload=drag;

function drag(){
var oTitle=getByClass('login_logo_webqq','loginPanel')[0];

    拖曳,获取了这个div,

oTitle.onmousedown=fnDown;
```
onmousedown:在用户按下任意鼠标按钮时出发事件fndown,为了方便阅读我将fnDown函数放到下面.<h3>拖动的原理其实就是拖动的部分和你的光标的坐标是一样的.</h3>
光标的位置可以通过clientX 和 clientY来得到.
鼠标事件都是在浏览器的特定位置上发生的,这个位置的信息保存在事件的clientX和clientY属性中.所有浏览器都支持这两个属性,他们的值表示事件发生时鼠标指针在视口中的水平和垂直坐标,不包括页面滚动的距离,也就是说可以通过这两个属性获得光标的xy坐标,然后让弹框也是这个坐标不就实现了拖动

   function fnDown(event){
   event = event || window.event;
   
   var oDrag=document.getElementById('loginPanel'),
       // 光标按下时光标和面板之间的距离
       disX=event.clientX-oDrag.offsetLeft,
       disY=event.clientY-oDrag.offsetTop;
     //用来获取弹框左上角相对浏览器距离,下面会解释  
   
   document.onmousemove=function(event){
     event = event || window.event;
     //IE得用window.event,得到事件对象
     fnMove(event,disX,disY);
     
     
     function fnMove(e,posX,posY){
   var oDrag=document.getElementById('loginPanel'),//改变他得先把他取出来
   ```
<p>
   <h5>错误演示:</h5>
   按理来说只要改变他的位置定位就可以了
  oDrag.style.left = event.clientX+'px';
  oDrang.style.top = event.clientY+'px';
<p>
      这样操作会明显发现,当你光标在拖动区域按下鼠标时,光标会跑到弹框的左上角,这样的话用户体验就不太好了.
      bug分析:
      由于你告诉浏览器光标在哪,弹框在那,得有个标准吧,所以就是时你的弹框左上角和光标位置一样.而且你本身定义的top和left就是左上角的位置.
      <h5>解决方案:</h5>
      所以就是说我们不能直接告诉他让和光标一个位置,而是在你光标按下的位置上的基础来改变位置.所以就是要获取到按下鼠标的位置和左上角的位置有什么关系,在这个基础上改变位置.
![guangbaio.png](http://upload-images.jianshu.io/upload_images/3189429-199a5ec9533f500c.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

其中黄色的时光标,蓝色时标题框,其中的白线就是我们要获取的坐标.而白线的距离就是光标相对浏览器的距离减去弹框跟窗口之间的距离
![weizhi.png](http://upload-images.jianshu.io/upload_images/3189429-c6bb703bdb99f946.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

</p>
</p>
      
          l=e.clientX-posX,
          t=e.clientY-posY,
l,t现在是获得的白线的距离
注意任何拖动的拖动的东西,都需要一个绝对定位,在css中.
    <p>
    <h5>错误发现:</h5>
    那现在又会发现,弹框可以任意拖动,也就是可以一直把滚动条撑起来,这样的话用户体验也不好
    <h5>分析解决:</h5>
    我们现在就需要,当弹框接触浏览器边界的时候不能在想外拖动了.所以就用限制一个范围,不能随意拉动了.对于左边也就时lt变成负数的时候让他强制变成0.对于右边就拖动的最大范围就是页面宽减去弹框宽度,当坐标大于这个范围的时候就强制变成最大坐标
    </p>

    winW=document.documentElement.clientWidth || document.body.clientWidth,
          winH=document.documentElement.clientHeight || document.body.clientHeight,
          
          maxW=winW-oDrag.offsetWidth-10,
          //这里减10是因为关闭按钮允许溢出十个像素
          maxH=winH-oDrag.offsetHeight;
      if(l<0){
        l=0;
      }else if(l>maxW){
        l=maxW;
      }
      if(t<0){
        t=10;
        //这样才能底对齐
      }else if(t>maxH){
        t=maxH;
      }
      
      oDrag.style.left=l+'px';
      oDrag.style.top=t+'px';
    }
 }
      
onmousemove当鼠标指针在元素内部移动时重复地触发,也就是每移动一下都会触发这个事件.
      
      
      // mouseup当用户释放鼠标触发事件
      document.onmouseup=function(){
        document.onmousemove=null;
        //就是移动的时候什么也不做,释放事件
        document.onmouseup=null;
      }
    }

<h4>总结</h4>
总的来说就是获取到可以点击鼠标拖动的区域,然后再处理好弹框和鼠标坐标的关系.放开鼠标的时候释放事件.最后再处理一下边界的问题就好了.我个人认为这个这个坐标的问题还是很值得分析的.
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容

  • HTML标签解释大全 一、HTML标记 标签:!DOCTYPE 说明:指定了 HTML 文档遵循的文档类型定义(D...
    米塔塔阅读 3,224评论 1 41
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,351评论 0 17
  • 事件源对象 event.srcElement.tagName event.srcElement.type 捕获释放...
    孤魂草阅读 867评论 0 0
  • 一、JS前言 (1)认识JS 也许你已经了解HTML标记(也称为结构),知道了CSS样式(也称为表示),会使用HT...
    凛0_0阅读 2,752评论 0 8
  • 我是北方人,从小喜欢吃馒头。尤其是妈妈和面、老爸亲手揉、上锅蒸出来的大馒头,咬下去满口生香,就着咸菜就能吃上一整个...
    4d67e06828ce阅读 933评论 1 2