Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

网页关键数据与坐标 #63

Open
coconilu opened this issue Aug 27, 2018 · 0 comments
Open

网页关键数据与坐标 #63

coconilu opened this issue Aug 27, 2018 · 0 comments

Comments

@coconilu
Copy link
Owner

coconilu commented Aug 27, 2018

概述

在前端开发的过程中,往往会遇到需要判断一个元素是否在可见视窗内的需求。

其实很简单,就是在window上注册scroll事件,然后获取一个元素的绝对定位(相对于网页左上角的距离)减去滚动条的垂直偏离距离(pageYOffset || scrollY)是不是在可见视窗(viewport)的高度范围内。

我们继续拓展,在这篇文章你将会知道如何获取下面的几个关键值:

  1. 显示器的宽高和浏览器最大的宽高
  2. 浏览器实际的宽高
  3. 可视窗口的宽高
  4. 整个网页的宽高
  5. 网页的显示部分的宽高
  6. 滚动条的偏移距离
  7. 元素的绝对定位、相对定位

罗列相关的Web API

  1. screen
width,屏幕的宽度
height,屏幕的高度
availWidth,浏览器最大化的宽度
availHeight,浏览器最大化的高度
  1. window
screenX,浏览器距离显示器左边界的距离
screenY,浏览器距离显示器顶部的距离
pageYOffset | scrollY,滚动条垂直偏移量
pageXOffset | scrollX,滚动条水平偏移量
innerHeight,浏览器内可视窗口的高度(包括滚动条)
innerWidth,浏览器内可视窗口的宽度(包括滚动条)
outerHeight,浏览器实际的高度
outerWidth,浏览器实际的宽度
  1. document
documentElement,返回文档对象(document)的根元素的只读属性(如HTML文档的 <html> 元素)
body,返回当前文档中的<body>元素或者<frameset>元素
[documentElement | body].clientHeight,网页在可视窗口内的高度(不包括滚动条)
[documentElement | body].clientWidth,网页在可视窗口内的宽度(不包括滚动条)
[documentElement | body].scrollTop,网页在垂直方向上的滚动距离(几乎等于window.scrollY)
[documentElement | body].scrollLeft,网页在水平方向上的滚动距离(几乎等于window.scrollX)
[documentElement | body].scrollHeight,网页在垂直方向上可滚动的距离(相当于网页高度)
[documentElement | body].scrollWidth,网页在水平方向上可滚动的距离(相当于网页宽度)
compatMode,BackCompat | CSS1Compat,是否是quirks模式或标准模式
  1. HTMLElement
clientHeight,表示元素可显示的高度(以像素表示),包含内边距,但不包括水平滚动条、边框和外边距。
clientWidth,表示元素显示的宽度(以像素表示),该属性包括内边距,但不包括垂直滚动条(如果有)、边框和外边距。
clientTop,表示一个元素顶部边框的宽度(以像素表示),不包括顶部外边距或内边距
clientLeft,表示一个元素的左边框的宽度(以像素表示)
scrollHeight,元素可垂直滚动内容的高度
scrollWidth,元素可水平滚动内容的宽度
scrollTop,元素已垂直滚动内容的高度
scrollLeft,元素已水平滚动内容的宽度
offsetParent,返回一个指向最近的(closest,指包含层级上的最近)包含该元素的定位元素(非static)。如果没有定位的元素,则 offsetParent 为最近的 table, table cell 或根元素(标准模式下为 html;quirks 模式下为 body)
offsetTop,相对于其 offsetParent 元素的顶部的距离
offsetLeft,相对于其 offsetParent 元素的左边界的距离
offsetHeight,表示一个元素的布局高度,包括元素的边框、内边距和元素的水平滚动条(如果存在且渲染的话),不包含:before或:after等伪类元素的高度。
offsetWidth,表示一个元素的布局宽度。
getBoundingClientRect(),返回元素左上角和右下角相对可视窗口的左上角的距离

getBoundingClientRect()的返回值:x、y表示坐标;top、bottom、left、right表示与可视窗口左上角的距离;width、height表示宽高。

记忆小卡片:offsetHeight指的是元素的布局高度(包括边框、内边距,但不包括外边距),clientHeight指的是元素的内部高度(仅包括内边距,但不包括外边距、边框),clientTop指的是上边框的宽度。

document.compatMode

BackCompat 对应quirks mode
CSS1Compat 对应strict mode

  1. 在Standars mode中:

元素真正的宽度 = margin-left + border-left-width + padding-left + width + padding-right + border-right-width + margin-right;

  1. 在Quirks mode中:

width则是元素的实际宽度,内容宽度 = width - (margin-left + margin-right + padding-left + padding-right + border-left-width + border-right-width)

  1. 在Standars mode中,使用document.documentElement;在Quirks mode中,使用document.body

兼容性获取垂直或水平已滚动距离

MDN推荐:

var x = (window.pageXOffset !== undefined) ? window.pageXOffset : (document.documentElement || document.body.parentNode || document.body).scrollLeft;
var y = (window.pageYOffset !== undefined) ? window.pageYOffset : (document.documentElement || document.body.parentNode || document.body).scrollTop;

另一种:

export default function getScrollTop() {
  return window.pageYOffset || (document.compatMode && document.compatMode != 'BackCompat' && document.documentElement.scrollTop) || (document.body && document.body.scrollTop)
}

还有一种:

function getOffSetY() {
  return document.body.scrollTop || document.documentElement.scrollTop || window.pageYOffset;
}

参考

浏览器的各种位置值获取
document.compatMode的CSS1compat使用介绍
document.compatMode介绍

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant