归纳篇(三)js获取页面的各种距离和坐标

一.js获取页面各种距离

1.screen系列

  • screen.width:屏幕的宽度
  • screen.height:屏幕的高度

2.style系列(必须是行内设置样式才有效)

  • element.style.width:当前对象的宽度。
  • element.style.height:当前对象的高度。
  • element.style.left:当前对象的left值。
  • element.style.top:当前对象的top值。
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>demo</title>
<style type="text/css">
*{padding: 0;margin: 0;}
html,body{height: 100%; margin:0; padding:0;}
.wrap{height: 1900px;background: #000;}
</style>
</head>
<body>
<!--设置百分百宽度-->
<div class="wrap" id="wrap" style="width: 80%"></div>
<script type="text/javascript">
    window.onload=function(){
        var wrap=document.getElementById("wrap");
        var styleW=wrap.style.width;
        var styleH=wrap.style.height;
        var oW=wrap.offsetWidth;
        console.log(styleW);//返回80%
        console.log(styleH);//没有在行内样式设置,无效,返回空值
        console.log(oW);//返回的是数字
    }
</script>
</body>
</html>

3.offset系列

  • element.offsetParent:当前对象的上级层对象。
  • element.offsetWidth:当前对象的宽度。(width+padding+border)
  • element.offsetHeight:当前对象的高度。(Height+padding+border)
  • element.offsetLeft:当前对象到其上级层左边的距离 。
  • element.offsetTop:当前对象到其上级层上边的距离 。
  • element.offsetWidthstyle.width区别:
    1.style.width返回值除了数字外还带有单位px;
    2.如对象的宽度设定值为百分比宽度,则无论页面变大还是变小,style.width都返回此百分比,而offsetWidth则返回在不同页面中对象的宽度值而不是百分比值;
    3.如果没有给 HTML 元素指定过 width样式,则 style.width 返回的是空字符串;
    4.style.width不包含border和padding
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>demo</title>
<style type="text/css">
*{padding: 0;margin: 0;}
html,body{height: 100%; margin:0; padding:0;}
.wrap{width: 600px;height: 600px;background: #000;border: 3px solid green;position: relative;}
.box{width:300px;height: 400px; border: 5px solid #fff;padding:5px;margin: 30px}
</style>
</head>
<body>
<div class="wrap" id="wrap">
    <div class="box" id="box"></div>
</div>
<script type="text/javascript">
    window.onload=function(){
        var wrap=document.getElementById("wrap");
        var box=document.getElementById("box");
        var oW=box.offsetWidth;
        var oT=box.offsetTop;
        console.log(oW);//返回320,包含padding+border+width
        console.log(oT);//返回30,不包含父级的border
    }
</script>

4.client系列

  • element.clientWidth: 获取对象可见内容的宽度,不包括滚动条,不包括边框;
  • element.clientHeight: 获取对象可见内容的高度,不包括滚动条,不包括边框;
  • element.clientLeft: 获取对象的border宽度
  • element.clientTop:获取对象的border高度

5.scroll系列

  • element.scrollWidth:获取对象的滚动宽度 。
  • element.scrollHeight: 获取对象的滚动高度。
  • element.scrollLeft:设置或获取位于对象左边界和对象中目前可见内容的最左端之间的距离(width+padding为一体)
  • element.scrollTop:设置或获取位于对象最顶端和对象中可见内容的最顶端之间的距离;(height+padding为一体)
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>demo</title>
<style type="text/css">
*{padding: 0;margin: 0;}
html,body{height: 100%; margin:0; padding:0;}
.wrap{width: 600px;height: 600px;border: 3px solid green;position: relative;}
.box{width:300px;height: 400px; border: 3px solid red;padding:5px;margin: 30px;overflow: auto;}
.box p{font-size: 20px;line-height: 36px;}
</style>
</head>
<body>
<!-- 设置父级 -->
<div class="wrap" id="wrap">
    <div class="box" id="box">
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
        <p>测试</p>
    </div>
</div>
<script type="text/javascript">
    window.onload=function(){
        var wrap=document.getElementById("wrap");
        var box=document.getElementById("box");
        var oW=box.offsetWidth;
        var oH=box.offsetHeight;
        var oT=box.offsetTop;
        var cW=box.clientWidth;
        var cH=box.clientHeight;
        var cT=box.clientTop;
        console.log('box.offsetWidth:'+oW);//返回box.offsetWidth:316
        console.log('box.offsetHeight:'+oH);//返回box.offsetHeight:416
        console.log('box.offsetTop:'+oT);//返回box.offsetTop:30
        console.log('box.clientWidth:'+cW);//返回box.clientWidth:293
        console.log('box.clientHeight:'+cH);//返回box.clientHeight:410
        console.log('box.clientTop:'+cT);//返回box.clientTop:3
        console.log('box.scrollWidth:'+sW);//返回box.scrollWidth:293
        console.log('box.scrollHeight:'+sH);//返回box.scrollHeight:1018
    }
</script>
</body>
</html>

document.body和document.documentElement兼容问题

  • body是DOM对象里的body子节点,即 <body> 标签;documentElement 是整个节点树的根节点root,即<html> 标签;
  • 整个文档的一个根就是,在DOM中可以使用document.documentElement来访问它,它就是整个节点树的根节点。而body是子节点,要访问到body标签,在脚本中可以写:document.body。
  • 参考链接 clientHeight , scrollHeight , offsetHeight之间的区别及兼容方案
  • JS中完美兼容各大浏览器的scrolltop方法
var scrollTop = document.documentElement.scrollTop || window.pageYOffset || document.body.scrollTop;

二.js获取页面坐标数据

1.client系列

  • event.clientX :设置或获取鼠标指针位置相对于当前窗口的 x 坐标,其中客户区域不包括窗口自身的控件和滚动条。
  • event.clientY: 设置或获取鼠标指针位置相对于当前窗口的 y 坐标,其中客户区域不包括窗口自身的控件和滚动条。

2.screen系列

  • event.screenX: 设置或获取获取鼠标指针位置相对于用户屏幕的 x 坐标。
  • event.screenY: 设置或获取鼠标指针位置相对于用户屏幕的 y 坐标。

3.offset系列

  • event.offsetX:,鼠标相比较于触发事件的元素的X位置,以元素盒子模型的内容区域的左上角为参考点,如果有boder,可能出现负值。
  • event.offsetY:同上,Y位置。

4.layer系列(IE8以及以下版本没有)

  • event.layerX:鼠标相比较于当前坐标系的X位置,即如果触发元素没有设置绝对定位或相对定位,以页面为参考点,如果有,将改变参考坐标系,从触发元素盒子模型的border区域的左上角为参考点
  • event.layerY:同上,Y位置。

5.XY系列(FF没有)

  • event.x:相对可视区域的X坐标
  • event.y:相对可视区域的Y坐标

6.page系列 (IE8以及以下版本没有)

  • 类似于event.clientXevent.clientY,但它们使用的是文档坐标而非窗口坐标。。
  • event.pageX:设置或获取鼠标指针位置相对于当前文档的 x 坐标
  • event.pageY:设置或获取鼠标指针位置相对于当前文档的 y 坐标
document.onclick = function(e){
        e = e || window.event;
        console.log('e.clientX:',e.clientX);
        console.log('e.screenX:',e.screenX);
        console.log('e.offsetX:',e.offsetX);
        console.log('e.layerX:',e.layerX);
        console.log('e.pageX:',e.pageX);
        console.log('e.x:',e.x);
    }

三、jQuery对应写法

整理了这么多,复习了一遍有些概念在心中归类更明确了点,如有错误,欢迎指证。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,125评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,293评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,054评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,077评论 1 291
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,096评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,062评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,988评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,817评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,266评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,486评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,646评论 1 347
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,375评论 5 342
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,974评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,621评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,642评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,538评论 2 352

推荐阅读更多精彩内容