惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Y
Y Combinator Blog
博客园 - 司徒正美
TaoSecurity Blog
TaoSecurity Blog
Martin Fowler
Martin Fowler
T
Threat Research - Cisco Blogs
Blog — PlanetScale
Blog — PlanetScale
S
Secure Thoughts
博客园 - 三生石上(FineUI控件)
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
K
Kaspersky official blog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Cisco Talos Blog
Cisco Talos Blog
H
Help Net Security
博客园 - 叶小钗
爱范儿
爱范儿
GbyAI
GbyAI
I
Intezer
M
MIT News - Artificial intelligence
Latest news
Latest news
Schneier on Security
Schneier on Security
T
Tor Project blog
Simon Willison's Weblog
Simon Willison's Weblog
I
InfoQ
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CXSECURITY Database RSS Feed - CXSecurity.com
罗磊的独立博客
N
News and Events Feed by Topic
T
The Blog of Author Tim Ferriss
V2EX - 技术
V2EX - 技术
B
Blog
T
Tailwind CSS Blog
N
Netflix TechBlog - Medium
Security Latest
Security Latest
V
V2EX
F
Fortinet All Blogs
Forbes - Security
Forbes - Security
Application and Cybersecurity Blog
Application and Cybersecurity Blog
The Hacker News
The Hacker News
Scott Helme
Scott Helme
P
Privacy International News Feed
P
Palo Alto Networks Blog
H
Heimdal Security Blog
C
Cisco Blogs
T
The Exploit Database - CXSecurity.com
博客园 - Franky
酷 壳 – CoolShell
酷 壳 – CoolShell
G
Google Developers Blog
W
WeLiveSecurity
L
LINUX DO - 最新话题

一颗小树

周更的第 100 篇 改变阅读方式 宝贵的人生建议 小树的工具库 2023 读《重构》有感 仅需 10 分钟,用 GPTs 实现文章总结助手 高质量的需求交付 产品始于问题,而不是解决方案 如何更好地休息 最优解人生 与体重斗,其乐无穷 结构化 prompt = 数字员工? 持续创作的法门 如何降低知识焦虑 7 月思维碎片 N 倍生产力提升:我的 AI 助理 Indie Hacker,互联网打工人的下一个出路? 如何成就伟大事业 夏日碎片 小报编辑的自我修养 一颗小树 #49 投入真实生活 一颗小树 #48 过年杂记 一颗小树 #47 我的人生信念(2023) 一颗小树 #46 回本就卖 一颗小树 #45 规划和落地 小树的 2022 年终总结 一颗小树 #44 构建高质量信源 一颗小树 #43 我的 2022 书单 一颗小树 #42 阳了怎么办 一颗小树 #41 一人企业 一颗小树 #40 非必要别正常啦 一颗小树 #39 阅读和创造 一颗小树 #38 疫情生活碎片 一颗小树 #37 基于多维表格的可转债投资系统 一颗小树 #36 飞盘初体验 一颗小树 #35 雁栖湖半日游 一颗小树 #34 初探多维表格 一颗小树 #33 回不去的名字叫家乡 一颗小树 #32 生活需要留白 一颗小树 #31 Figma 的成功之道 一颗小树 #30 拓宽自己 拥抱善意 一颗小树 #29 有关下雨的记忆 一颗小树 #28 隐入尘烟 一颗小树 #27 找到并坚持自己的热爱 一颗小树 #26 好产品的“差”改版 一颗小树 #25 吹吹南澳岛的海风 一颗小树 #24 代码重构的一点心得 一颗小树 #23 和团队新同学的对话 一颗小树 #22 从《干法》中学到的 一颗小树 #21 阿里四年我的收获和感想 一颗小树 #20 周更半年我学到的事 一颗小树 #19 慢慢来比较快 一颗小树 #18 只规划每天最重要的三件事 一颗小树 #17 裁员潮下的反思 一颗小树 #16 纪录片的力量在于真实 一颗小树 #15 世界很小但很好 一颗小树 #14 让自己成为问题的终结者 一颗小树 #13 别忘记你的热爱 一颗小树 #12 聊聊写作这件事 一颗小树 #11 开始投资前更重要的事 一颗小树 #10 疫情囤货指南 一颗小树 #9 疫情之下 重建内心的秩序 一颗小树 #8 不要倒在黎明前 一颗小树 #7 从小孩子身上学到的事 一颗小树 #6 和自己的产品一起成长 一颗小树 #5 技术对生产力的的变革是不可阻挡的 一颗小树 #4 暴风雨的意义 一颗小树 #3 投资成功,是我们变成一个更好的人之后自然的结果 一颗小树 #2 持续学习来应对这个复杂多变的世界 一颗小树 #1 任天堂和上岭村 一颗小树 #0 这是写给你们的第一封信 游戏改变世界 把自己给开源了 构建自己的不为清单 有爱和被爱 做了一点微小的工作 小树的 2021 年终总结 小树的 2020 年终总结 与其感慨路难行,不如马上出发 阿里前端也切图?不,人工智能帮你做 如何写好简历,拿到大厂 offer 的敲门砖 任时光匆匆流去 | 2019 年终总结 聊聊在阿里远程办公那点事儿 在 D2 做主持人是怎样一种体验? 提高工作效率的几个方法 有限状态机在 CSS 动画中的应用 「译」React 项目结构和组件命名之道 编写小而美函数的艺术 使用纯粹的JS构建 Web Component 翻译计划-状态管理请三思 利用Dawn工程化工具实践MobX数据流管理方案 高性能 MobX 模式(part 3)- 用例教程 高性能 MobX 模式(part 2)- 响应变化 技术文章写法浅谈 翻译计划-用node.js开发一个可交互的命令行应用 无他,唯手熟尔-前端实习面试题篇 工欲善其事必先利其器-前端实习简历篇 手把手带你用原生js实现css属性的set和get 翻译计划-从sass到PostCSS 把简单做好也不简单-css水平垂直居中
我们来翻翻元素样式的族谱-getComputedStyle
也树 · 2017-01-30 · via 一颗小树

大家应该非常熟悉 jQuery 的 css()方法,那么如何在不引用 jQuery 的情况下同样实现这个功能呢?本文就介绍使用原生 JS 来获取样式的方法.

作者:Icarus 原文链接:我们来翻翻元素样式的族谱-getComputedStyle

getComputedStyle 是什么


>The Window.getComputedStyle() method gives the values of all the CSS properties of an element after applying the active stylesheets and resolving any basic computation those values may contain.

Window.getComputedStyle()方法可以获取当前元素所有最终使用的 CSS 属性值.返回的是一个 CSS 样式声明对象(object CSSStyleDeclaration),只读.也就是说,获取到的不仅仅是我们自定义的样式,它包含了所有作用在当前元素上的 css 属性及属性值.

语法

var style = window.getComputedStyle(element[, pseudoElt]);

其中 element 是必需的参数,代表获取样式的元素.pseudoElt 是伪类参数,在 Gecko2.0 之前是必填项,但在现代浏览已经不是了,如果不是伪类的话,设置为 null 即可.

var style = window.getComputedStyle(element, null);

举个栗子

不包含伪类

假设页面上存在一个 id 为 id 的元素,使用 getComputedStyle 方法获取到的元素样式如下所示: example

包含伪类

<style>
 h3::after {
   content: 'rocks!';
 }
</style>

<h3>generated content</h3>

<script>
  var h3       = document.querySelector('h3'),
      result   = getComputedStyle(h3, ':after').content;

  console.log(result); // returns 'rocks!'
</script>

兼容性

Browser compatibility-1 Browser compatibility-2

其中问号部分代表暂无测试,是否兼容暂不确定.

由上图可知,getComputedStyle 的兼容性很不错,基本支持所有的现代浏览器.当然 IE 浏览器自有他的脾气,在 IE9 以下有另一套功能相似的 API,暂且不提.

获取特定属性值

在上面的栗子中,我们可以看到 getComputedStyle 返回的是样式声明对象,包含了元素所有的样式值,那么我们如何获取到想要的属性值呢?有两种方法可以实现这一需求:

  • window.getPropertyValue()
  • 键值访问

getPropertyValue

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

window.getComputedStyle(element, null).getPropertyValue('属性名');

可以非常方便的获取到我们想要的属性值.需要注意:不支持驼峰命名,属性名按照 css 的写法,如background-color:

window.getComputedStyle(element, null).getPropertyValue('background-color');

兼容性

除 IE9 以下浏览器,其余现代浏览器均支持.

键值访问

通过键值访问来获取 css 属性较为繁琐,可能需要进行额外的浏览器检测,例如

window.getComputedStyle(element, null).float //错误!

这种写法是错误的,原因是 float 是 js 的一个保留字,不能直接使用.IE 下对应的是 styleFloat,firefox,chorme,safari 下对应的则是 cssFloat.相较而言更建议使用 getPropertyValue 来获取具体属性值.

IE9 以下的替代方法

getComputedStyle 和 currentStyle

currentStyle 是 IE 浏览器特有的的一个属性,element.currentStyle返回的同样是所有元素当前应用的最终 CSS 属性值.但是其中获取到的属性名会存在差异,如上提及的 styleFloat 和 cssFloat.

不过,currentStyle 属性不支持伪类样式获取,这是与 getComputedStyle 方法的重要差异,也是 jQuery 中 css()方法无法获取伪类元素属性的原因.

假设页面上有一个 id 为 test 的元素,示例如下:

var style = document.getElementById('test').currentStyle;

getPropertyValue 和 getAttribute

在 IE 浏览器中的 getAttribute 方法提供了与 getPropertyValue 方法类似的功能,配合 currentStyle 使用,可以访问 CSS 样式对象的属性,用法与 getPropertyValue 类似:

element.currentStyle.getAttribute('float');

可以注意到,使用 getAttribute 同样不需要进行浏览器检测.但是有一点需要注意:在 IE7+的浏览器中,getAttribute 获取属性名可以使用驼峰式命名法,IE6 必须使用驼峰式命名方法,如:

// IE7,8两者均可,IE6必须使用驼峰命名法
element.currentStyle.getAttribute('background-color');
element.currentStyle.getAttribute('backgroundColor');

getComputedStyle 和 style 的区别

我们使用 element.style 也可以获取元素的 CSS 样式声明对象,但是其与 getComputedStyle 方法存在一些差异.

只读与可写

上面提到过 getComputedStyle 方法是只读的,只能获取样式,不能设置;而 element.style 能读能写,八面玲珑.

获取的对象范围

getComputedStyle 方法获取的是最终应用在元素上的所有 CSS 属性对象,即使没有编写任何样式代码,也会获取默认的所有样式的属性和属性值;element.style只能获取元素 style 属性中的 CSS 样式. 可能这样说不太好理解,我们回顾一下 CSS 样式表的表现形式:

  • 内联样式 (inline Style): 是写在 HTML 标签的 style 属性里面的,内嵌样式只对该标签有效.
  • 内部样式 (internal Style Sheet): 是写在 HTML 文档的 style 标签里面的,内部样式只对当前页面有效.
  • 外部样式表 (External Style Sheet): 如果很多网页需要用到同样的样式,将样式写在一个以.CSS 为后缀的 CSS 文件里,然后在每个需要用到这些样式的网页里引用这个 CSS 文件.也就是说,getComputedStyle 获取到的是所有最终在元素上应用的样式属性,而element.style仅仅获取的是我们人为编写的样式. 我们来做一个测试,对于一个光秃秃的没有任何样式设置的元素 p,getComputedStyle 方法返回对象中 length 属性值和element.style的区别.
<p></p>

var elem = document.querySelector('p');
// 0
elem.style.length
// 261 - chrome 55.0.2883.87
// 249 - firefox 50.0
// 233 - safari 5.1.1
window.getComputedStyle(elem, null).length

很容易看出两者的区别.

getComputedStyle 与 defaultView


>From mdn In many code samples online, getComputedStyle is used from the document.defaultView object. In nearly all cases, this is needless, as getComputedStyle exists on the window object as well. It's likely the defaultView pattern was some combination of (1) folks not wanting to write a spec for window and (2) making an API that was also usable in Java. However, there is a single case where the defaultView's method must be used: when using Firefox 3.6 to access framed styles.

window.getComputedStyle还有另一种写法,就是 document.defaultView.getComputedStyle. 实际上,使用 defaultView 基本上是没有必要的,getComputedStyle 本身就存在 window 对象之中.使用 defaultView 可能一是人们不太乐意在 window 上专门写个东西,二是让 API 在 Java 中也可用. 不过有个特殊情况,在 FireFox3.6 上不使用 defaultView 方法就搞不定的,就是访问框架(frame)的样式.不过 FireFox3.6 已经退出历史舞台,不用过于在意.

小结

summary

  • element.style 可读可写,但只能获取到自定义 style 属性
  • window.getComputedStyle/document.defaultView.getComputedStyle 只读,非 IE 浏览器及 IE9+获取所有作用样式,使用getPropertyValue来获取特定属性.
  • currentStyle 只读,IE6-8 获取所有作用样式,使用getAttribute来获取特定属性.

这篇博客主要介绍了 getComputedStyle 的前世今生,真正要实现 jQuery 中兼容 IE 及其它现代浏览器的 css()方法还需要额外做一些兼容性的处理.限于篇幅,欲知后事如何,且听下回分解.

参考资料