那些“位置”属性,你又了解多少(offsetHeight、clientHeight、scrollHeight、offsetParent)

offsetParent:改属性返回一个对象的引用,这个对象是距离调用offsetParent的元素最近的(在包含层次中最靠近的),已进行过CSS定位的容器元素。如果这个容器元素未进行CSS定位,则offsetParent属性的取值为body元素的引用。当容器元素的style.display 被设置为“none”是(译注:IE和Opear除外),offsetParent属性返回null。

 <html>
    <head></head>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .header {
            height: 400px;
        }
        .main {
            width: 500px;
            height: 600px;
            background: #FF0;
            margin: 0 auto;
            border: 10px solid #0f0;
            position: absolute;
        }
    </style>
    <body>
        <div class="header">
        </div>
        <div class="main">
            <div class="content"></div>
        </div>
        <script>
            let content = document.getElementsByClassName('content')[0]
            // 注:此时offsetParent指向main
            // 若删除main中position属性,offsetParent指向body
            console.log(content.offsetParent)         
        </script>
    </body>
</html>

top:该属性一般对用过CSS定位的元素有效(position为“static”时为auto,不产生效果),定义了一个top属性有效的元素(即定位元素)的上外边距边界与其包含块上边界之间的偏移
clientTop:元素上边框的厚度,党没有指定边框厚度时,一般为0;

.content {
     border: 10px solid #999;
     width: 100px;
     height: 100px;
 }
console.log(content.clientTop)  // output: 10 

scrollTop: 位于对象最顶端和窗口中可见内容的最顶端之间的距离,简单说就是滚动后被隐藏的高度。

// 设置posititon(static除外)后,则相对main定位,此时输出0
// 不设置position属性,此时输出110(包含外层main的边框)
console.log(content.offsetTop)

clientHeight:该属性表示内容可视区域的高度,也就是说页面浏览器中可以看到内容的这个区域的高度。

.content {
     border: 10px solid #999;
     width: 100px;
     height: 100px;
     padding: 10px;
}
// clientHeight = padding + height
// output: 120
console.log(content.clientHeight)

scrollHeight:IE、Opera 认为 scrollHeight 是网页内容实际高度,可以小于 clientHeight。FF 认为 scrollHeight 是网页内容高度,不过最小值是 clientHeight。

offsetHeight:获取对象相对于由offsetParent属性指定的父坐标(css定位的元素或body元素)的高度。IE、Opera 认为 offsetHeight = clientHeight + 滚动条 + 边框。FF 认为 offsetHeight 是网页内容实际高度,可以小于 clientHeight。offsetHeight在新版本的FF和IE中是一样的,表示网页的高度,与滚动条无关,chrome中不包括滚动条。

// offsetHeight = padding + border + height
// output: 140
console.log(content.offsetHeight)

clientX、clientY:相对于浏览器窗口可视区域的X,Y坐标(窗口坐标),可视区域不包括工具栏和滚动条。IE事件和标准事件都定义了这2个属性。

pageX、pageY:类似于event.clientX、event.clientY,但它们使用的是文档坐标而非窗口坐标。这2个属性不是标准属性,但得到了广泛支持。IE事件中没有这2个属性。

offsetX、offsetY:相对于事件源元素(target或srcElement)的X,Y坐标,只有IE事件有这2个属性,标准事件没有对应的属性。

screenX、screenY:相对于用户显示器屏幕左上角的X,Y坐标。标准事件和IE事件都定义了这2个属性

getBoundingClientRect:用来获取元素的位置
语法:rectObject = object.getBoundingClientRect();

返回值:TextRectangle对象,每个矩形具有四个整数性质( 上, 右 , 下,和左 )表示的坐标的矩形,以像素为单位。

rectObject.top:元素上边到视窗上边的距离

rectObject.right:元素右边到视窗左边的距离

rectObject.bottom:元素下边到视窗上边的距离

rectObject.left:元素左边到视窗左边的距离

注意:在IE中,默认坐标从(2,2)开始计算,导致最终距离比其他浏览器多出两个像素。

最后附上所有代码:仅供参考

<html>
    <head></head>
    <style>
        * {
            margin: 0;
            padding: 0;
        }
        .header {
            height: 400px;
        }
        .main {
            width: 500px;
            height: 600px;
            background: #FF0;
            margin: 0 auto;
            border: 10px solid #0f0;
            /* position: absolute; */
        }
        .content {
            border: 10px solid #999;
            width: 100px;
            height: 100px;
            padding: 10px;
        }
    </style>
    <body>
        <div class="header">
        </div>
        <div class="main">
            <div class="content"></div>
        </div>
        <script>
            let content = document.getElementsByClassName('content')[0]
            let main = document.getElementsByClassName('main')[0]
            // 注:此时offsetParent指向main
            // 若删除main中position属性,offsetParent指向body
            console.log(content.offsetParent)
            console.log(content.clientTop)  // output: 10
            // 设置posititon(static除外)后,则相对main定位,此时输出0
            // 不设置position属性,此时输出110(包含外层main的边框)
            console.log(content.offsetTop)
            console.log(content.clientHeight)

            // clientHeight = padding + height
            // output: 120
            console.log(content.clientHeight)

            // offsetHeight = padding + border + height
            // output: 140
            console.log(content.offsetHeight)
        </script>
    </body>
</html>

本文参考: https://www.cnblogs.com/youziclub/p/4811069.html

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

推荐阅读更多精彩内容