• CSS3_元素拖曳原理_设置全局点击捕获_九宫格碰撞检测_自定义滚动条


    拖曳原理:

    元素的初始位置 + 鼠标距离差 = 元素最终位置

     

    • 使元素可以拖动
      • function dragElement(obj){
            obj.onmousedown = function(e){
                e = e || window.event;    // 兼容 IE
                
                obj.setCapture && obj.setCapture();    // 只有 IE 支持,处理 IE8 ctrl+A
                
                // 鼠标初始坐标
                var mouseX = e.clientX;
                var mouseY = e.clientY;
                
                // 元素初始坐标
                var eleX = obj.offsetLeft;
                var eleY = obj.offsetTop;
                
                document.onmousemove = function(e){
                    e = e || window.event;
                    
                    // 鼠标新坐标
                    var newMouseX = e.clientX;
                    var newMouseY = e.clientY;
                    
                    // 元素的新坐标 = 元素初始坐标+(鼠标新坐标-鼠标初始坐标)
                    obj.style.left = eleX + newMouseX - mouseX +"px";
                    obj.style.top = eleY + newMouseY - mouseY + "px";
                };
                
                document.onmouseup = function(){
                    document.onmousemove = null;
                    document.onmouseup = null;
                    
                    obj.releaseCapture && obj.releaseCapture();
                };
                
                e.preventDefault && e.preventDefault();
                return false;    // 处理高级浏览器 ctrl+A
            };
        };

     

    拖曳: 范围限定

    超出临界值,令其等于临界值

    • 上侧临界值 = 0;

     

    • 右侧临界值 = 视窗 width - ele.offsetWidth;

     

    • 下侧临界值 = 视窗 height - ele.offsetHeight;

     

    • 左侧临界值 = 0;

     

    九宫格碰撞检测

    • ele.offsetLeft 或者 ele.offsetTop
      • 获取的是 元素在 包含块 中的坐标

     

    • ele.getBoundingClientRect();
      • 获取元素在视窗中的坐标(由该 元素.getClientRects() 返回的一组矩形集合)

     

    • function dragRangeAround(obj, borderRange, badObj){    // 要拖动的元素,吸附范围,磁性盒子
          borderRange = borderRange || 0;
          obj.onmousedown = function(e){
              e = e || window.event;
              
              obj.setCapture && obj.setCapture();    // 只有 IE 支持,处理 IE8 ctrl+A
              
              var mouseX = e.clientX;
              var mouseY = e.clientY;
              
              var eleX = obj.offsetLeft;
              var eleY = obj.offsetTop;
              
              var cDir = "noCollision";
              document.onmousemove = function(e){
                  e = e || window.event;
                  
                  var newMouseX = e.clientX;
                  var newMouseY = e.clientY;
                  
                  fixedX = eleX + newMouseX - mouseX;
                  fixedY = eleY + newMouseY - mouseY;
                  
                  var objBorder = obj.style.border && parseInt(obj.style.border);
                  if(fixedX < borderRange){
                      fixedX = 0;
                  }else if(fixedX > (document.documentElement.clientWidth-obj.offsetWidth-borderRange)){
                      fixedX = document.documentElement.clientWidth-obj.offsetWidth-objBorder*2;
                  }
                  
                  if(fixedY < borderRange){
                      fixedY = 0;
                  }else if(fixedY > (document.documentElement.clientHeight-obj.offsetHeight-borderRange)){
                      fixedY = document.documentElement.clientHeight-obj.offsetHeight-objBorder*2;
                  }
                  obj.style.left = fixedX + "px";
                  obj.style.top = fixedY + "px";
                  
                  /**** start 碰撞检测 ****/
                  if(badObj){
                      var isCollision = false;
                      
                      var badTop = badObj.getBoundingClientRect().top;
                      var badRight = badObj.getBoundingClientRect().right;
                      var badBottom = badObj.getBoundingClientRect().bottom;
                      var badLeft = badObj.getBoundingClientRect().left;
                      
                      var objRight = obj.getBoundingClientRect().right;
                      var objLeft = obj.getBoundingClientRect().left;
                      var objBottom = obj.getBoundingClientRect().bottom;
                      var objTop = obj.getBoundingClientRect().top;
                      
                      if( objRight < badLeft){
                          cDir = "left";
                          if( objRight > (badLeft-borderRange) &&
                              objBottom > badTop && objTop < badBottom){
                              obj.style.left = badLeft - obj.offsetWidth + "px";
                          }
                      }else if( objLeft > badRight ){
                          cDir = "right";
                          if( objLeft < (badRight+borderRange) &&
                              objBottom > badTop && objTop < badBottom){
                              obj.style.left = badRight + "px";
                          }
                      }else if( objBottom < badTop){
                          cDir = "top";
                          if( objBottom > (badTop-borderRange) &&
                              objRight > badLeft && objLeft < badRight){
                              obj.style.top = badTop - obj.offsetHeight + "px";
                          }
                      }else if( objTop > badBottom ){
                          cDir = "bottom";
                          if( objTop < (badBottom+borderRange) &&
                              objRight > badLeft && objLeft < badRight){
                              obj.style.top = badBottom + "px";
                          }
                      }else{
                          isCollision = true;
                      }
                  
                      if(isCollision){
                          badObj.innerHTML = cDir+"in's business";
                      }else{
                          badObj.innerHTML = cDir+"out's business";
                      }
                  }
                  /**** over ****/
              };
              
              document.onmouseup = function(){
                  document.onmousemove = null;
                  document.onmouseup = null;
                  
                  obj.releaseCapture && obj.releaseCapture();
              };
              
              e.preventDefault && e.preventDefault();
              return false;    // 处理高级浏览器 ctrl+A
          };
          return obj;
      };

     

    自定义滚动条

     

    •  
    • <!DOCTYPE html>
      <html>
          <head>
              <meta charset="UTF-8" />
              <title>自定义滚动条</title>
      
              <style type="text/css">
                  body {
                      width: 100%;
                      color: #000;
                      background: #96b377;
                      font: 14px Helvetica, Arial, sans-serif;
                  }
                  
                  html,
                  body {
                      height: 100%;
                      overflow: hidden;
                  }
                  
                  #things {
                      position: absolute;
                      top: 0px;
                      left: 0px;
                      font-size: 27px;
                      font-weight: 700;
                      color: #210202;
                      padding-right: 40px;
                  }
                  
                  /**** DIY Scroll ****/
                  #diy_scroll_box{
                      position: fixed;
                      top: 0px;
                      right: 0px;
                      z-index: 7777;
                      
                      width: 40px;
                      height: 100%;
                      background-color: #eee;
                  }
                  
                  #diy_scroll {
                      position: absolute;
                      top: 0px;
                      left: 0px;
                      z-index: 8888;
                      
                      width: 100%;
                      height: 20%;
                      background-color: #949494;
                  }
                  
                  #diy_scroll:hover {
                      background-color: #c0c0c0;
                  }
                  
                  /**** 上下按键 ****/
                  #scroll_up_btn,
                  #scroll_down_btn {
                      position: absolute;
                      z-index: 9999;
                      
                      width: 40px;
                      height: 40px;
                      background-color: #456;
                  }
                  
                  #scroll_up_btn {
                      top: 0px;
                      right: 0px;
                  }
                  
                  #scroll_down_btn {
                      bottom: 0px;
                      right: 0px;
                  }
                  
                  #scroll_up{
                      position: absolute;
                      top: -10px;
                      
                      border: 20px solid red;
                      border-top: 20px solid #f000;
                      border-right: 20px solid #f000;
                      border-left: 20px solid #f000;
                      border-bottom-color: #b3e4aa;
                  }
                  
                  #scroll_down{
                      position: absolute;
                      top: 10px;
                      
                      border: 20px solid red;
                      border-bottom: 20px solid #f000;
                      border-right: 20px solid #f000;
                      border-left: 20px solid #f000;
                      border-top-color: #b3e4aa;
                  }
                  
                  #scroll_up:hover {
                      border-bottom-color: #c5ffbb;
                  }
                  
                  #scroll_down:hover {
                      border-top-color: #c5ffbb;
                  }
                  
              </style>
          </head>
          
          <body>
              
              <div id="diy_scroll_box">
                  <div id="scroll_up_btn">
                      <div id="scroll_up">
                      </div>
                  </div>
                  
                  <div id="diy_scroll">
                  </div>
                  
                  <div id="scroll_down_btn">
                      <div id="scroll_down">
                      </div>
                  </div>
              </div>
              
              <div id="things">
                  <pre>
              
              
              
              
                  姓名:朱元璋别名(外号):朱重八、朱国瑞
      
                    性别:男
      
                    民族:汉
      
                    血型:?
      
                    学历:无文凭,秀才举人进士统统的不是,后曾自学过
      
                    职业:皇帝
      
                    家庭出身:(至少三代)贫农
      
                    生卒:1328-1398
      
                    最喜欢的颜色:黄色(这个好像没得选)
      
                    社会关系:
      
                    父亲:朱五四,农民
      
                    母亲:陈氏,农民(不好意思,史书中好像没有她的名字)
      
                    座右铭:你的就是我的,我还是我的
      
                    主要经历:
      
                    1328年-1344年放牛
      
                    1344年-1347年做和尚,主要工作是出去讨饭(这个……)
      
                    1347年-1352年做和尚主要工作是撞钟
      
                    1352年-1368年造反(这个猛)
      
                    1368年-1398年主要工作是做皇帝
      
                    一切的事情都从1328年的那个夜晚开始,农民朱五四的妻子陈氏生下了一个男婴,
                  大家都知道了,这个男婴就是后来的朱元璋。
                  大凡皇帝出世,后来的史书上都会有一些类似的怪象记载。
      
                    比如刮风啊,下暴雨啊,冒香气啊,天上星星闪啊,到处放红光啊
                  ,反正就是要告诉你,这个人和别人不一样。
                  朱元璋先生也不例外,他出生时,红光满地,夜间房屋中出现异光,以致于邻居以为失
                  火了,跑来相救(明实录)。
                  </pre>
              </div>
              
              <!-- javascript 代码 -->
              <script type="text/javascript">
                  var things = document.getElementById("things");
                  
                  /**** DIY Scroll ****/
                  var diyScroll = document.getElementById("diy_scroll");
                  var btnHeight = 40;
                  diyScroll.style.top = btnHeight+"px";
                  
                  var diyScrollHeight = document.documentElement.clientHeight-btnHeight*2;
                  var thingsScrollHeight = things.offsetHeight-document.documentElement.clientHeight;
                  
                  barHeight = diyScrollHeight*(document.documentElement.clientHeight)/things.offsetHeight;
                  diyScroll.style.height = barHeight +"px";
                      
                  var contentStartTop = 0;
                  var mouseStartY = 0;
                  var barStartY = 0;
                  
                  /**** 点击滑块 ****/
                  diyScroll.onmousedown = function(e){
                      e = e || window.event;
                      
                      diyScroll.setCapture && diyScroll.setCapture();
                      
                      mouseStartY = e.clientY;
                      barStartY = diyScroll.offsetTop;
                      contentStartTop = things.offsetTop;
                      
                      document.onmousemove = function(e){
                          e = e || window.event;
                          
                          var mouseEndY = e.clientY;
                          var barEndY = barStartY + mouseEndY - mouseStartY;
                          
                          if(barEndY < btnHeight){
                              barEndY = btnHeight;
                          }else if(barEndY > (document.documentElement.clientHeight - btnHeight - diyScroll.offsetHeight)){
                              barEndY = document.documentElement.clientHeight - btnHeight - diyScroll.offsetHeight;
                          }
                          
                          diyScroll.style.top = barEndY+"px";
                          things.style.top = contentStartTop + -thingsScrollHeight*(barEndY-barStartY)/(diyScrollHeight-barHeight) +"px";
                      };
                  
                      document.onmouseup = function(){
                          document.onmousemove = null;
                          document.onmouseup = null;
                          diyScroll.releaseCapture && diyScroll.releaseCapture();
                      }
                      
                      e.preventDefault && e.preventDefault();
                      return false;
                  };
                  
                  document.onmousewheel = scrollWheelFunc;
                  document.addEventListener && document.addEventListener("DOMMouseScroll", scrollWheelFunc, false);
                  /**** 滚轮事件 ****/
                  function scrollWheelFunc(e){
                      e = e || window.event;
                      
                      var wheelDir = 0;
                      var shouldMove = 5;
                      
                      if(e.wheelDelta){
                          wheelDir = (e.wheelDelta>0)?"up":"down";
                          shouldMove = (e.wheelDelta>0)?(-5):5;
                      }else if(e.detail){
                          wheelDir = (e.detail>0)?"down":"up";
                          shouldMove =  (e.detail>0)?5:(-5);
                      };
                      
                      var barTop = diyScroll.offsetTop;
                      var barOffset = barTop;
                      
                      barTop += shouldMove;
                      
                      if(barTop < btnHeight){
                          barTop = btnHeight;
                      }else if(barTop > (document.documentElement.clientHeight - btnHeight - diyScroll.offsetHeight)){
                          barTop = document.documentElement.clientHeight - btnHeight - diyScroll.offsetHeight;
                      };
                      
                      diyScroll.style.top =  barTop+"px";
                      
                      barOffset = barOffset - barTop;
                      
                      contentStartTop = things.offsetTop;
                      things.style.top = contentStartTop + thingsScrollHeight*barOffset/(diyScrollHeight-barHeight) +"px";
                      
                      e.preventDefault && e.preventDefault();
                      return false;
                  };
                  
                  /**** 点击按键 ****/
                  var scrollDown = document.getElementById("scroll_down_btn");
                  var scrollUp = document.getElementById("scroll_up_btn");
                  scrollUp.onclick = function(){
                      scrollBtnFunc(-5);
                  }
                  scrollDown.onclick = function(){
                      scrollBtnFunc(5);
                  }
                  
                  function scrollBtnFunc(barOffset){
                      var barTop = diyScroll.offsetTop;
                      
                      if((barTop+barOffset) < btnHeight){
                          barOffset = btnHeight - barTop;
                      }else if((barTop+barOffset) > (document.documentElement.clientHeight - btnHeight - diyScroll.offsetHeight)){
                          barOffset = document.documentElement.clientHeight - btnHeight - diyScroll.offsetHeight - barTop;
                      };
                      diyScroll.style.top = barTop+barOffset+"px";
                      
                      contentStartTop = things.offsetTop;
                      things.style.top = contentStartTop + -thingsScrollHeight*barOffset/(diyScrollHeight-barHeight) +"px";
                  
                  }
              </script>
          </body>
      </html>

     

    --------小尾巴 ________一个人欣赏-最后一朵颜色的消逝-忠诚于我的是·一颗叫做野的心.决不受人奴役.怒火中生的那一刻·终将结束...
  • 相关阅读:
    nginx + keepalived 教程
    mysql 之 获取指定月份天数和指定月份上月天数
    hive 之将sql执行结果输出到文件中
    sql 之 处理一行全为0的记录
    Shell 基础知识
    kettle 调度时出现时区问题,导致数据调出加了8小时
    sql 之按指定分割符取分割符前/后字符串
    Spring Security(二)
    Spring Security(一)
    集成Swagger文档
  • 原文地址:https://www.cnblogs.com/tianxiaxuange/p/9971685.html
Copyright © 2020-2023  润新知