js获取元素相对于父级元素的高度

在查找元素相对父元素位置时找到的资料,记录一下

第一篇:

js获取元素相对于父级元素的高度

1. offsetLeft 、offsetTop

     用于获取子元素相对于父元素的位移(左位移、上位移)

           console.log(oNode.offsetLeft);

2. offsetWidth、offsetHeight

     用于获取元素的可见宽度和可见高度

           console.log(oNode.offsetWidth);

3. clientX 、clientY

     用于获取鼠标坐标(相对于页面的坐标)

          var event = event || window.event;

           console.log(event.clientX);


offsetLeft与style.left的区别

1.     style.left返回的是字符串      //30px

         offsetLeft返回的是数值        //30

2.     style.left可读可写

        offsetLeft只读

3. style.left的值需事先定义,否则取到的值为空

        offsetLeft不需提前定义,直接获取


原文链接:http://blog.youkuaiyun.com/xiaobing_hope/article/details/51115641


第二篇

在jquery中可以使用下面的方法

  获取浏览器显示区域的高度 : $(window).height(); 
  获取浏览器显示区域的宽度 :$(window).width();
  获取页面的文档高度 :$(document).height();
  获取页面的文档宽度 :$(document).width();
  获取滚动条到顶部的垂直高度 :$(document).scrollTop();
  获取滚动条到左边的垂直宽度 :$(document).scrollLeft();

  使用javascript也是可以得到这些信息的
  网页可见区域宽: document.body.clientWidth
  网页可见区域高: document.body.clientHeight
  网页可见区域宽: document.body.offsetWidth (包括边线的宽)
  网页可见区域高: document.body.offsetHeight (包括边线的高)
  网页正文全文宽: document.body.scrollWidth
  网页正文全文高: document.body.scrollHeight
  网页被卷去的高: document.body.scrollTop
  网页被卷去的左: document.body.scrollLeft
  网页正文部分上: window.screenTop
  网页正文部分左: window.screenLeft
  屏幕分辨率的高: window.screen.height
  屏幕分辨率的宽: window.screen.width
  屏幕可用工作区高度: window.screen.availHeight
  屏幕可用工作区宽度: window.screen.availWidth
 

第三篇:

各浏览器鼠标位置测试

废话不多说,下面分别检测各个浏览器下

e.pageX , e.layerX , e.offsetX , e.clientX , e.x

测试浏览器:FF9/Chrome15/opera11.52/safari5(win)/IE6/7/8/9

测试代码:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
    <title></title>
    <link rel="stylesheet" href="http://www.cnblogs.com/../js_tool/css/debug.css">
    <style type="text/css">
        *{ margin: 0; padding: 0;}
        #view{ position: relative; left: 25px; top:25px; width: 400px; height: 100px; border: 100px solid #adff2f; background: #ff8c00;}
        #view_2{ position: absolute; left: 75px; top:375px; width: 300px; height: 100px; background: #008b8b;}
    </style>
</head>
<body>
<div id="fake" style=" position: absolute; left: 10px; top:10px; width: 3000px; height: 2000px; background: #d3d3d3; padding: 50px;">
<div id="view"></div>
<div id="view_2"></div>
</div>
<script type="text/javascript" src="http://www.cnblogs.com/../common_js/Xe.js"></script>
<script type="text/javascript" src="http://www.cnblogs.com/../js_tool/js/debug.js"></script>
<script type="text/javascript">
    var debug = new Xe.debug('调试面板1');
    debug.createPanel();
    document.onclick = function(e){
        e = e || window.event;
        debug.log('e.pageX:',e.pageX);
        debug.log('e.layerX:',e.layerX);
        debug.log('e.offsetX:',e.offsetX);
        debug.log('e.clientX:',e.clientX);
        debug.log('e.x:',e.x);
    }
</script>
</body>
</html>
图示:


测试结果如下:

chrome:

e.pageX——相对整个页面的坐标
e.layerX——相对当前坐标系的border左上角开始的坐标
e.offsetX——相对当前坐标系的border左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对可视区域的坐标

ff:

e.pageX——相对整个页面的坐标
e.layerX——相对当前坐标系的border左上角开始的坐标
e.offsetX——无
e.clientX——相对可视区域的坐标
e.x——无

opera:

e.pageX——相对整个页面的坐标
e.layerX——无
e.offsetX——相对当前坐标系的内容区域左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对可视区域的坐标

safari:(这个和chrome是一样的)

e.pageX——相对整个页面的坐标
e.layerX——相对当前坐标系的border左上角开始的坐标
e.offsetX——相对当前坐标系的border左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对可视区域的坐标

 

IE9:

e.pageX——相对整个页面的坐标
e.layerX——相对当前坐标系的border左上角开始的坐标 + 滚动条滚过的距离(这个NB轰轰了····=。=)
e.offsetX——相对当前坐标系的内容区域左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对当前坐标系的border左上角开始

IE8:

e.pageX——无
e.layerX——无
e.offsetX——相对当前坐标系的内容区域左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对当前坐标系的border左上角开始

IE7:

e.pageX——无
e.layerX——无
e.offsetX——相对当前坐标系的内容区域左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对当前坐标系的border左上角开始

IE6:

e.pageX——无
e.layerX——无
e.offsetX——相对当前坐标系的内容区域左上角开始的坐标
e.clientX——相对可视区域的坐标
e.x——相对当前坐标系的border左上角开始

 

综合为下表:

插入表格不方便,鸭梨很大啊

 

其中clientX是W3C标准的一个属性,所以都挺符合的,其他的就看浏览器厂商的心情了。

对于非IE6/7/8来说,pageX属性都可以获取到鼠标事件发生处到整个页面左边的坐标,IE6/7/8就只能通过clientX+scrollLeft来获得相同的结果。

 

需要注意的是layerX和x这两个属性。

event.x本来是IE的,但是除了FF之外,其他的也都实现了这个属性,但是opera,chrome和safari和IE的实现并不一致,opera,chrome和safari的event.x返回值和event.clientX相同

opera没有实现layerX,IE9实现了,但是IE9又是个奇葩,layerX实现得稀奇古怪。

 

layerX与offsetX

除了ff,其他浏览器都实现了offsetX,opera跟随IE系列,与IE实现相同,就是从内容区域边界开始算起,就是上面图示中的B点,chrome和safari从border边界开始算起,就是上面图示中的A点。

 

除了上面的一些区别,另外一个重要区别就是各个浏览器默认的边界零点也不一致,计算的时候还需要根据浏览器不同来补充或删减。


原文地址:http://www.cnblogs.com/xesam/archive/2011/12/08/2280509.html



<think>好的,我现在需要帮助用户解决在Vue2项目中获取DOM元素距离页面顶部高度的问题。首先,我得回顾一下用户提供的引用内容,看看有哪些方法可以实现这个功能。 用户提到了四个引用,其中引用[1]提到使用offsetTop减去scrollTop,而引用[2]和[3]则提到了使用getBoundingClientRect().top。引用[4]可能讨论了实时监听高度的方法。接下来,我需要把这些方法整理出来,并确保在Vue2中的正确使用方式。 首先,用户的问题是如何在Vue2中获取元素距离页面顶部的高度。Vue2中通常使用ref来访问DOM元素,所以需要确认如何在Vue2中正确设置ref并获取元素。然后,对于不同的方法,我需要解释它们的原理和适用场景。 方法一:使用offsetTop和scrollTop。根据引用[1],offsetTop是元素相对于offsetParent的顶部距离,而页面顶部的总距离需要累加各层父元素的offsetTop,直到根元素。或者,可以通过offsetTop减去document.documentElement.scrollTop?这里可能需要澄清,因为scrollTop是滚动条的位置,可能不直接相关。或者,正确的做法是使用getBoundingClientRect().top加上window.scrollY来得到绝对位置,因为getBoundingClientRect().top是相对于视口的,加上滚动位置就是相对于页面顶部的绝对位置。 方法二:使用getBoundingClientRect().top,如引用[2]所示。这个方法返回的是元素相对于视口顶部的位置,所以需要加上当前窗口的垂直滚动距离,才能得到相对于页面顶部的绝对位置。公式应该是:元素距页面顶部的高度 = element.getBoundingClientRect().top + window.scrollY。 接下来,我需要考虑在Vue2中的具体实现步骤。例如,如何在mounted钩子中使用$refs来获取元素,然后应用上述方法。同时,用户可能需要实时监听滚动事件来更新这个高度,这时候需要添加事件监听器,并在组件销毁前移除,以避免内存泄漏。 另外,需要注意offsetTop和getBoundingClientRect()的区别。offsetTop返回的是相对于offsetParent的顶部距离,而offsetParent可能是最近的定位祖先元素,因此如果不手动累加,可能无法准确得到相对于页面顶部的距离。而getBoundingClientRect()直接给出相对于视口的位置,加上滚动距离会更准确。 然后,需要编写示例代码,展示这两种方法在Vue2组件中的使用。同时,提醒用户在获取元素时要确保DOM已经渲染完成,比如在mounted生命周期钩子中操作。 最后,用户可能还想知道如何实时监听元素高度的变化,比如在滚动时更新数值。这时候需要添加scroll事件监听器,并在回调函数中重新计算高度。同时,在组件销毁时移除事件监听器,避免潜在的问题。 总结一下,回答的结构应该是: 1. 使用ref获取DOM元素 2. 方法一:offsetTop累加 3. 方法二:getBoundingClientRect().top + window.scrollY 4. 实时监听滚动事件 5. 注意事项,比如生命周期钩子、性能优化等 还需要确保代码示例正确,比如在模板中使用ref,在mounted中访问$refs,计算高度,以及添加和移除事件监听器。同时,引用用户提供的资料来支持方法,比如引用[1]和[2]。 可能的问题点:在方法一中,是否需要递归累加offsetParent的offsetTop,或者是否有更简单的方法?例如,element.offsetTop可能不会自动累加到根元素,因此手动累加是必要的。而方法二可能更直接准确,所以可能推荐使用第二种方法。 还需要考虑浏览器兼容性,getBoundingClientRect()和window.scrollY的兼容性如何?现代浏览器应该都支持,但如果有旧浏览器支持的需求,可能需要做兼容处理。不过Vue2通常用于现代项目,可能不需要过多考虑。 综上,整理出步骤和代码示例,并给出两种方法,解释它们的优缺点,最后提醒注意事项。</think>在Vue2中获取DOM元素距离页面顶部的高度,可以通过以下两种方法实现: --- ### 方法一:使用`offsetTop`累加计算 通过递归累加元素容器的`offsetTop`,直到根元素: ```javascript // 在mounted生命周期中操作 mounted() { const element = this.$refs.yourElementRef; let offsetTop = 0; while (element) { offsetTop += element.offsetTop; element = element.offsetParent; } console.log('距离顶部高度:', offsetTop); } ``` **原理** `offsetTop`表示元素相对于`offsetParent`(最近的定位父元素)的顶部距离,逐层累加可得到绝对高度[^1]。 --- ### 方法二:`getBoundingClientRect()` + 滚动距离 通过`getBoundingClientRect().top`获取相对视口的位置,再结合当前滚动高度: ```javascript mounted() { const rect = this.$refs.yourElementRef.getBoundingClientRect(); const topDistance = rect.top + window.scrollY; console.log('距离顶部高度:', topDistance); } ``` **优势** 直接返回元素相对于视口的精确位置,无需手动累加偏移量[^2]。 --- ### 实时监听高度变化 若需在滚动时实时更新高度: ```javascript mounted() { window.addEventListener('scroll', this.handleScroll); }, beforeDestroy() { window.removeEventListener('scroll', this.handleScroll); // 避免内存泄漏 }, methods: { handleScroll() { const rect = this.$refs.yourElementRef.getBoundingClientRect(); this.topDistance = rect.top + window.scrollY; } } ``` --- ### 注意事项 1. **确保DOM渲染完成**:操作需在`mounted`生命周期后进行。 2. **性能优化**:滚动事件频繁触发时建议添加防抖(如`lodash.throttle`)。 3. **兼容性**:`getBoundingClientRect()`和`window.scrollY`在现代浏览器中均支持。 --- ### 总结建议 - **静态计算**:优先用方法二,代码更简洁且准确。 - **动态监听**:结合滚动事件与方法二实现实时更新。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值