习惯了用jQuery的css()的方法获取元素的css属性,突然不用jquery了,当要获得元素的css时候,我瞬间停顿了一下,咦?咋获取元素的css值?比如获取元素的width。是这样么?document.getElementById("id").style.width?

一、getComputedStyle
  getComputedStyle,见名之意,就是获取元素计算之后的样式属性值,也就是获取当前元素所有最终使用的CSS属性值。返回的是一个CSS样式声明对象([object CSSStyleDeclaration]),注意是只读。
语法:var style = window.getComputedStyle("元素", "伪类");
说明:第二个参数可以省略

如获得元素的width:
  var ele = document.getElementById("XXX");
  var _width = window.getComputedStyle(ele).width;

二、getComputedStyle与style的区别
  1、getComputedStyle方法是只读的,只能获取样式,不能设置;
  2、element.style能读取,能设置,但是注意,只能读取元素中style属性中的样式。
  3、getComputedStyle能获取所有的css属性,包括默认的。

三、getComputedStyle与defaultView
  defaultView又是什么东东?jQuery获取样式方式就是如下:

var getStyles = function( elem ) {

		// Support: IE <=11 only, Firefox <=30 (#15098, #14150)
// IE throws on elements created in popups
// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
var view = elem.ownerDocument.defaultView; if ( !view || !view.opener ) {
view = window;
} return view.getComputedStyle( elem );
};

  

  虽然window上命名有getComputedStyle属性了,直接但是使用window.getComputedStyle(ele)不会有啥问题,但是在火狐就会有问题,jQuery也在备注中写好了。

四、getComputedStyle兼容性
  别想了,此处IE不整点名堂怎么证明当初它式浏览器中的一霸主呢?
IE给自己提供了一套方法。IE中使用currentStyle代替getComputedStyle
  如获得元素width:
  element.currentStyle? element.currentStyle : window.getComputedStyle(element, null)).width;

五、获取元素样式的兼容性封装

function getCss(obj,attribute) {
if(obj.currentStyle) {
return obj.currentStyle[attribute];}
else {
return window.getComputedStyle(obj,null)[attribute];
}
}

 如获取id为button的背景颜色

var _btn = document.getElementById("button");
console.log(getCss(_btn, 'backgroundColor'));

五、思考

getComputedStyle会引起回流,因为它需要获取祖先节点的一些信息进行计算(譬如宽高等),所以用的时候慎用,回流会引起性能问题。

回流:

也称为Reflow,即回流。一般意味着元素的内容、结构、位置或尺寸发生了变化,需要重新计算样式和渲染树

什么会引起回流?

1.页面渲染初始化

2.DOM结构改变,比如删除了某个节点

3.render树变化,比如减少了padding

4.窗口resize

5.最复杂的一种:获取某些属性,引发回流。

很多浏览器会对回流做优化,会等到数量足够时做一次批处理回流,但是除了render树的直接变化,当获取一些属性时,浏览器为了获得正确的值也会触发回流,这样使得浏览器优化无效,包括:

  1. offset(Top/Left/Width/Height)

  2. scroll(Top/Left/Width/Height)

  3. cilent(Top/Left/Width/Height)

  4. width,height

  5. 调用了getComputedStyle()或者IE的currentStyle

  6. 修改字体

回流一定伴随着重绘,重绘却可以单独出现。所以一般会有一些优化方案,如:

  • 减少逐项更改样式,最好一次性更改style,或者将样式定义为class并一次性更新

  • 避免循环操作dom,创建一个documentFragment或div,在它上面应用所有DOM操作,最后再把它添加到window.document

  • 避免多次读取offset等属性。无法避免则将它们缓存到变量

  • 将复杂的元素绝对定位或固定定位,使得它脱离文档流,否则回流代价会很高

 

六、另记

怎样用 JavaScript 准确获取手机屏幕的宽度和高度?

function getViewportSize () {
return {
width: window.innerWidth || document.documentElement.clientWidth || document.body.clientWidth,
height: window.innerHeight || document.documentElement.clientHeight || document.body.clientHeight
};
}

  

 

js原生获取元素的css属性的更多相关文章

  1. js之获取元素最终css属性

    很多时候 我们是不用jquery库的,虽然他很好,获取元素最终的css属性我们可以用:getComputedStyle window.getComputedStyle(element, null).g ...

  2. 获取元素属性 和 获取元素的CSS属性

  3. 为什么我获取不到这个css样式?js原生获取css样式总结

    还是自己遇到的一个坑的总结吧!与其说是坑不如说自己学艺不精,让我先哭一会!! 需求 简单就是获取一个css的height (好吧 就是一个这么简单的需求) 实践 好吧 长时间的JQ 我已经对原生无能了 ...

  4. JS中获取元素属性的逆天大法

    给大家聊下js中获取元素属性的逆天大法,胆小慎入,切记切记!!! innerHTML.outerHTML.innerText .outerText.value.text().html(),val() ...

  5. js进阶 11-3 jquery中css属性如何操作

    js进阶 11-3  jquery中css属性如何操作 一.总结 一句话总结:通过css()方法 1.attr和css是有交叉的,比如width,两者中都可以设置,那么他们的区别是什么? 其实通俗一点 ...

  6. d3js 获取元素以及设置属性

    <!DOCTYPE html> <html lang="zh"> <head> <meta charset="UTF-8&quo ...

  7. js原生获取className&多选一

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. js jquery 获取元素(父节点,子节点,兄弟节点),元素筛选

    转载:https://www.cnblogs.com/ooo0/p/6278102.html js jquery 获取元素(父节点,子节点,兄弟节点) 一,js 获取元素(父节点,子节点,兄弟节点) ...

  9. Selenium_获取元素文本、属性值、尺寸(8)

    from selenium import webdriver driver = webdriver.Chrome() driver.maximize_window() driver.get(" ...

随机推荐

  1. Centos7.x:开机启动服务的配置和管理

    一.开机启动服务的配置 1.创建服务配置(权限754) vim /usr/lib/systemd/system/nginx.service 文件内容解释 [Unit]:服务的说明Description ...

  2. Spring Cloud的DataRest(二)

    一.创建工程 1.主程序 2.依赖 3.配置 二.案例开发 1.entity 2.repository 三.案例验证 安装postman4.13,启动应用,执行如下案例验证! 1.create - p ...

  3. gradle入门(1-8)gradle 的依赖查看、依赖排除和指定版本(需要验证!)

    一.依赖查看 gradle dependencies 在gradle dependencies输出会有如下几种标记: 1.版本 : 唯一的依赖. 2.版本():还存在该库其他版本的依赖或者间接依赖,并 ...

  4. 使用Spring Initializr创建项目

    Spring initializr 是Spring 官方提供的一个很好的工具,可以用来用来创建一个Spring boot 的项目.可以选择使用Maven管理或者使用Gradle管理,还可以选择使用的编 ...

  5. python flask框架 数据库的使用

    #coding:utf8 from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) # ...

  6. python当中的 可迭代对象 迭代器

    学习python有一段时间了,在学习过程中遇到很多难理解的东西,做一下总结,希望能对其他朋友有一些帮助. 完全是个人理解,难免有错,欢迎其他大神朋友们批评指正. 1 迭代 什么是迭代呢??我们可以这样 ...

  7. 谈谈spring-boot不同包结构下,同样的类名冲突导致服务启动失败解决方案

    项目背景: 某日,有需求要在三天的时间内完成两个大项目的项目合并,因为之前两个项目的包结构和类名都很多相同,于是开始考虑使用加一级包进行隔离,类似于这种结构 但是在启动的过程中,抛出来这样的异常: C ...

  8. POJ-1556 The Doors---线段相交+最短路

    题目链接: https://vjudge.net/problem/POJ-1556 题目大意: 给一个10*10的正方形房间中间用墙隔开每个墙上有两个门,给出门的两个端点坐标求从左边中点走到右边中点所 ...

  9. JS面向对象之原型链

      对象的原型链 只要是对象就有原型 原型也是对象 只要是对象就有原型, 并且原型也是对象, 因此只要定义了一个对象, 那么就可以找到他的原型, 如此反复, 就可以构成一个对象的序列, 这个结构就被成 ...

  10. 学习React系列(五)——使性能最优

    提高性能可分为两方面: 一.配置层面 二.代码层面 本文只从代码层面考虑: 一.避免重复渲染 这里要说一句: 当shouldComponentUpdate返回false的时候不触发render函数也就 ...