javascript
vue 获取元素在浏览器的位置-尊龙游戏旗舰厅官网
在一些复杂的页面中经常会用javascript处理一些dom元素的动态效果,这种时候我们经常会用到一些元素位置和尺寸的计算,浏览器兼容性问题也是不可忽略的一部分,要想写出预想效果的javascript代码,我们需要了解一些基本知识。(原文来自:博客园)
基础概念
为了方便理解,我们需要了解几个基础概念,每个html元素都有下列属性offsetwidth
clientwidth
scrollwidth
offsetheight
clientheight
scrollheight
offsetleft
clientleft
scrollleft
offsettop
clienttop
scrolltop
为了理解这些属性,我们需要知道html元素的实际内容有可能比分配用来容纳内容的盒子更大,因此可能会出现滚动条,内容区域是视口,当实际内容比视口大的时候,需要把元素的滚动条位置考虑进去。
1. clientheight和clientwidth用于描述元素内尺寸,是指 元素内容 内边距 大小,不包括边框(ie下实际包括)、外边距、滚动条部分
2. offsetheight和offsetwidth用于描述元素外尺寸,是指 元素内容 内边距 边框,不包括外边距和滚动条部分
3. clienttop和clientleft返回内边距的边缘和边框的外边缘之间的水平和垂直距离,也就是左,上边框宽度
4. offsettop和offsetleft表示该元素的左上角(边框外边缘)与已定位的父容器(offsetparent对象)左上角的距离
5. offsetparent对象是指元素最近的定位(relative,absolute)祖先元素,递归上溯,如果没有祖先元素是定位的话,会返回null
写个小例子方便理解
var div = document.getelementbyid('divdisplay');
var clientheight = div.clientheight;
var clientwidth = div.clientwidth;
div.innerhtml = 'clientheight: ' clientheight '
';
div.innerhtml = 'clientwidth: ' clientwidth '
';
var clientleft = div.clientleft;
var clienttop = div.clienttop;
div.innerhtml = 'clientleft: ' clientleft '
';
div.innerhtml = 'clienttop: ' clienttop '
';
var offsetheight = div.offsetheight;
var offsetwidth = div.offsetwidth;
div.innerhtml = 'offsetheight: ' offsetheight '
';
div.innerhtml = 'offsetwidth: ' offsetwidth '
';
var offsetleft = div.offsetleft;
var offsettop = div.offsettop;
div.innerhtml = 'offsetleft: ' offsetleft '
';
div.innerhtml = 'offsettop: ' offsettop '
';
var offsetparent = div.offsetparent;
div.innerhtml = 'offsetparent: ' offsetparent.id '
';
效果如图
从图中我们可以看到,clientheight就是div的高度 上下各10px的padding,clientwidth同理
而clientleft和clienttop即为div左、上边框宽度
offsetheight是clientheight 上下个3px的边框宽度之和,offsetwidth同理
offsettop是div 30px的 maggin offsetparent 8px的 padding,offsetleft同理
6. scrollwidth和scrollheight是元素的内容区域加上内边距加上溢出尺寸,当内容正好和内容区域匹配没有溢出时,这些属性与clientwidth和clientheight相等
7. scrollleft和scrolltop是指元素滚动条位置,它们是可写的
下面写个简单例子理解
var divp = document.getelementbyid('divparent');
var divd = document.getelementbyid('divdisplay');
var scrollheight = divp.scrollheight;
var scrollwidth = divp.scrollwidth;
divd.innerhtml = 'scrollheight: ' scrollheight '
';
divd.innerhtml = 'scrollwidth: ' scrollwidth '
';
在firefox和ie10(ie10以下版本盒模型和w3c标准不一致,不加讨论,兼容性问题下面会介绍到)下得到结果scrollheight: 494,而在chrome和safari下得到结果scrollheight: 502,差了8px,根据8可以简单推测是divparent的padding,来算一下是不是
我们可以看看它们的结果是怎么来的,首先scrollheight肯定包含了divdisplay所需的高度 400px的高度 上下各10px的padding 上下各3px的border 上下各30px的margin,这样
400 10*2 3*2 30*2=486
这样486 8=494, 486 8*2=502果真是这样,在firefox和ie10下没有计算下padding
有了这些基础知识后,我们就可以计算元素的位置和尺寸了。
相对于文档与视口的坐标
当我们计算一个dom元素位置也就是坐标的时候,会涉及到两种坐标系,文档坐标和视口坐标。
我们经常用到的document就是整个页面部分,而不仅仅是窗口可见部分,还包括因为窗口大小限制而出现滚动条的部分,它的左上角就是我们所谓相对于文档坐标的原点。
视口是显示文档内容的浏览器的一部分,它不包括浏览器外壳(菜单,工具栏,状态栏等),也就是当前窗口显示页面部分,不包括滚动条。
如果文档比视口小,说明没有出现滚动,文档左上角和视口左上角相同,一般来讲在两种坐标系之间进行切换,需要加上或减去滚动的偏移量(scroll offset)。
为了在坐标系之间进行转换,我们需要判定浏览器窗口的滚动条位置。window对象的pagexoffset和pageyoffset提供这些值,ie 8及更早版本除外。也可以通过scrollleft和scrolltop属性获得滚动条位置,正常情况下通过查询文档根节点(document.documentelement)来获得这些属性值,但在怪异模式下必须通过文档的body上查询。
function getscrolloffsets(w) {
var w = w || window;
if (w.pagexoffset != null) {
return { x: w.pagexoffset, y: pageyoffset };
}
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 };
}
有时候能够判断视口的尺寸也是非常有用的
function getviewportsize(w) {
var w = w || window;
if (w.innerwidth != null)
return { w: w.innerwidth, h: w.innerheight };
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 };
}
文档坐标
任何html元素都拥有offectleft和offecttop属性返回元素的x和y坐标,对于很多元素,这些值是文档坐标,但是对于以定位元素后代及一些其他元素(表格单元),返回相对于祖先的坐标。我们可以通过简单的递归上溯累加计算
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 };
}
尽管如此,这个函数也不总是计算正确的值,当文档中含有滚动条的时候这个方法就不能正常工作了,我们只能在没有滚动条的情况下使用这个方法,不过我们用这个原理算出一些元素相对于某个父元素的坐标。
视口坐标
计算视口坐标就相对简单了很多,可以通过调用元素的getboundingclientrect方法。方法返回一个有left、right、top、bottom属性的对象,分别表示元素四个位置的相对于视口的坐标。getboundingclientrect所返回的坐标包含元素的内边距和边框,不包含外边距。兼容性很好,非常好用
元素尺寸
由上面计算坐标方法,我们可以方便得出元素尺寸。在符合w3c标准的浏览器中getboundingclientrect返回的对象还包括width和height,但在原始ie中未实现,但是通过返回对象的right-left和bottom-top可以方便计算出。
与50位技术专家面对面20年技术见证,附赠技术全景图总结
以上是尊龙游戏旗舰厅官网为你收集整理的vue 获取元素在浏览器的位置_javascript获取窗口位置和元素坐标(兼容版)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: web前端知识点太多_web前端入门必学
- 下一篇: