今天说一下js获取元素位置和style的方法。当然不只是element.style那么简单。。

主角:getBoundingClientRect,getClientRects,getComputedStyle,currentStyle

配角:getPropertyValue,getAttribute

getBoundingClientRect:

这个方法返回一个矩形对象,包含六个属性:left、top、width、height、right和bottom(ie下没有width和height)。分别表示元素各边与页面上边和左边的距离。

var box=document.getElementById('box');         // 获取元素
alert(box.getBoundingClientRect().top); // 元素上边距离页面上边的距离
alert(box.getBoundingClientRect().right); // 元素右边距离页面左边的距离
alert(box.getBoundingClientRect().bottom); // 元素下边距离页面上边的距离
alert(box.getBoundingClientRect().left); // 元素左边距离页面左边的距离

注意:这里的getBoundingClientRect()的bottom和right和css中的不一样。bottom是元素下边到页面上边的距离,right是元素右到页面左的距离。

通常这个方法用于获得页面中某个元素的左,上,右和下分别相对浏览器视窗的位置。

getBoundingClientRect()最先是IE的私有属性,现在已经是一个W3C标准。所以你不用当心浏览器兼容问题,不过还是有区别的:IE只返回top,lef,right,bottom四个值,不够可以通过以下方法来获取width,height的值:

   var ro = object.getBoundingClientRect();
var Width = ro.right - ro.left;
var Height = ro.bottom - ro.top;

兼容所有浏览器写法:

   var ro = object.getBoundingClientRect();
var Top = ro.top;
var Bottom = ro.bottom;
var Left = ro.left;
var Right = ro.right;
var Width = ro.width||Right - Left;
var Height = ro.height||Bottom - Top;

有了这个方法,获取页面元素的位置就简单多了:   这样就可以兼容所有浏览器了。

var X= this.getBoundingClientRect().left+document.documentElement.scrollLeft;
var Y =this.getBoundingClientRect().top+document.documentElement.scrollTop;

getClientRects:

兼容性方面:除了safari,firefox2.0外所有浏览器都支持getClientRects和getBoundingClientRect

他俩其实差不多,返回的有点差别:

getClientRects 返回一个TextRectangle集合,就是TextRectangleList对象。
getBoundingClientRect 返回 一个TextRectangle对象,即使DOM里没有文本也能返回TextRectangle对象.

也就是说getClientRects返回值需要加一个[0]就是getBoundingClientRect的返回值了。

这是width: 200px;height: 300px;margin: 40px;的一个div的样式。第一个是getClientRects的返回,第二个是getBoundingClientRect的返回。

getComputedStyle:

getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值。返回的是一个CSS样式声明对象([object CSSStyleDeclaration]),只读。他强大的地方是可以取到元素的伪类。

var dom = document.getElementById("test"),
style = window.getComputedStyle(dom , ":after");

这不就跟dom.style是一样的吗?还是有差别的:

比如getComputedStyle只读不可写。主要区别是getComputedStyle取的是最终应用在元素上的所有CSS属性对象。而style只能获取元素style属性中的CSS样式,也就是该标签里面写的内嵌样式,别的样式是取不到的。

就是说getComputedStyle把这个元素所有属性都取出来了,包含属性的值。取了一下,大概几百个......但是你取元素的syle属性,就会看到一堆的属性名加空字符串,因为它还没有设置样式。

相信我不说你也知道这是什么。

但是getComputedStyle支持ie9-。但是ie又给出了它自己的实现---currentStyle

currentStyle:

与getComputedStyle基本一致,不过currentStyle不支持伪类。

比如,我们获取元素的高度可以这么写。

alert((element.currentStyle? element.currentStyle : window.getComputedStyle(element, null)).height);

但是这个东西和getComputedStyle还是有一定差异的,比如FireFox浏览器下是cssFloat,而IE9浏览器下则是cssFloatstyleFloat都有。等等。

getPropertyValue:

getPropertyValue方法可以获取CSS样式申明对象上的属性值(直接属性名称),例如

window.getComputedStyle(element, null).getPropertyValue("float");

其实他和直接访问一样的,但是它不用写驼峰呀,而且主要是不用写cssFloatstyleFloat。

getAttribute:

getAttribute基本同上,但是它得写驼峰。。

style.getAttribute("backgroundColor");

最后是jquery的css()不解释,万能。除了一点,他不能获取伪类。

最后补充一下元素的位置样式。

clientWidth = width + padding

clientHeight = height + padding

offsetWidth = width + padding + border

offsetHeight = width + padding + border //offset比client多了border的宽度
在项目中,可以用getBoundingClientRect来获取元素的width等信息,getComputedStyle获取元素的margin等位置信息,然后可以加上元素的clientWidth等等的元素本身的位置,可以做到很好的兼容性。

js获取元素位置和style的兼容性写法的更多相关文章

  1. 【全面总结】js获取元素位置大小

    [js获取元素位置+元素大小]全面总结 目录 1.关于offset offsetParent(只读) offsetTop(只读) offsetLeft(只读) offsetHeight(只读) off ...

  2. Js获取元素样式值(getComputedStyle&currentStyle)兼容性解决方案

    因为:style(document.getElementById(id).style.XXX)只能获取元素的内联样式,内部样式和外部样式使用style是获取不到的. 一般js获取内部样式和外部样式使用 ...

  3. 获取元素位置信息和所占空间大小(via:js&jquery)

    工作中有一个很常见的需求,hover或者click某元素后,在该元素旁边出现弹框,主要就是获取该元素的位置坐标以及元素所占区块的大小.最近工作中就遇到了,发现js和jquery的实现方法有很大的区别, ...

  4. Selenium2学习-031-WebUI自动化实战实例-029-JavaScript 在 Selenium 自动化中的应用实例之四(获取元素位置和大小)

    通过 JS 或 JQuery 获取到元素后,通过 offsetLeft.offsetTop.offsetWidth.offsetHeight 即可获得元素的位置和大小,非常的简单,直接上源码了,敬请参 ...

  5. JS获取元素宽高的两种情况

    JS获取元素宽高分两种情况, 一.内联样式,也就是直接把width和height写在HTML元素中的style里: 这种情况使用     document.getElementById('xxx'). ...

  6. js获取元素的外链样式

    一般给元素设置行内样式,如<div id="div1" style="width:500px;"></div>.如要获取它的样式,即可d ...

  7. 原生js获取元素的样式信息

    工作中经常会需要获取DOM元素的样式,之前都是通过jquery的css()方法,现在总结一下通过原生js获取元素样式的方法. obj.style js var _width = obj.style.w ...

  8. js 获取元素坐标 和鼠标点击坐标

    js 获取元素的位置 var odiv=document.getElementById('divid'); alert(odiv.getBoundingClientRect().left); aler ...

  9. js获取光标位置

    js获取光标位置   var TT = { /* * 获取光标位置 * @Method getCursorPosition * @param t element * @return number */ ...

随机推荐

  1. 使用NFS时的一些问题

    当我把nfs服务端共享目录/usr/local/data/test删掉时,在nfs客户端却没办法把之前挂载在这上面的当前从机上的/usr/local/data/test删除,出现 bash: cd: ...

  2. HTML4到HTML5

    第一步: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0.1//EN" "http://www.w3.org/TR/html ...

  3. 关于 flask 实现数据库迁移以后 如何根据创建的模型类添加新的表?

    在此之前 我们先说一下常规的flask运用第三方扩展来实现数据库的迁移的三个步骤以及每步的目的. 数据库的迁移的三个步骤:(cd 到run.py所在路径) python run.py db init ...

  4. Microsoft Bot Framework with LUIS

    今年微软的编程之美的主题是“对话即平台”,“人工智能”,要求参赛选手用到Bot Framework与Cognitive Services. 大多数人应该对这两个技术都不怎么熟悉吧,我就在这里写写自己所 ...

  5. Introduction to Dynamic SQL

    The idea of using dynamic SQL is to execute SQL that will potentially generate and execute another S ...

  6. JS 单线程和事件循环

    Js 是单线程,js代码从上到下依次执行,比如我们写了两个函数,肯定是上面的函数先执行,下面的函数后执行.但是这种单线程有一个非常大的问题,那就是遇到耗时的任务,后面的任务只能等待它执行完,才能进行. ...

  7. Root test & Ratio test

    几何级数(Geometric Series/Geometric Progression) Root test与Ratio test都依赖于几何级数求和理论,因此这里先讨论该理论. 在数学上,几何级数, ...

  8. 微信小程序 canvas 字体自动换行(支持换行符)

    微信小程序 canvas 自动适配 自动换行,保存图片分享到朋友圈  https://github.com/richard1015/News 微信IDE演示代码https://developers.w ...

  9. kubernetes 简单service的例子

    首先建一个Deployment: apiVersion: apps/v1beta1 kind: Deployment metadata: name: httpd spec: replicas: 3 t ...

  10. Codeforces Round #433 Div. 1

    A:显然从大到小排序后贪心放在第一个能放的位置即可.并查集维护. #include<iostream> #include<cstdio> #include<cmath&g ...