博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
js获取css属性知多少?客官来撸就知晓!
阅读量:5771 次
发布时间:2019-06-18

本文共 5420 字,大约阅读时间需要 18 分钟。

 座右铭镇楼:

       
天下事,有所利有所贪者成其半,有所激有所逼者成其半

今天在读掘金 的时候,突然发现一个无比新奇的玩意儿:getComputedStyle,就是这位大佬。

当时楼主就虎躯一震,what's this?

本着程序员死磕到底的执着,楼主熟练的打开百度,输入getComputedStyle!

我了个去,竟然这么多搜索结果,看来已经是出来挺久的Api了,完蛋了,又落后了!

好在楼主眼前一亮,发现竟然有张鑫旭大大的博文也在将这个东西,果断戳进去一睹芳容。

,有需要的小伙伴可以去张大大的博客里瞅瞅,感谢大佬的指点迷津,本文也是在此基础之上更细化了一些。

假装有一条华丽的分割线:

少逼逼,不啰嗦,show you the code:

dom结构如下:

复制代码

css样式如下:

复制代码

js嘛,慢慢来,楼主会带着大家仔细瞅瞅这个无比给力的getComputedStyle的用法,让你在js中获取css属性不再是梦.....

// appDom: dom对象var appDom = document.getElementById("app")复制代码

首先,咱们先来撸大家开发中最常用的element.style.balabal,为什么说它常用呢?因为它实在太原生,太大众了,废话少说,柿子先捡软的捏:

 console.log('appDom.style : ',appDom.style)

 console.log('appDom.style.width: ', appDom.style.width)

 console.log('appDom.style.height: ', appDom.style.height) 

 console.log('appDom.style.border: ', appDom.style.border) 

 console.log('appDom.style.length: ', appDom.style.length) 

 console.log('appDom.style.float: ', appDom.style.float)

在chrome的控制台里,我们可以看到如下:

发现什么了吗?没错。恭喜聪明的你答对了,

element.style.***复制代码

这样的语法,只能获取到我们在html中内联的css样式,而在style标签中写的样式呢?它一个都拿不到。

OK,然后我们针对element.style.balala这样的语法,再来看看万恶的IE表现如何呢?

/* IE7 - IE8 */

原谅IE这犊子,它连console.log都不能带颜色,如果你想在chrome里玩转console的话,可以看。言归正传,可以发现,在IE7和IE8中,是支持element.style.***这样的语法的,只是各位看官是否发现?它的border.....娘希匹.....心里一万头*****呼啸而过.......o(╯□╰)o....

/* >=IE9 */

在IE9+中,总算把那个反人类的border给修复了,而且各位看官请仔细与上图对比,可以发现length属性也有值了,这说明IE9的支持度更好了。

有的同学可能要说了,你这个low逼,这么简单的api,我tm三年前就会了...

好吧,楼主承认楼主的智商有待提高。那么撸完最常用的element.style.balabala的各种情况之后,我们开始本文的主角,有请getComputedStyle闪亮登场。

“前排出售 啤酒饮料矿泉水 瓜子花生小板凳,维修各类航母,炮弹啦......”

先援引张鑫旭大大文章中的简介:

getComputedStyle是一个可以获取当前元素所有最终使用的CSS属性值。返回的是一个CSS样式声明对象([object CSSStyleDeclaration]),只读。
getComputedStyle() gives the final used values of all the CSS properties of an element.

语法呢,在下面:

var style = window.getComputedStyle("元素", "伪类");复制代码

楼主自己测试,如下几种写法都是可以得,show you the code:

window.getComputedStyle(app, null)window.getComputedStyle(app, )window.getComputedStyle(app, '')复制代码

所以呢,如果没有伪类的话,想怎么写,都随便你咯。

那么,chrome对它的支持如何呢?

上测试代码:

if (window.getComputedStyle) {  // 兼容性判断还是要有的,万一王炸了呢?  var appStyleDel = window.getComputedStyle(app, null)  console.groupEnd()  console.log('%c window.getComputedStyle(元素,伪类)调用', 'color: #fff; background: #40f;');  console.group()  console.log(appStyleDel)  console.log('appStyleDel.width: ', appStyleDel.width)  console.log('appStyleDel.height: ', appStyleDel.height)  console.log('appStyleDel.border: ', appStyleDel.border)  console.log('appStyleDel.length: ', appStyleDel.length)  console.log('appStyleDel.float: ', appStyleDel.float)  console.log('appStyleDel.borderTopleftRadius: ', appStyleDel.borderTopLeftRadius)}复制代码

chorme控制台显示的效果如下:

那么在IE下又是如何的呢?

/* >=IE9 */

可以看到,在IE下面,兼容性还并不是很完美。只能说:”老板,咱能不支持IE吗?“

知道了getComputedStyle的用法,在张大大的博文中,还有介绍getPropertyValue这样一个方法,我也同时进行了测试,代码如下:

if (appStyleDel.getPropertyValue) {  console.groupEnd()  console.log('%c appStyleDel.getPropertyValue()调用', 'color: #fff; background: #89f;');  console.group()  console.log('appStyleDel.getPropertyValue(): ', appStyleDel.getPropertyValue)  console.log('appStyleDel.getPropertyValue("width"): ', appStyleDel.getPropertyValue('width'))  console.log('appStyleDel.getPropertyValue("height"): ', appStyleDel.getPropertyValue('height'))  console.log('appStyleDel.getPropertyValue("border"): ', appStyleDel.getPropertyValue('border'))  console.log('appStyleDel.getPropertyValue("length"): ', appStyleDel.getPropertyValue('length'))  console.log('appStyleDel.getPropertyValue("float"): ', appStyleDel.getPropertyValue('float'))  console.log('appStyleDel.getPropertyValue("border-top-left-radius")', appStyleDel.getPropertyValue('border-top-left-radius'))}复制代码

chrome中显示如下:

而在IE中嘛。呵呵...

对比chrome中的效果,IE的表现只能说差强人意,毕竟border属性还是没有显示出来。

同时,在张大大的博文中,还有getAttribute方法,这个方法的语法是

element.getAttribute('')复制代码

我们可以测试一下:

if (appDom.getAttribute) {  console.groupEnd()  console.log('%c appDom.getAttribute()调用', 'color: #fff; background: #700;');  console.group()  console.log('appDom.getAttribute: ', appDom.getAttribute)  console.log('appDom.getAttribute("style"): ', appDom.getAttribute('style'))  console.log(typeof appDom.getAttribute('style'))}复制代码

那么在chrome中表现如何呢?

IE中呢:

/* IE7 */

/* IE8 */

/* IE9 */

可以看到,IE各个版本中getAttribute的差别还是比较大的,所以在实际使用的时候,还是需要斟酌一番。

最后,我们看看IE独有的currentStyle属性

if (appDom.currentStyle) {  console.log('appDom.currentStyle:' + appDom.currentStyle)  console.log('appDom.currentStyle.width:' + appDom.currentStyle.width)  console.log('appDom.currentStyle.height:' + appDom.currentStyle.height)  console.log('appDom.currentStyle.border:' + appDom.currentStyle.border)  console.log('appDom.currentStyle.length:' + appDom.currentStyle.length)  console.log('appDom.currentStyle.float:' + appDom.currentStyle.float)  console.log('appDom.currentStyle.borderTopleftRadius:' + appDom.currentStyle.borderTopleftRadius)}复制代码

效果如下:

结语:

看完了这么多让人眼花缭乱的API,大家是不是也和楼主一样?

那么在实际开发中,我们究竟该使用哪个方法来获取呢?

如果是在chrome中使用的话,如果仅仅是获取行内的样式,那么element.style.balabala的语法足够使用了,当然,我们通常把样式写在style中,所以推荐大家使用getComputedStyle的语法,而且呢,在getComputedStyle返回的CSSStyleDeclaration对象中,我们不仅可以使用点语法来获取相关的css属性值,而且也可以使用CSSStyleDeclaration.getPropertyValue()的方式来进行获取,需要注意的是,点语法获取使用的是驼峰法,而getPropertyValue()中使用的是短横线法,这点也是需要注意的。

而在IE中,从IE9开始,根据我们的测试,似乎使用IE自家的currentStyle语法兼容性更好一些,对属性的支持程序也更高,具体使用的时候,还是要针对IE,做一些兼容的措施。

文章写到这里,今天的分享就算告一段落了。

下周会为大家分享getComputedStyle中伪类的用法,以及getComputedStyle和大名鼎鼎的getboundingclientrect()以及相关的一些令人眼花缭乱的各种clientWidth,clientHeight....,保证让你看完之后,啥呢?

END....

转载于:https://juejin.im/post/5ac61edd5188255c887bdebe

你可能感兴趣的文章
javascript静态类型检测工具—Flow
查看>>
MachineLearning-Sklearn——环境搭建
查看>>
node学习之路(二)—— Node.js 连接 MongoDB
查看>>
《深入理解java虚拟机》学习笔记系列——垃圾收集器&内存分配策略
查看>>
TriggerMesh开源用于多云环境的Knative Event Sources
查看>>
GitLab联合DigitalOcean为开源社区提供GitLab CI免费托管
查看>>
通过XAML Islands使Windows桌面应用程序现代化
查看>>
区块链现状:从谨慎和批判性思维看待它(第二部分)
查看>>
苹果公司透露Siri新发音引擎的内部原理
查看>>
GCM 3.0采用类似方式向Android、iOS和Chrome发送消息
查看>>
如何成为一家敏捷银行
查看>>
Oracle在JavaOne上宣布Java EE 8将会延期至2017年底
查看>>
Javascript 深入浅出原型
查看>>
简单之极,搭建属于自己的Data Mining环境(Spark版本)
查看>>
Ruby 2.5.0概览
查看>>
如何通过解决精益问题提高敏捷团队生产力
查看>>
Apache下.htaccess文件配置及功能介绍
查看>>
Magento XML cheatsheet
查看>>
Egg 2.19.0 发布,阿里开源的企业级 Node.js 框架
查看>>
Kubernetes 弹性伸缩全场景解析 (四)- 让核心组件充满弹性 ...
查看>>