扒一扒offsetleft,srollleft,pagex,clientx,postion().left等精确位置的获取与理解

先上个pc端和手机端的图:

 

说明:上面的属性,都是in这个div的属性值。我是点击的in这个div的左上角,所以pageX、pageY是40。

HTML:

<div class="out">
  <div class="in"></div>
</div>

css:

.out{
    width: 300px;
    height: 300px;
    background: skyblue;
    overflow: hidden;
}
.in{
    width: 100px;
    height: 100px;
    padding: 50px;
    margin:20px;
    background: salmon;
    border: 5px solid red;
    overflow: auto;
    position: relative;
    top: 20px;
    left:20px;
}

备注:out这个div的overflow:hidden属性是必须加上去的,因为如果不加,那么in这个div设置的margin-top效果就会体现在out这个div上,即out这个div与in这个div上边线重合,out这个div会体现出margin-top的效果。

   除了设置overflow:hidden这个属性外,还可以设置:display:inline-block或者table-cell,或者设置out这个div浮动,或者在out这个div里加点内容,比如文字等也不会出现这个边线重合的情况。

注意:除了pageX/Y,clientX/clientY,screenX/screenY  获取都是通过e.XXX获取之外,其它的都能直接通过Jq或者Js获取。

   在手机端是指加了<meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" />这个meta头部

    这些不针对IE浏览器,不针对IE浏览器,不针对IE浏览器。没测试过

1.offsetXXX家族

  1)offsetWidth / offsetHeight :获取元素的可见高度值.包括边框和内部空白补丁.但超出元素的内容则不被计算。$(".in")[0].offsetWidth/offsetHeight      //js

    在pc端:

       offsetHeight = clientHeight + border + 横向滚动条(横向,横向,就是overflow-x:scroll出现的那个滚动条的高度,默认应该都是17px);

              = height(设置的高度) + border(上下border) + padding(上下padding)

      offsetWidth = clientWidth + border + 纵向滚动条(纵向,纵向,就是overflow-y:scroll出现的那个滚动条的宽度,默认应该都是17px);

                = width(设置的宽度) + border(左右border)+ padding(左右padding)

   在手机端:

      offsetHeight = clientHeight + border;手机端都不算滚动条

             = height + padding + border

      offsetWidth同理

   2)offsetTop / offsetLeft:获取相对于父级(有css定位的元素,如果没有就是body元素)距离  顶部的值/左边的值。$(".in")[0].offsetTop/offsetLeft             //js

    由图片可知道,这两个属性值都是40,那么40是怎么来的呢?in这个div设置了“相对定位属性”,top和left都是设置的是20,margin也设置的是20,由于margin是外边距,相当于把in这个div在原来的基础上偏移了20px

    所以,在这个例子里面,offsetTop / offsetLeft就是“相对定位”值top / left值加上margin的值。通俗讲就是计算该元素上边框 / 左边框与父级的距离

  3)offset().top / offset().left:这两个属性是jQuery操作css的函数。offset() 方法返回或设置匹配元素相对于文档的偏移。     $(".in").offset().top        //jq

    在这个例子里面,这两个属性和上面js的offsetTop属性的值是相等的,那么它们是一样的吗? no  no  no

    !!!我给out这个div加上margin:20px和position:relative的属性之后,js的offsetTop / offsetLeft还是40,而offset()方法得到的值就是60了。

    所以它们还是有区别的,如果父级没有设置css定位:绝对,fixed,相对这三种定位,那么offsetTop和offsetLeft和offset()方法获取到的值就是一样的,如果有css定位,offsetTop/offsetLeft就是相对于有定位的父级的距离顶部/左部的值

2.clientXXX家族

  1)clientX/clientY:相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条。        e.clientX/clientY

     在上面的例子里面,由于点击的是in这个div的左上角,即鼠标点击的位置离in这个div的左端和上端的距离是0,所以这里的clientX就是距离浏览器窗口最左边的距离,即out这个div的left值与in这个div的margin-left值之和就是clientX的值。

   2)clientWidth/clientHeight:理解为内容可视区域的高度,不包含border,不包含border,不包含border;padding是算在里面的。$(".in")[0].clientWidth         // js

    在pc端:

       clientHeight=height(设置的高度) + padding - 横向滚动条的高度,如果没有滚动条就不减;

       clientWidth=width(设置的高度) + padding - 纵向滚动条的高度,如果没有滚动条就不减;

    在手机端:

        clientHeight=height(设置的高度) + padding;

        clientWidth同理

   3)clientLeft/clientTop:表示一个元素的左边框/上边框的宽度,clientLeft是只读的。$(".in")[0].clientLeft          //js

    所以在上面的例子里面,clientLeft的值为5,因为border的left值为5。clientTop同理。

3.scrollXXX家族:

  1)scrollTop/scrollLeft:一个元素的 scrollTop 值是这个元素的顶部到它的最顶部可见内容(的顶部)的距离的度量。通俗来讲就是滚动条滚动的距离。当一个元素的内容没有产生垂直方向的滚动条,那么它的 scrollTop 值为0。$(".in").scrollTop()。     //jq         

    所以,在上面的例子里,scrollTop与scrollLeft都是点击获取的。滚动条滚动了多少,scrollTop与scrollLeft的值就为多少

   2)scrollWidth/scrollHeight:一个元素内容高度的度量,包括由于溢出导致的视图中不可见内容,没有垂直滚动条的情况下,scrollHeight值与元素视图填充所有内容所需要的最小值clientHeight相同。包括元素的padding,但不包括元素的border和margin。$(".in")[0].scrollWidth   //js   通俗来讲就是:

    scrollHeight = clientHeight + 滚动条滚动到最底部的距离

            = height(设置的高度) + padding + 滚动条滚动到最底部滚动的距离

     scrollWidth = clientWidth + 滚动条滚动到最右部的距离

           = width(设置的宽度) + padding + 滚动条滚动到最右部滚动的距离

4.pageX/pageY:

  这两个属性是鼠标指针的位置,相对于文档的左边缘。通俗来讲就是点击的位置相对整个页面的坐标。是jQuery事件。e.pageX

  pageX:在上面的例子中,由于点击的是in这个div的左上角,所以鼠标点击的位置距离in这个div最左端为0,然后,in这个div又距离左部有40的位置。所以最终结果为40

   pageY同理

5.screenX/screenY

  相对于用户显示器屏幕左上角的X,Y坐标。注意是当前显示器屏幕,当前显示器屏幕,当前显示器屏幕哦。e.screenX

     所以这里的screenX是40,因为,out这个div距离显示器屏幕的左部为20,然后in这个div的margin为20,所以最终结果为40。

     由于不清楚body距离显示屏屏幕最上端的距离是多少,所以不能口算出screenY的大小。

6.position().left/position().top

  这两个属性是jQuery的css操作方法。返回匹配元素相对于父元素的位置(偏移),需设置了定位的元素。$(".in").position().left         //jq

  在上面的例子中,in这个div设置了“相对定位”,left和top值都为20,所以这里的position().left和position().top的值都是20。如果in这个div不设置“相对定位”,那么这两个的值都为0

原文地址:https://www.cnblogs.com/zjjDaily/p/8243936.html

时间: 2024-08-24 05:51:13

扒一扒offsetleft,srollleft,pagex,clientx,postion().left等精确位置的获取与理解的相关文章

扒一扒智能手机里的隐晦财富

自2007年iPhone横空出世之后,全世界都为之倾倒,并迅速投入感情.从美国总统到地铁青年,从第一夫人到东莞站街妹,无时无刻不与智能手机产生暧昧,我们恨不得天天挂到移动互联网上欲仙欲死:每天早上醒来,首先说一句"小屏,你好":而后一天中的任何阶段:吃饭.工作.社交.上厕所全要带着手机,如果有20分钟没打开手机,90%的人就会焦虑,觉得好像跟世界失去联系一样:每天入睡前,枕头边总会有星星点点的手机灯光,饥渴的双眼正做最后的挣扎,以其获取梦中的快感-."低头族"更是作

扒一扒ReentrantLock以及AQS实现原理

提到JAVA加锁,我们通常会想到synchronized关键字或者是Java Concurrent Util(后面简称JCU)包下面的Lock,今天就来扒一扒Lock是如何实现的,比如我们可以先提出一些问题:当我们通实例化一个ReentrantLock并且调用它的lock或unlock的时候,这其中发生了什么?如果多个线程同时对同一个锁实例进行lock或unlcok操作,这其中又发生了什么? AQS ReentrantLock 羊群效应 摘要 提到JAVA加锁,我们通常会想到synchroniz

jQuery中 pageX,clientX,offsetX,layerX的区别

一.PageX和clientXPageX和clientX ,这个两个比较容易搞混,PageX:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化.可以理解为:相对#(0.0)坐标绝对定位clientX:鼠标在页面上可视区域的位置,从浏览器可视区域左上角开始,即是以浏览器滑动条此刻的滑动到的位置为参考点,随滑动条移动 而变化.可以理解为:相对可视化左上角坐标绝对定位 如图:(小黑点为点击坐标) 二.screenXscreenX:鼠标在屏幕上的位置,从屏幕左上角开始,这个

扒一扒Nodejs formidable的onPart

话说使用Nodejs实现一个文件上传,还是蛮简单的,基于Express4.x一般也就formidable用的多些吧:基本的不多说了,github一下都会的:接着<也说文件上传之兼容IE789的进度条---丢掉flash>,新版的大文件上传,最后就差断点续传了,业余跟进中...:对于IE789,在文件上传这块,算是与HTML5无缘了,当然我也选择丢掉了flash,就用最原始的input[type="file"]+hideIframe+轮询:OK,IE789可以凉快去了,BSI

pageX,clientX,offsetX,layerX的区别

在各个浏览器的JS中,有很多个让你十分囧的属性,由于各大厂商对标准的解释和执行不一样,导致十分混乱,也让我们这些前端攻城狮十分无语和纠结>_< John Resig大神说过,动态元素有3个至关重要的元素,位置,尺寸和可见性.所以,今天,先拿几个页面位置属性开刀. 一.PageX和clientX PageX和clientX ,这个两个比较容易搞混,PageX:鼠标在页面上的位置,从页面左上角开始,即是以页面为参考点,不随滑动条移动而变化clientX:鼠标在页面上可视区域的位置,从浏览器可视区域

“MF+”十一月汇:扒一扒APP的四大灵魂

这个月的MF+(妹夫家)活动又开始啦!每个月总有那么一天可以见到各个领域的大拿,小编激动得又不想减肥了. 11月28日,在这个万众瞩目的日子,所有MF+的家庭成员再次来到"言几又"咖啡店参加家族聚会啦.又是熟悉的咖啡店,又是亲切的家族成员,所有的一切都在海风凛冽的冬日给每位家族成员带来了丝丝暖意.今天来参加家族聚会的有我们的大表姐新浪网副总编闻进.二表姐viva副总裁王琳.三表姐网易新闻客户端媒拓主编王雯.大表哥豆果美食副总裁张猛.二表哥百度移动云计算测试部负责人潘钧儒.三表哥夸氪金融

View绘制详解(三),扒一扒View的测量过程

所有东西都是难者不会,会者不难,Android开发中有很多小伙伴觉得自定义View和事件分发或者Binder机制等是难点,其实不然,如果静下心来花点时间把这几个技术点都研究一遍,你会发现其实这些东西都很简单.OK,废话不多说,今天我们就来看看View的测量.View的测量纷繁复杂,不过如果能够做到提纲挈领,其实也不难.那么今天,我们就来扒一扒View的测量.本文主要涉及如下知识点: 1.View的测量 2.在父容器中对View进行测量 3.LinearLayout测量举例 4.最根上容器测量 如

8.8全民健身日,扒一扒音视频互动与健身的那些事儿

8.8全民健身日,扒一扒音视频互动与健身的那些事儿 偶然间,翻开日历,今天是8月8日——全名健身日,作为一名体育运动爱好者.IT工作者,今天就来扒一扒音视频互动与健康的哪些事儿... 北京体博会现场照片,用户正在使用AnyChat与上海世博会现场语音视频连线,并接受中央电视台等媒体采访. (北京市副市长刘敬民在爱动健身营开幕式上致辞) 集成“AnyChat在线音视频互动平台”的“爱动在线运动游戏平台”是2010北京奥运城市体育文化节的一个亮点,集中体现了现代体育的大众性.互动性和趣味性,既满足了

扒一扒Cookie和Session的那些事

首先,众所周知:cookie是客户端技术——cookie是把用户的数据写给用户的浏览器:session是服务端技术——session是把用户的数据写到用户独占的session中. 下面具体来扒一扒他们之间数据保存的区别: cookie保存用户数据的原理: Cookie是客户端技术,程序把每个用户的数据以cookie的形式写给用户各自的浏览器. 当用户使用浏览器再去访问服务器中的web资源时,就会带着各自的数据去.这样,web资源处理的就是用户各自的数据了. session保存用户数据的原理: S