文档坐标和视口坐标
视口坐标是相对于窗口的坐标,而文档坐标是相对于整个文档而言。例如,在文档坐标中如果一个元素的相对于文档的Y坐标是200px,并且用户已经把浏览器向下滚动了75px,那么视口坐标中元素的Y坐标为200px – 75px = 125px。
如何获取浏览器滚动条的位置?Window对象的pageXOffset和pageYOffset属性在所有浏览器中提供这些值,除IE8以及更早的版本。IE和所有现代浏览器也可以通过scrollLeft和scrollTop属性获取滚动条位置。
下面代码的getScrollOffsets方法获取滚动条位置:
//以一个对象的x和y属性放回滚动条的位置
function getScrollOffsets(w){
w = w || window;
//除了IE 8以及更早的版本以外,其他浏览器都支持
if(w.pageXOffset != null) return {x: w.pageXOffset, y: w.pageYOffset};
//对标准模式下的IE
var d = w.document;
if(document.compatMode == "CSS1Compat")
return {x: d.documentElement.scrollLeft, y: d.documentElement.scrollTop};
//对怪异模式下的浏览器
return { x: d.body.scrollLeft, y: d.body.scrollTop};
}
复制代码
有时候能够判定视口的尺寸也是非常有用的,下面的代码简便地查询视口尺寸:
//作为一个对象的w和h属性返回视口的尺寸
function getViewportSize(w){
//使用指定的窗口, 如果不带参数则使用当前窗口
w = w || window;
//除了IE8及更早的版本以外,其他浏览器都能用
if(w.innerWidth != null)
return {w: w.innerWidth, h: w.innerHeight};
//对标准模式下的IE(或任意浏览器)
var d = w.document;
if(document.compatMode == "CSS1Compat")
return {w: d.documentElement.clientWidth, h: d.documentElement.clientHeight};
//对怪异模式下的浏览器
return {w: d.body.clientWidth, h: d.body.clientHeight};
}
复制代码
上面的两个例子已经使用到scrollLeft、scrollTop、clientWidth、clientHeight。 scrollLeft和scrollTop获取滚动条位置,而clientWidth和clientHeight获取对象的尺寸。
查询元素的几何尺寸
判定一个元素的尺寸和位置最简单的方法是调用它的getBoundingClientRect()方法。该方法是在IE5中引入的,而现在当前的所有浏览器都实现了。它不需要参数,返回left、right、top、bottom属性的对象。
这个方法返回元素在视口坐标中的位置。为了转换为甚至用户滚动浏览器窗口以后任然有效的文档坐标,需要加上滚动偏移量:
//元素相对于文档的坐标位置
function getElementRect(e){
var box = e.getBoundingClientRect();
var offsets = getScrollOffsets();
var x = box.left + offsets.x;
var y = box.top + offsets.y;
return {x:x, y: y};
}
复制代码
在很多浏览器中,getBoundingClientRect()返回的对象还包括width和height属性。但在原始的IE中未实现。可以这样计算元素的width和height:
//元素尺寸
function getElementSize(e){
var box = getElementRect(e);
var w = box.width || box.right - box.left;
var h = box.height || box.bottom - box.top;
return {w: w, h: h};
}
复制代码
滚动元素
之前的getScrollOffsets方法可以查询滚动条的位置。该例子的scrollLeft和scrollTop属性可以用来设置让浏览器滚动,但有一种更简单的方法从Javascript最早时期开始支持的。Window对象的scrollTop()方法接口一个点的X和Y坐标(文档坐标),并作为滚动条的偏移量设置它们。下面代码滚动浏览器到文档最下面的页面可见:
//滚动到浏览器最底部
function scrollToBottom(){
//获取文档和视口的高度
var documentHeight = document.documentElement.offsetHeight;
var viewportHeight = window.innerHeight; //或使用上面的getViewPortSize()方法
//然后,滚动让最后一页在视口中可见
window.scrollTo(0, documentHeight - viewportHeight);
}
复制代码
Window的scrollBy方法和scroll()和scrollTo()类似,但是它的参数是相对的,并在当前滚动条的偏移量上增加。例如,快速阅读者可能会喜欢这样:
javascript:void setInterval(function(){scrollBy(0, 10)}, 200);
复制代码
如果想让某个元素在文档中可见,可以利用getBoundingClientRect()计算元素的位置,并转换为文档坐标,然后使用scrollTo()方法达到目的。但在需要显示Html元素上调用scrollIntoView()方法更方便。
scrollIntoView()的行为与设置window.location.hash为一个命名锚点的名字后浏览器产生的行为类似。
元素尺寸、位置和溢出
任何HTML元素的只读属性offsetWidth和offsetHeight以CSS像素返回它的屏幕尺寸。返回的尺寸包含元素的边框和内边距,除去了外边距。
所有HTML元素拥有offsetLeft和offsetTop属性来返回元素的X和Y坐标。这些值是文档坐标,并直接指定元素的位置。当对于已定位元素的后代元素和一些其他元素,这些属性返回的坐标是相对于祖先元素的而非文档。
offsetParent属性指定这些属性所相对的父元素。如果offsetParent为null,这些属性都是文档坐标,因此,一般来说,用offsetLeft和offsetTop来计算元素e的位置需要一个循环:
//计算元素位置
function getElementPosition(e){
var x = 0, y = 0;
while(e != null){
x += e.offsetLeft;
y += e.offsetTop;
e = e.offsetParent;
}
return {x: x, y: y };
}
复制代码
getElementPosition函数也不总是计算正确的值,下面看如何修复它。除了这些名字以offset开头的属性以外,所有的文档元素定义了其他两组属性,名字一组以client开头,另一组以scroll开头。即每个元素都有以下这些属性:
我问问.png
为了理解client和scroll属性,你需要知道元素的实际内容可能比分配用来容纳的盒子更大,因此单个元素可能有滚动条。内容区域是视口,就像浏览器窗口,当实际内容比视口大,需要把元素滚动套位置考虑进去。
clientWidth和clientHeight类似offsetWidth和offsetHeight,区别在于它们不包含边框大小。只包含内容和内边距。同时,如果浏览器在内边距和边框之间添加了滚动条,clientWidth和clientHeight不包含滚动条尺寸。在文档的根元素上查询这些属性时,它们的返回值和窗口的innerWidth和innerHeight属性值相等。
clientLeft和clientTop属性没什么用:它们返回元素的内边距的外边框和它的边框的外边缘之间的水平距离和垂直距离。
scrollWidth和scrollHeight是元素的内容区域加上它的内边距再加上任何溢出内容的尺寸。当内容正好和内容区域匹配没溢出时,这些属性与clientWidth和clientHeight相等。有溢出时,包含了溢出的内容尺寸。
scollLeft和scrollTop指定元素滚动条的位置。在getScrollOffsets()方法中查询过它们。注意,scrollLeft和scrollTop是可写的,通过设置它们来让元素中的内容滚动(HTML元素并没有类似Window对象的scrollTo()方法。
DEMO
下面代码介绍了前面几个函数的使用:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
<script type="text/javascript">
//以一个对象的x和y属性放回滚动条的位置
function getScrollOffsets(w){
w = w || window;
//除了IE 8以及更早的版本以外,其他浏览器都支持
if(w.pageXOffset != null) return {x: w.pageXOffset, y: w.pageYOffset};
//对标准模式下的IE
var d = w.document;
if(document.compatMode == "CSS1Compat")
return {x: d.documentElement.scrollLeft, y: d.documentElement.scrollTop};
//对冠以模式下的浏览器
return { x: d.body.scrollLeft, y: d.body.scrollTop};
}
//作为一个对象的w和h属性返回视口的尺寸
function getViewportSize(w){
//使用指定的窗口, 如果不带参数则使用当前窗口
w = w || window;
//除了IE8及更早的版本以外,其他浏览器都能用
if(w.innerWidth != null)
return {w: w.innerWidth, h: w.innerHeight};
//对标准模式下的IE(或任意浏览器)
var d = w.document;
if(document.compatMode == "CSS1Compat")
return {w: d.documentElement.clientWidth, h: d.documentElement.clientHeight};
//对怪异模式下的浏览器
return {w: d.body.clientWidth, h: d.body.clientHeight};
}
//元素相对于文档的坐标位置
function getElementRect(e){
var box = e.getBoundingClientRect();
var offsets = getScrollOffsets();
var x = box.left + offsets.x;
var y = box.top + offsets.y;
return {x:x, y: y};
}
//元素尺寸
function getElementSize(e){
var box = getElementRect(e);
var w = box.width || box.right - box.left;
var h = box.height || box.bottom - box.top;
return {w: w, h: h};
}
//滚动到浏览器最底部
function scrollToBottom(){
//获取文档和视口的高度
var documentHeight = document.documentElement.offsetHeight;
var viewportHeight = window.innerHeight; //或使用上面的getViewPortSize()方法
//然后,滚动让最后一页在视口中可见
window.scrollTo(0, documentHeight - viewportHeight);
}
//计算元素位置
function getElementPosition(e){
var x = 0, y = 0;
while(e != null){
x += e.offsetLeft;
y += e.offsetTop;
e = e.offsetParent;
}
return {x: x, y: y };
}
</script>
</head>
<body>
<button id="scrolltoBottomBtn">滚动到浏览器</button>
<div style="height: 400px; background: red;">
</div>
<button id="btn">获取滚动条位置</button>
<button id="viewportBtn">获取视口尺寸</button>
<button id="eleRectBtn">元素文档坐标</button>
<script type="text/javascript">
var btn = document.getElementById("btn");
btn.onclick = function(event){
console.log(getScrollOffsets());
}
var viewportBtn = document.getElementById("viewportBtn");
viewportBtn.onclick = function(event){
console.log(getViewportSize());
}
var eleRectBtn = document.getElementById("eleRectBtn");
eleRectBtn.onclick = function(eevent){
console.log(getElementRect(this));
}
var scrolltoBottomBtn = document.getElementById("scrolltoBottomBtn");
scrolltoBottomBtn.onclick = function(){
scrollToBottom();
}
</script>
</body>
</html>
转自解放号社区:http://bbs.jointforce.com/topic/26095
分享到:
相关推荐
在本文中,我们将深入探讨如何使用JavaScript来获取页面中div元素的坐标。...对于从事前端开发的程序员来说,这些知识点是非常基础且十分重要的,掌握这些技能将有助于更高效地完成日常的开发任务。
下面将详细解释这些知识点: 1. **HTML**:HTML(超文本标记语言)是构建网页的基础,用于定义网页结构和内容。在本案例中,HTML将作为用户界面,展示地图和标注的坐标点。开发者会使用HTML元素如`<div>`创建一个...
要实现这个功能,我们需要掌握以下几个核心知识点: 1. **JavaScript事件监听**:首先,我们需要监听鼠标的移动事件,这可以通过JavaScript的`addEventListener`方法来实现。特别是对`mousemove`事件进行监听,每当...
其次,文件列表中包含了一些关键资源,这些资源共同构成了这个坐标拾取器的前端界面和功能: 1. `jquery-ui.min.css` 和 `jquery-ui-1.10.4.min.js`:这是jQuery UI库的压缩版本,提供了丰富的用户界面组件,如...
在IT行业中,尤其是在地理信息系统(GIS)和移动应用开发领域,"百度地图 区间覆盖 多点定位"是一个重要的概念。这个主题涉及到利用百度地图...理解和掌握这些知识点对于提升GIS应用的用户体验和功能完整性至关重要。
在JavaScript的世界里,jQuery库以其简洁的...通过理解和掌握这些知识点,不仅可以创建有趣的交互效果,也能为网页增添活力和趣味性。在实际开发中,可以结合项目需求进行适当的调整和优化,创造出更多独特的交互体验。
HTML5的Canvas是一个强大的绘图工具,允许开发者在网页上直接绘制图形,为网页应用带来了丰富的动态视觉效果。...通过熟练掌握这些知识点,你不仅可以创建出美观的雷达图,还能为用户提供更丰富的交互体验。
NPC(Non-Player Character,非玩家角色)定位是游戏开发中的一个重要环节,它涉及到游戏世界中的角色智能行为和...这些知识点构成了游戏开发中的基础框架,理解并掌握它们对于构建交互性强、体验良好的游戏至关重要。
在IT行业中,JavaScript是一种广泛使用的前端编程语言,用于创建交互式的网页和应用程序。"jQuery"是JavaScript的一个库,它简化了DOM操作、事件处理...掌握这些知识点,开发者可以创建出富有创意且功能丰富的Web应用。
在IT行业中,Cesium是一款强大的开源JavaScript库,用于在Web浏览器中创建3D地球和地理空间应用程序。...对于那些对地理空间分析和3D可视化感兴趣的IT专业人士来说,掌握Cesium的相关知识至关重要。
### HTML5与JavaScript项目知识点概览 #### 一、HTML5与JavaScript项目介绍 - **HTML5**: HTML5 是超文本标记语言的最新版本,它引入了许多新的特性,包括更丰富的多媒体支持、改进的离线存储功能以及更好的文档...
在实际开发中,结合这些知识点,开发者可以创建出具有精准用户交互、高效数据管理以及充分利用现代Web技术的网页应用。例如,通过JavaScript监听显示器坐标,实现动态的UI元素跟随用户鼠标移动;利用W3C的API,可以...
"前端基础复习题库" 本资源摘要信息为前端基础复习题库,涵盖了前端开发基础知识,包括 ...这些知识点涵盖了前端开发的基础知识,包括 HTML、CSS 和 JavaScript 等方面,旨在帮助开发者快速复习和掌握前端基础知识。
在IT领域,尤其是在软件开发和用户界面设计中,控件定位是至关重要的环节。它涉及到如何在界面上精确地布置各个元素,以便提供清晰、易用的...理解并熟练掌握这些知识点对于创建高效、美观且易用的用户界面至关重要。
【CSS基础知识1】 在网页设计中,CSS(Cascading Style Sheets)是用于控制网页...了解并熟练掌握这些基本的CSS知识点,将有助于构建美观、功能完善的网页布局。在实践中不断探索和学习,能让你的CSS技能更加精湛。
为了实现这样的功能,我们需要掌握以下几个关键知识点: 1. **坐标系统**:计算机屏幕上的一切都是基于二维坐标系统的,通常原点位于左上角,X轴向右延伸,Y轴向下延伸。右下角的坐标值是屏幕的宽度和高度,例如在...
下面将详细讲解其中涉及的关键知识点。 1. 百度地图API: 百度地图API是百度提供的一套用于集成地图服务到Web或移动应用中的工具。它包含了地图展示、定位、路线规划、地理编码等多种功能。开发者可以通过...
本文档是关于ASP.NET网页设计及网站开发的习题解答,涵盖了从基础的开发环境到HTML、XHTML以及样式控制与页面布局等多个方面。...理解并熟练掌握这些知识点,对于进行ASP.NET网页设计和网站开发至关重要。
知识点二:获取鼠标坐标 在“mousemove”事件触发时,浏览器会自动向事件处理函数传递一个事件对象,该对象中包含了鼠标当前的位置信息。具体来说,可以通过事件对象的“pageX”和“pageY”属性获取鼠标指针相对于...
在IT行业中,Google Map是一个广泛使用的地图服务,它提供了丰富的功能,包括定位、搜索和模式选择等。这个项目显然涉及到如何在应用中集成并利用...通过熟练掌握这些知识点,开发者可以创建出功能强大的地图应用。