热搜:前端 nest neovim nvim

js中offset、client、scroll距离属性以及获取鼠标坐标总结

lxf2023-06-26 04:01:04

offsetHeight、offsetWidth、offsetLeft、offsetTop

clientHeight、clientWidth、clientLeft、clientTop

scrollHeight、scrollWidth、scrollLeft、scrollTop

这些属性每一个都非常的眼熟,好像知道都是干啥的,但是又不是特别知道。 不是非常清楚它们之间的区别。

下面我们结合图片和文字来重新认识一下这些似曾相识的属性。

offset系列

offset翻译过来就是偏移量,我们借助offset的相关属性可以动态的得到目标元素的位置、大小信息。

常用属性如下

属性作用
element.offsetParent返回作用该元素带有定位的父级元素 如果父级元素都没有定位则返回body
element.offsetTop返回当前元素距离带有定位的父元素上方的距离(如果无父元素或者父元素无定位则返回body的距离)
element.offsetLeft返回当前元素距离带有定位的父元素左边的距离(如果无父元素或者父元素无定位则返回body的距离)
element.offsetWidth返回模板元素的宽度(padding+border+自身宽度)
element.offsetHeight返回模板元素的高度(padding+border+自身高度)

注意:通过以上方法获取的数1据均不带单位

js中offset、client、scroll距离属性以及获取鼠标坐标总结

当父元素具有定位时,offsetTop和offsetLeft表现形式如下

js中offset、client、scroll距离属性以及获取鼠标坐标总结

offset和style的区别

通过element.style同样可以获取到元素的宽高属性,那么style和offset有什么区别呢

offset的特点style的特点
offset可以得到任意样式表中的样式值style只能得到行内样式表中的样式值
offset系列获得的数值是没有单位的(数值)style.widht获取到的值是具有单位的(100px 字符串)
offsetWidth等属性是只读的style.width的属性是可赋值的
offsetWidth包含padding+border+widthstyle.widht不包含padding和border

通过以上总结可得,当我们想要获取元素大小位置时,使用offset更合适

当我们想要改变元素的相关属性时,使用style更为合适

client系列

使用client相关属性也可以获取到元素可视区的相关信息。常用的属性如下

client系列属性作用
element.clientTop返回元素上边框的大小
element.clientLeft返回元素左边框的大小
element.clientWidth返回元素宽度(padding+width)
element.clientHeight返回元素高度(padding+height)

通过上方属性可知,client与offset的主要区别就是clientWidth和clientHeight返回的值不包括border。 专门提供了clientTop和clientLeft这两个属性来获取边框的相关信息

js中offset、client、scroll距离属性以及获取鼠标坐标总结

Scroll系列

scroll系列的相关属性在开发中也经常会用到,动态的获取元素的大小,滚动距离

scroll系列属性作用
element.scrollTop返回被卷去的上侧距离(可修改)
element.scrollleft返回被卷去的左侧距离(可修改)
element.scrollWidth返回自身实际的宽度,不含边框
element.scrollHeight返回自身实际宽度,不含边框

图解

js中offset、client、scroll距离属性以及获取鼠标坐标总结

快速找到导致出现滚动条的元素

function findscroller(element){
    element.onscroll=function () {
        console.log(element)
    }
    Array.from(element.children).forEach(findscroller)
}
findscroller(document.body)
element.scrollTo({
  top: 100,
  left: 100,
  behavior: 'smooth'
});

offset、client、scroll相关属性总结

  1. offset系列经常用于获取元素的位置 offsetLeft offsetTop

  2. client经常用于获取元素大小 clientWidth clientHeight

  3. scroll经常用于获取滚动距离 scrollTop scrollLeft

  4. 想要修改元素的大小相关属性时,使用style直接修改

  5. 注意监听页面滚动距离要使用window.pageXOffset获取

element.scrollIntoView({ behavior: 'smooth' })

scrollIntoView 让element出现在窗口可视区域

在开发中经常会遇到这样的需求

当表单校验失败时,让校验失败的表单项出现在窗口可视范围内。借助scrollIntoView方法可以轻松实现该效果

使用方法如下

js中offset、client、scroll距离属性以及获取鼠标坐标总结

const element = document.getElementById("box");

element.scrollIntoView();
element.scrollIntoView(false);
element.scrollIntoView({ block: "end" });
element.scrollIntoView({ behavior: "smooth", block: "end", inline: "nearest" });

js中offset、client、scroll距离属性以及获取鼠标坐标总结

表单校验错误滚动到首个错误的元素 参数为所有错误元素的数组

export const errorScroll = (element) => {
  if (element && element.length) {
    let target = element[0].parentElement;
    target.scrollIntoView && target.scrollIntoView({ behavior: 'smooth' });
  }
};

  saveSalaryInfo() {
      //基本信息成功跳转到第二步
      this.$refs['basicInfoForm'].validate(valid => {
        if (valid) {
          // 发送请求
        } else {
          this.$nextTick(() => {
            this.errorScroll(
              document.querySelectorAll('div.el-form-item__error')
            )
          })
        }

获取鼠标的坐标

鼠标的坐标有以下这几种,通过事件的event对象获取

  1. clientX/clientY:鼠标在页面上可视区域的位置是从浏览器可视区域左上角开始,即是以浏览器滑动条此刻的滑动到的位置为参考点,随滑动条移动 而变化。(不兼容Safari)
  2. offsetX/offsetY:鼠标以当前事件的目标对象左上角为原点,来定位。(不支持Mozilla)
  3. PageX/PageX:鼠标在页面上的位置,是以document对象为参考点,即当前整个网址页面为参考点。(不支持IE)
  4. screenX/screenY:鼠标以计算机屏幕为原点,来定位。(主流浏览器都支持)
  5. layerX/layerY:鼠标相比较于当前坐标系的位置,即如果触发元素没有设置绝对定位或相对定位,以页面为参考点,如果有,将改变参考坐标系,从触发元素盒子模型的border区域的左上角为参考点。(只支持Mozilla,Safari)
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
    <style>
        div{
            width: 200px;
            height: 200px;
            position: absolute;
            top: 50%;
            left: 50%;
            background-color: pink;
        }
    </style>
</head>
<body>
    <div>

    </div>
    <script>
        var div=document.querySelector('div');
        div.addEventListener('mousemove' , function (e) {

            console.log('e.clientX=',e.clientX,"-----","e.clientY=",e.clientY)
            console.log('e.offsetX=',e.offsetX,"-----","e.offsetY=",e.offsetY)
            console.log('e.PageX=',e.pageX,"-----","e.PageY=",e.pageY)
            console.log('e.screenX=',e.screenX,"-----","e.screenY=",e.screenY)
            console.log('e.layerX=',e.layerX,"-----","e.layerY=",e.layerY)
            console.log('---------------------------------------------------------')
            var x= e.pageX - this.offsetLeft;
            var y = e.pageY - this.offsetTop;
            div.innerHTML='距离左侧'+x+'距离顶部'+y;
        })
    </script>
</body>
</html>
本网站是一个以CSS、JavaScript、Vue、HTML为核心的前端开发技术网站。我们致力于为广大前端开发者提供专业、全面、实用的前端开发知识和技术支持。 在本网站中,您可以学习到最新的前端开发技术,了解前端开发的最新趋势和最佳实践。我们提供丰富的教程和案例,让您可以快速掌握前端开发的核心技术和流程。 本网站还提供一系列实用的工具和插件,帮助您更加高效地进行前端开发工作。我们提供的工具和插件都经过精心设计和优化,可以帮助您节省时间和精力,提升开发效率。 除此之外,本网站还拥有一个活跃的社区,您可以在社区中与其他前端开发者交流技术、分享经验、解决问题。我们相信,社区的力量可以帮助您更好地成长和进步。 在本网站中,您可以找到您需要的一切前端开发资源,让您成为一名更加优秀的前端开发者。欢迎您加入我们的大家庭,一起探索前端开发的无限可能!