zoukankan      html  css  js  c++  java
  • 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>

     

    --------小尾巴 ________一个人欣赏-最后一朵颜色的消逝-忠诚于我的是·一颗叫做野的心.决不受人奴役.怒火中生的那一刻·终将结束...
  • 相关阅读:
    现代软件工程 第一章 概论 第4题——邓琨
    现代软件工程 第一章 概论 第9题——邓琨
    现代软件工程 第一章 概论 第7题——张星星
    现代软件工程 第一章 概论 第5题——韩婧
    hdu 5821 Ball 贪心(多校)
    hdu 1074 Doing Homework 状压dp
    hdu 1074 Doing Homework 状压dp
    hdu 1069 Monkey and Banana LIS变形
    最长上升子序列的初步学习
    hdu 1024 Max Sum Plus Plus(m段最大子列和)
  • 原文地址:https://www.cnblogs.com/tianxiaxuange/p/9971685.html
Copyright © 2011-2022 走看看