• 鼠标拖拽效果----百度登录框


    以百度的登录窗口为例,学习鼠标拖拽效果如何实现,拖拽范围限定以及登录窗口自动居中。学会如何制作弹出窗口特效,了解把元素设置为可拖拽的原理。

    知识点:

    1.掌握对可拖拽对话框的实现原理

    2.了解元素如何触发脚本方法以及如何编写侦听事件

    3. 学会设置元素在页面中居中和全屏

    注意区别:
    1.screenX:鼠标位置相对于用户屏幕水平偏移量,而screenY也就是垂直方向的,此时的参照点也就是原点是屏幕的左上角。
    2.clientX:跟screenX相比就是将参照点改成了浏览器内容区域的左上角,该参照点会随之滚动条的移动而移动。
    3.pageX:参照点也是浏览器内容区域的左上角,但它不会随着滚动条而变动。
    鼠标事件:

    鼠标事件1 - 在标题栏上按下(要计算鼠标相对拖拽元素的左上角的坐标,并且标记元素为可拖动)
    鼠标事件2 -  鼠标移动时(要检测元素是否标记为可移动,如果是,则更新元素的位置到当前鼠标的位置【ps:要减去第一步中获得的偏移】)
    鼠标事件3 - 鼠标松开的时候(标记元素为不可拖动即可)
    效果:


    完整代码及注释:
      1 <!DOCTYPE html>
      2 <html>
      3 <head lang="en">
      4     <meta charset="UTF-8">
      5     <title></title>
      6 </head>
      7 <style type="text/css">
      8     *{
      9         margin: 0;
     10         padding: 0;
     11         list-style: none;
     12     }
     13     .main{
     14         width: 600px;
     15         height: 320px;
     16         margin: 0 auto;
     17         margin-top: 80px;
     18         margin-left: 400px;
     19     }
     20     .img{
     21         text-align: center;
     22     }
     23     .item1{
     24         margin-left: 115px;
     25         width: 600px;
     26     }
     27     .item1 li{
     28         float: left;
     29         width: 50px;
     30     }
     31     .text{
     32         width: 600px;
     33         margin-left: 80px;
     34         margin-top: 5px;
     35     }
     36     .text .txt{
     37         width: 450px;
     38         height: 30px;
     39     }
     40     .text .btn{
     41         width: 70px;
     42         height: 30px;
     43         cursor: pointer;
     44     }
     45     .item2{
     46         width: 600px;
     47         margin-left: 200px;
     48         margin-top: 30px;
     49     }
     50     .item2 li{
     51         float: left;
     52         margin-left: 10px;
     53     }
     54     .link{
     55         text-align: right;
     56         line-height: 30px;
     57         padding-right: 40px;
     58     }
     59     .logmove{
     60         width: 380px;
     61         height: auto;
     62         background: #fff;
     63 
     64     }
     65     .Box{
     66         width: 380px;
     67         height: auto;
     68         position: absolute;
     69         left: 100px;
     70         top: 100px;
     71         border: 1px solid #d5d5d5;
     72         z-index: 9000;
     73         background: #fff;
     74         display: none;
     75     }
     76     .title{
     77         height: 48px;
     78         line-height: 48px;
     79         color: #535353;
     80         background: #f5f5f5;
     81         padding: 0px 20px;
     82         font-size: 16px;
     83         border-bottom: 1px solid #efefef;
     84         cursor: move;
     85         user-select: none;
     86     }
     87     .title .closebtn{
     88         display: block;
     89         width: 16px;
     90         height: 16px;
     91         position: absolute;
     92         top: 15px;
     93         right: 20px;
     94         background: url("img/close_def.png") no-repeat;
     95         cursor: pointer;
     96     }
     97     .title .closebtn:hover{
     98         background: url("img/close_hov.png");
     99     }
    100     .content{
    101         padding: 15px 20px;
    102     }
    103     .Input{
    104         padding-top: 15px;
    105     }
    106     .txt1,.txt2,.Input{
    107         height: 40px;
    108         line-height: 40px;
    109         text-align: right;
    110     }
    111     .username,.password{
    112         width: 100%;
    113         height: 40px;
    114         margin: 0px;
    115         padding: 0px;
    116         border: 1px solid #c1c1c1;
    117         text-indent: 25px;
    118         outline: none;
    119     }
    120     .username{
    121         background: url("img/input_username.png") no-repeat 2px;
    122     }
    123     .password{
    124         background: url("img/input_password.png") no-repeat 2px;
    125     }
    126     .submit{
    127         width: 100%;
    128         height: 50px;
    129         background: #3b7ae3;
    130         border: none;
    131         font-size: 16px;
    132         color: #fff;
    133         outline: none;
    134         text-decoration: none;
    135         display: block;
    136         text-align: center;
    137         line-height: 50px;
    138     }
    139     .submit:hover{
    140         background: #3f81b0;
    141     }
    142     .mask{
    143         width: 100%;
    144         height: 100%;
    145         background: #000;
    146         position: absolute;
    147         top: 0;
    148         left: 0;
    149         z-index: 8000;
    150         opacity: 0.4;
    151         filter: Alpha(opacity=40);
    152         display: none;
    153     }
    154 </style>
    155 <script type="text/javascript">
    156     window.onload=function(){
    157         //获取元素对象
    158         function g(id){
    159             return document.getElementById(id);
    160         }
    161         //自动居中 - 登录浮层 ( el = Element)
    162         function autoCenter(el){
    163             var bodyW = document.documentElement.clientWidth;//网页可视区域
    164             var bodyH = document.documentElement.clientHeight;
    165             var elW =  el.offsetWidth;//登录框的宽度
    166             var elH  = el.offsetHeight;
    167             el.style.left = (bodyW - elW) / 2 + 'px';//实现居中
    168             el.style.top = (bodyH - elH) / 2 + 'px';
    169         }
    170         //自动全屏 - 遮罩
    171         function fillToBody(el){
    172             el.style.width = document.documentElement.clientWidth + 'px';
    173             el.style.height = document.documentElement.clientHeight + 'px';
    174         }
    175         var mouseOffsetX = 0;//鼠标偏移量
    176         var mouseOffsetY = 0;
    177         var isDraging = false;
    178         //鼠标事件1 - 在标题栏上按下(要计算鼠标相对拖拽元素的左上角的坐标,并且标记元素为可拖动)
    179         g('title').addEventListener('mousedown',function(e){
    180             var e = e||window.event;
    181             mouseOffsetX = e.pageX - g('Box').offsetLeft;
    182             mouseOffsetY = e.pageY - g('Box').offsetTop;
    183             isDraging = true;
    184         })
    185         //鼠标事件2 -  鼠标移动时(要检测元素是否标记为可移动,如果是,则更新元素的位置到当前鼠标的位置【ps:要减去第一步中获得的偏移】)
    186         document.onmousemove = function(e){
    187             var e = e||window.event;
    188             var mouseX = e.pageX;//鼠标当前位置
    189             var mouseY = e.pageY;
    190             var moveX = 0;//浮层元素的新位置
    191             var moveY = 0;
    192             if(isDraging === true){
    193                 moveX = mouseX - mouseOffsetX;
    194                 moveY = mouseY - mouseOffsetY;
    195                 //拖拽范围限定  moveX > 0 并且 moveX < (页面最大宽度 - 浮层的宽度)
    196                 //              moveY > 0 并且 moveY < (页面最大高度 - 浮层的高度)
    197                 var pageWidth  = document.documentElement.clientWidth;//页面宽度
    198                 var pageHeight = document.documentElement.clientHeight;
    199                 var BoxWidth  = g('Box').offsetWidth;
    200                 var BoxHeight = g('Box').offsetHeight;
    201                 var maxX = pageWidth  - BoxWidth;
    202                 var maxY = pageHeight - BoxHeight;
    203                 moveX = Math.max(0,moveX);//实际上就是获得moveX的所有正数值,也就是规定范围的下限值
    204                 moveX = Math.min(maxX,moveX);//实际上就是规定了moveX的上限值
    205                 moveY = Math.max(0,moveY);
    206                 moveY = Math.min(maxY,moveY);
    207                 /*
    208                 moveX =Math.min(maxX, Math.max(0,moveX));
    209                 moveY =Math.min(maxY, Math.max(0,moveY));
    210                 */
    211                 g('Box').style.left = moveX + 'px';
    212                 g('Box').style.top = moveY + 'px';
    213             }
    214         }
    215         //鼠标事件3 - 鼠标松开的时候(标记元素为不可拖动即可)
    216         document.onmouseup = function(){
    217             isDraging = false;
    218         }
    219         function showBox(){
    220             g('Box').style.display = 'block';
    221             g('mask').style.display = 'block';
    222             autoCenter(g('Box'));
    223             fillToBody(g('mask'));
    224         }
    225         function hideBox(){
    226             g('Box').style.display = 'none';
    227             g('mask').style.display = 'none';
    228         }
    229         g('log').onclick = function(){
    230             showBox();
    231         }
    232         g('close').onclick = function(){
    233             hideBox();
    234         }
    235         /*窗口改变大小时的处理
    236         1.保持登录浮层居中
    237         2.保持遮罩的全屏,使之不会出现滚动条
    238         */
    239         window.onresize = function(){
    240             autoCenter(g('Box'));
    241             fillToBody(g('mask'));
    242         }
    243     }
    244 </script>
    245 <body>
    246 <div class="link"><a href="#" id="log">登录</a></div>
    247 <div class="main">
    248     <div class="img"><img src="img/baidu.png" /></div>
    249     <div class="item1">
    250     <ul>
    251         <li><a href="#">新闻</a></li>
    252         <li><a href="#">网页</a></li>
    253         <li><a href="#">贴吧</a></li>
    254         <li><a href="#">知道</a></li>
    255         <li><a href="#">音乐</a></li>
    256         <li><a href="#">图片</a></li>
    257         <li><a href="#">视频</a></li>
    258         <li><a href="#">地图</a></li>
    259     </ul>
    260     </div>
    261     <div class="text">
    262         <br/>
    263         <input type="text" class="txt">
    264         <input type="button" value="百度一下" class="btn">
    265     </div>
    266     <div class="item2">
    267     <ul>
    268         <li><a href="#">百科</a></li>
    269         <li><a href="#">文库</a></li>
    270         <li><a href="#">hao123</a></li>
    271         <li><a href="#">更多&gt;&gt;</a></li>
    272     </ul>
    273 </div>
    274 </div>
    275 <div class="mask" id="mask"></div>
    276 <div class="Box" id="Box">
    277 <div class="logmove" id="logmove" onselect="return false">
    278     <div class="title" id="title">
    279         登录通行证<a href="#" class="closebtn" id="close"></a>
    280     </div>
    281 </div>
    282 <div class="content">
    283     <div class="Input">
    284         <input class="username" type="text" placeholder="手机/邮箱/用户名">
    285     </div>
    286     <div class="Input">
    287         <input class="password" type="text" placeholder="密码">
    288     </div>
    289     <div class="txt1">
    290         <a href="#">忘记密码</a>
    291     </div>
    292     <div>
    293         <a href="#" class="submit">登录</a>
    294     </div>
    295     <div class="txt2">
    296         <a href="#">立即注册</a>
    297     </div>
    298 </div>
    299 </div>
    300 </body>
    301 </html>
  • 相关阅读:
    hibernate4 无法保存 不报错
    win10开启mongodb 开启服务
    nodejs学习笔记
    mariadb Too many connections
    新老ECS数据库速度对比
    数据库自动备份并打成tar.gz包
    字符串和数组----string
    I/O复用(select)——回声服务器端/客户端
    回声UDP服务器端/客户端
    回声TCP服务器端/客户端
  • 原文地址:https://www.cnblogs.com/Lovebugs/p/6422914.html
Copyright © 2020-2023  润新知