zoukankan      html  css  js  c++  java
  • JavaScript--获取页面盒子中鼠标相对于盒子上、左边框的坐标

    分析:

    外层边框是浏览器边框,内部盒子是页面的一个盒子,绿点是盒子中鼠标的位置。鼠标相对盒子边框的坐标=页面中(注意不是浏览器)鼠标坐标-盒子相对于浏览器边框的偏移量

    第一步:求浏览器边框位置

    x=element.offsetLeft;

    y=element.offsetTop;

    代码如下:

     1 /*************样式表********************/
     2 <style>
     3             *{
     4                 padding: 0px;
     5                 margin: 0px;
     6             }
     7             body {
     8                 height: 2000px;
     9             }
    10             #box{
    11                 border: 1px solid black;
    12                 margin: 100px;
    13                  400px;
    14                 height: 400px;
    15             }
    16 </style>
    17 
    18 
    19 /*************网页主体********************/
    20 <body>
    21         <div id="box"></div>
    22                 /*************JS代码********************/
    23         <script>
    24             //获取盒子边框相当于浏览器边框的距离
    25             var box=document.getElementById('box');
    26             var x=box.offsetLeft;
    27             var y=box.offsetTop;
    28             console.log(x);
    29             console.log(y);
    30         </script>
    31 </body>

    第二步:求鼠标在页面中的位置

    鼠标在页面中的位置:

    e.PageX  e.PageY ---------->鼠标在整个文档中的位置

    e.ClientX  e.ClientY --------->鼠标在整个浏览器中的位置

    上面二者的区别在于文档中有没有滚动条,如果有滚动条,则两个不一样,没有滚动条的情况下,二者没有区别。在本文要求中,需要使用e.PageX  e.PageY

    不过,e.PageX  e.PageY有浏览器兼容性问题,从IE9以后才支持。

    e.PageX=e.ClientX+滚动条滚动距离

    e.PageY=e.ClientY+滚动条滚动距离

    滚动条滚动距离也具有浏览器兼容问题,浏览器兼容问题解决如下:

    2.1 滚动条的滚动距离的兼容问题

    一般求滚动条滚动距离有两种方式,如下:

    第一种:

    scroll_x=document.body.scrollLeft

    scroll_y=document.body.scrollTop

    第二种:

    scroll_x=document.documentElement.scrollLeft;

    scroll_y=document.documentElement.scrollTop;

    但是发现使用第一种方式,获得的滚动条滚动距离一直是0。

    查资料发现是DTD的问题。

    页面指定了DTD,即指定了DOCTYPE时,使用document.documentElement.scrollTop。

    页面没有DTD,即没指定DOCTYPE时,使用document.body.scrollTop。
    当然,针对上述问题,本文做了如下调整:

    //滚动条滚动距离
    var scroll_x=document.body.scrollLeft || document.documentElement.scrollLeft;
    var scroll_y=document.body.scrollTop || document.documentElement.scrollTop;

    2.2e.PageX  e.PageY有浏览器兼容性问题

    var page_x=e.pageX || e.clientX + scroll_x;
    var page_y=e.pageY || e.clientY + scroll_y;

    第二步和第一步做差,即能得到获取页面盒子中鼠标相对于盒子上、左边框的坐标

    具体代码如下:

     1 <!DOCTYPE html>
     2 <html lang="en">
     3     <head>
     4         <meta charset="UTF-8">
     5         <title>Document</title>
     6         <style>
     7             *{
     8                 padding: 0px;
     9                 margin: 0px;
    10             }
    11             body {
    12                 height: 2000px;
    13             }
    14             #box{
    15                 border: 1px solid black;
    16                 margin: 100px;
    17                  400px;
    18                 height: 400px;
    19             }
    20         </style>
    21     </head>
    22 
    23     <body>
    24         <div id="box"></div>
    25         <script>
    26             //获取盒子边框相当于浏览器边框的距离
    27             var box=document.getElementById('box');
    28             var box_x=box.offsetLeft;
    29             var box_y=box.offsetTop;
    30         
    31          //滚动条滚动距离
    32          var scroll_x=document.body.scrollLeft || document.documentElement.scrollLeft;
    33          var scroll_y=document.body.scrollTop || document.documentElement.scrollTop;
    34          
    35          
    36          
    37          
    38          //鼠标点击事件
    39          document.onclick=function(e){
    40              //e.pageX  e.pageY坐标
    41              var page_x=e.pageX || e.clientX + scroll_x;
    42              var page_y=e.pageY || e.clientY + scroll_y;
    43              //相对坐标
    44              var x=page_x - box_x;
    45              var y=page_y - box_y;
    46              console.log(x);
    47              console.log(y);
    48          }
    49         </script>
    50     </body>
    51 </html>
  • 相关阅读:
    转发:前端新人少走弯路
    react 表单(受控组件和非受控组件)
    axios封装的拦截器的应用
    react与redux的一点心得(理解能力有限,蜗牛进度)
    redux一些自习时候自己写的的单词
    react路由的跳转和传参
    学以致用,react学习前奏准备阶段
    原型,原型链,给予原型和class的继承
    rpm安装和卸载
    .net项目发布到iis
  • 原文地址:https://www.cnblogs.com/WangYujie1994/p/10249060.html
Copyright © 2011-2022 走看看