zoukankan      html  css  js  c++  java
  • jquery实现一些小动画二

    jquery实现一些小动画二

    jquery实现拖拽功能

      1 <!DOCTYPE html>
      2 <html lang="en">
      3 <head>
      4   <title>Document</title>
      5   <meta charset="UTF-8">
      6   <meta name="viewport" content="width=device-width, initial-scale=1.0">
      7   <meta http-equiv="X-UA-Compatible" content="ie=edge">
      8   <link rel="stylesheet" href="./reset.css">
      9   <script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
     10   <style>
     11     html,body{
     12       width:100%;
     13       height:100%;
     14     }
     15     .dialogmark{
     16       position:fixed;
     17       top:0;
     18       left:0;
     19       z-index:1000;
     20       width:100%;
     21       height:100%;
     22       background: rgba(0,0,0,0.3);
     23     }
     24     .dialogbox{
     25       position:fixed;
     26       width:300px;
     27       height:400px;
     28       z-index: 1001;
     29       background:#fff;
     30       overflow:hidden;
     31     }
     32     .dialogbox h3.title{
     33       height:35px;
     34       line-height:35px;
     35       padding: 0 10px;
     36       background: #DDD;
     37       cursor: move;
     38       position: relative;
     39       user-select: none;
     40     }
     41     .dialogbox h3 i {
     42       position: absolute;
     43       top:50%;
     44       right: 10px;
     45       margin-top: -10px;
     46       width: 20px;
     47       height: 20px;
     48       font-size: 16px;
     49       line-height: 20px;
     50       text-align: center;
     51       font-style: normal;
     52       cursor: pointer;
     53     }
     54   </style>
     55 </head>
     56 <body>
     57     <div class="dialogmark"></div>
     58     <div class="dialogbox">
     59       <h3 class="title">
     60         标题
     61         <i>X</i>
     62       </h3>
     63       <div class="content">
     64       </div>
     65     </div>
     66     <script>
     67       $(function(){
     68 
     69         /*
     70           拖拽的js实现
     71         */
     72         var $dialogmark = $(".dialogmark"),
     73             $dialogbox = $(".dialogbox"),
     74             $h1 = $dialogbox.children('.title'),
     75             $i = $h1.children('i'),
     76             HW = $("body").innerWidth(),
     77             HH = $("body").innerHeight(),
     78             boxW = $dialogbox.outerWidth(),
     79             boxH = $dialogbox.outerHeight();
     80 
     81         $i.click(function(){
     82           $dialogbox.hide(300)
     83         })
     84 
     85           //计算盒子位置
     86           var calPosition = function(){
     87             //获取当前窗口的大小
     88             $dialogbox.css({
     89               top:(HH - boxH)/2,
     90               left:(HW - boxW)/2
     91             })
     92           }
     93           calPosition()
     94           var dragstart = function(event){
     95             var mX = event.clientX,  //获取原始鼠标位置X位置
     96                 mY = event.clientY, //获取原始鼠标位置Y位置
     97                 boxSX = $dialogbox.position().left,
     98                 boxSY =$dialogbox.position().top;
     99               //这里可以利用传递参数,也可以给元素赋值自定义属性保存变量值
    100             $(document).on("mousemove",{mX,mY,boxSX,boxSY},dragmove)
    101           }
    102           var dragmove = function(event){
    103             var {mX,mY,boxSX,boxSY}= event.data,
    104                 mMX = event.clientX,  //移动鼠标的当前X位置
    105                 mMY = event.clientY,  //移动鼠标的当前Y位置
    106                 mcX = mMX - mX,        //鼠标改变X位置
    107                 mcY = mMY - mY,      //鼠标改变Y位置
    108                 boxcX = boxSX + mcX,  //盒子需要改变的X位置
    109                 boxcY = boxSY + mcY, //盒子需要改变的Y位置
    110                 minL = 0,   //盒子最小移动X距离
    111                 minT = 0,  //盒子最小移动Y距离
    112                 maxL = HW - boxW,//盒子最大移动X距离
    113                 maxT = HH - boxH;//盒子最大移动Y距离
    114 
    115               boxcX = boxcX < minL?minL:(boxcX>maxL?maxL:boxcX)  //X边界判断
    116               boxcY = boxcY < minT?minT:(boxcY>maxT?maxT:boxcY)  //Y边界判断
    117               $dialogbox.css({
    118                 left:boxcX,
    119                 top:boxcY
    120               })
    121           }
    122           var dragend = function(){
    123               //快速拖拽存在鼠标丢失焦点问题
    124               $(document).off("mousemove",dragmove)
    125           }
    126           $h1.mousedown(dragstart)
    127           $(document).mouseup(dragend)
    128       })
    View Code

    效果图:

      

    注意:

      拖拽中存在的问题:    

        在拖拽中存在一个问题,就是如果鼠标拖拽过快,盒子是需要计算罪行位置的,但是
        计算速度跟不上鼠标的移动速度,导致鼠标离开了盒子,那么此时鼠标的任何事件都与盒子
        无关了,即鼠标抬起不会触发接触绑定事件,鼠标移动也不会触发定义在盒子的鼠标移动事件

      解决思路:   

        1、使用setCapture与releaseCapture方法。注意google浏览器不支持这两个方法

         将鼠标与当前元素绑在一起,无论你移动多快,我都绑定在一起
           this.setCapture()
         将鼠标与当前元素解绑。与setCapture相反
           this.releaseCapture()
         2、鼠标移动在快也脱离不了document即当前文档,因此,
           我们可以给document绑定mousemove方法,那么鼠标在文档中移动都会触发mosemove绑定的事件
            注意:重新绑定document时,存在this指向(如果原本用了this)问题(解决思路:使用bind方法)

  • 相关阅读:
    flask虚拟环境
    db.Column
    flask_cors跨域请求
    app.config.from_object
    jquery链式原理.html
    swiper轮播
    jquery引用
    animate.html
    设置和获取html里面的内容.html
    jquery获取dom属性方法
  • 原文地址:https://www.cnblogs.com/lanxiansen/p/10966825.html
Copyright © 2011-2022 走看看