• Javascript 事件对象进阶(二)拖拽的应用


      1 <!doctype html>
      2 <html>
      3 <head>
      4 <meta charset="utf-8">
      5 <title>无标题文档</title>
      6 <style type="text/css">
      7 *{ margin:0; padding:0;}
      8 body{ height:2000px;}
      9 #login{ float:right; cursor:pointer;}
     10 .ui-dialog{ width:380px; height:auto; position:fixed; z-index:100; top:100px; left:100px; border:1px solid #d5d5d5; background:#fff; display:none;}
     11 .ui-dialog-title{ height:48px; line-height:48px; padding-left:20px; background:#efefef; cursor:move;}
     12 .ui-dialog-contact{ height:300px; background:#ccc;}
     13 
     14 .closed{ text-decoration:none; color:#000; position:absolute; top:0px; right:20px;}
     15 .ui-mask{ width:100%; height:100%; background:#000; opacity:0.4; filter:Alpha(opacity=40); position:fixed; top:0; left:0; z-index:99; display:none;}
     16 </style>
     17 </head>
     18 
     19 <body>
     20 <p id="login">登录</p>
     21 <div class="ui-dialog" id="dialog">
     22     <div class="ui-dialog-title" id="dialogTitle">登录通行证<a href="#" class="closed" id="closed">关闭</a></div>
     23     <div class="ui-dialog-contact"></div>
     24 </div>
     25 <div class="ui-mask" id="mask" onslectstart='return false'></div>
     26 </body>
     27 </html>
     28 <script type="text/javascript">
     29 
     30 //获取元素对象
     31 function g(id){ return document.getElementById(id);}
     32 
     33 //自动居中 - 把登录浮层,水平和垂直居中在页面当中
     34 function autoCenter(el){
     35     //获取页面可视区的宽度和高度
     36     var bodyW=document.documentElement.clientWidth;
     37     var bodyH=document.documentElement.clientHeight;
     38     
     39     //获取登录浮层的宽度和高度
     40     var elW=el.offsetWidth;
     41     var elH=el.offsetHeight;
     42     
     43     //设置登录浮层在页面当中居中 ,即left和right的值
     44     el.style.left= Math.floor((bodyW-elW)/2) +'px';
     45     el.style.top= Math.floor((bodyH-elH)/2) +'px';
     46     
     47     
     48 };
     49 
     50 //自动全屏 - 把遮罩层放满整个屏幕
     51 function fillToBody(el){
     52     //将传入元素的宽度和高度 设置成 当前可视区的宽度和高度
     53     el.style.widht=document.documentElement.clientWidth +'px';
     54     el.style.height=document.documentElement.clientHeight +'px';
     55 };
     56 
     57 
     58 //推拽  -  三个关键鼠标事件
     59 
     60     //鼠标偏移值
     61     var mouseOffsetX=0;
     62     var mouseOffsetY=0;
     63     //设置一个开关,是否可拖拽的标记
     64     var isDraging=false;
     65     
     66    //1.在标题栏上按下 - 鼠标在标题栏上按下时,要计算鼠标相对拖拽元素的左上角的坐标,并且标记元素为可拖动!
     67    g('dialogTitle').addEventListener('mousedown',function(e){
     68         var e=e||window.event;
     69         //计算鼠标的偏移
     70         mouseOffsetX=e.pageX - g('dialog').offsetLeft;//鼠标事件当时点击时X的坐标 - 登录浮层当前相当于页面左边的位置
     71         mouseOffsetY=e.pageY - g('dialog').offsetTop;
     72         
     73         isDraging=true;//鼠标按下时候,打开开关,标记为可拖拽
     74    });
     75    
     76    // 2.开始移动      -  鼠标开始移动,要检测登录浮层 是否可标记为移动,如果是,则更新元素的位置到当前鼠标的位置。(注意:要减去第一步中获得的偏移)
     77    document.onmousemove=function(e){
     78         var e=e||window.event;
     79         //获得当鼠标移动时候当前的位置
     80         var mouseX=e.pageX;
     81         var mouseY=e.pageY;
     82         
     83         //浮层元素的新位置,用于记录 浮层移动时候的新位置
     84         var moveX=0;
     85         var moveY=0;
     86         
     87         if(isDraging === true){
     88             moveX = mouseX - mouseOffsetX;
     89             moveY = mouseY - mouseOffsetY;
     90             
     91             //范围限定 moveX > 0 并且 moveX < (页面最大宽度 - 浮层的宽度)
     92             //范围限定 moveY > 0 并且 moveY < (页面最大高度度 - 浮层的高度度)
     93             var pageW=document.documentElement.clientWidth;
     94             var pageH=document.documentElement.clientHeight;
     95             
     96             var dialogW = g('dialog').offsetWidth;
     97             var dialogH = g('dialog').offsetHeight;
     98             
     99             var maxX=pageW - dialogW;
    100             var maxY=pageH - dialogH;
    101             
    102             moveX = Math.min(maxX , Math.max(0,moveX));
    103             moveY = Math.min(maxY , Math.max(0,moveY));
    104 
    105             g('dialog').style.left = moveX+'px';
    106             g('dialog').style.top = moveY+'px';
    107         };
    108 
    109     };
    110    
    111    // 3.放开          - 鼠标松开的时候,标记元素为不可拖动状态即可。
    112    document.onmouseup=function(){
    113       isDraging=false;
    114    };
    115    
    116    //展现登录浮层
    117    function show(){
    118         g('dialog').style.display='block';
    119         g('mask').style.display='block';
    120         autoCenter(g('dialog'));
    121         fillToBody(g('mask'));
    122     };
    123     
    124     //关闭登录浮层
    125     function hide(){
    126         g('dialog').style.display='none';
    127         g('mask').style.display='none';
    128     };
    129      
    130      //窗口大小改变的事件处理
    131      window.onresize = function(){
    132         autoCenter(g('dialog'));
    133         fillToBody(g('mask'));
    134      };
    135      
    136     g('login').onclick=show;     
    137     g('closed').onclick=hide;     
    138 
    139 </script>
  • 相关阅读:
    POJ 3923 Ugly Windows(——考察思维缜密性的模拟题)
    POJ 3829 Seat taking up is tough(——只是题目很长的模拟)
    练习json读取中文
    关于调接口和腾讯云cos方面。
    JavaScript如何处理解析JSON数据详解
    js获取url参数值的两种方式
    修改Host,配置域名访问
    Atom设置震撼的编辑效果
    atom总结
    用node.js可以开启静态服务 不需要借助apache 或者xampl
  • 原文地址:https://www.cnblogs.com/trtst/p/3803236.html
Copyright © 2020-2023  润新知