原生js获取元素的样式style属性值

事情是这样的,我今天在帮一个朋友实现原生手写轮播图,然后我发现自己在获取一个元素的样式上出现了一点点小问题,就顺带去谷歌了一番了。

原生js获取CSS样式.png
一 原本的我🤦
问题:

是这样的,一开始需要获取某一个元素的left值,我就用ele.style.left去获取了(基础不扎实还好意思来丢人),然后居然返回的是空。
好吧,追本溯源,问题的根源以及区别就在这里了。

ele.style 的使用

  • 只读内联样式属性:使用该方法获取的样式值,是元素内联的样式上才有的。举个例子,如果你有一个元素<div style='color:red,left:40px'></div>,那么你获取这个元素的样式,ele.style.color 就会返回left,如果使用ele.style.left就会返回40px;
    一个温馨提示:如果真的是使用这种方式去获取属性值,那么需要转换成整数而且去掉单位,那么就可以用parseInt(40px),就会返回40
  • 可读可写:该方法可以同时设置或者获取某一个元素的样式 (记住,只能读取定义的style样式里的属性。)

所以,我那样是获取不到某一个元素的一个其他方式设置的样式属性值的,所以我就打算谷歌一下别的方法了。

window.getComputedStyle() 与getPropertyValue

image.png

嗯,很不错,这个方法可以获取一个元素的所有来自四面八方设置的样式属性,本身的属性都可以被我们读取到。
💁 那么,问题来了,如果要读取其中的一个值,我们应该怎么做呢?

getPropertyValue

// 基本语法
getComputedStyle(document.getElementById('caseroul'),null).getPropertyValue(‘left’)

特点:
- 只可读,但是可以读取所有的样式属性值。但是不能通过该方法去设置样式属性值。

css中设置样式属性的一些方法:

elt.style.cssText = "color: blue"; // 设置多个样式属性 
elt.setAttribute("style", "color: blue"); // 设置多个样式属性 
elt.style.color = "blue"; // 直接设置样式属性
var st = elt.style; st.color = "blue"; // 间接设置样式属性

2 IE下的currentStyle 与 getAttribute

currentStyle获取的是一个元素的所有的样式属性值,这一点功能是与getComputedStyle()一样的,但是在获取某一个具体的属性的时候,可以结合getAttribute来实现。
和 getComputedStyle 方法不同的是,currentStyle 要获得属性名的话必须采用驼峰式的写法。也就是如果我需要获取 font-size 属性,那么传入的参数应该是 fontSize。因此在IE 中要获得单个属性的值,就必须将属性名转为驼峰形式。(感谢这篇文章。)

// IE 下语法:
// IE 下将 CSS 命名转换为驼峰表示法
// font-size --> fontSize
// 利用正则处理一下就可以了
function camelize(attr) {
    // /\-(\w)/g 正则内的 (\w) 是一个捕获,捕获的内容对应后面 function 的 letter
    // 意思是将 匹配到的 -x 结构的 x 转换为大写的 X (x 这里代表任意字母)
    return attr.replace(/\-(\w)/g, function(all, letter) {
        return letter.toUpperCase();
    });
}
// 使用 currentStyle.getAttribute 获取元素 element 的 style 属性样式
element.currentStyle.getAttribute(camelize(style));
关于返回值

关于getComputedStyle返回的值,具体查看这里。
不管你最初定义的样式是什么,涉及到宽度高度之类的,返回的都是最后实际使用的宽度和高度。

image.png

image.png

关于ele.style的返回值,是和定义的样式的值相等的,如果设置为auto,就直接返回auto。

const test = document.querySelector('.test');
console.log(test.offsetWidth, '获取offsetWidth的宽度');    // 204,包括边框的宽度
console.log(getComputedStyle(test, null).getPropertyValue('width'));   // 200px,实际的样式宽度
console.log(test.getBoundingClientRect().right - test.getBoundingClientRect().left)   // 200
console.log(test.style.width);  //无返回值。

然后是元素的高宽,对于一个没有设定高宽的元素而言,在 IE678 下使用 getPropertyValue("width|height") 得到的是 auto 。而标准浏览器会直接返回它的 px 值,当然我们希望在 IE 下也返回 px 值。

这里的 HACK 方法是使用 element.getBoundingClientRect() 方法。

element.getBoundingClientRect() -- 可以获得元素四个点相对于文档视图左上角的值 top、left、bottom、right ,通过计算就可以容易地获得准确的元素大小。

参考链接 chokcoco的博客园

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

  • 我们首先要明白,我们给页面添加效果用到的js到底是什么?js其实包含三部分:dom 文档对象模型 bom 浏览...
    一直以来都很好阅读 792评论 0 0
  • DOM总结 1:DOM - document object model 文档对象模型 作用:给我们提供了一些方法...
    盒小饭stone阅读 584评论 0 0
  • 在云笔记中发现了很久以前写的总结,看着总结还能想到当初认认真真一个一个浏览器测试的样子。 【目录】 1 jQuer...
    辣瓜瓜阅读 493评论 0 0
  • 首发:陆否(lofter) 今天开门的时候被门把手上带的静电打得手都缩了回去,然后突然有了一个脑洞…… 一篇关于千...
    欺杏阅读 323评论 0 2
  • 杜小萤阅读 170评论 2 3