获取元素的最终样式

简介:

    看到这样一道微信面试题:用JS代码求出页面上一个元素的最终的background-color,不考虑IE浏览器,不考虑元素float情况。(2017.3.1补充:赛赛同学提醒了我,还要考虑background这个复合属性,情况变得异常复杂了,以下代码是之前的,没有考虑。)

    由于element.style.cssText只能访问到元素内联样式即标签style属性,只能用document.defaultView.getComputedStyle,考虑IE的话可用element.currentStyle,不过element.currentStyle无法用于伪元素而document.defaultView.getComputedStyle可以。如果要考虑元素不可见或者没有设定值的时候,backgroundColor的表现可以认为是其父元素的表现(题目的“不考虑元素float情况”)也是这个意思吧。让我来写写代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/**
  * 获取元素自身css属性
  * @param elem 元素
  * @param property 属性名(这里不考虑float)
  * @returns {string} css属性值
  */
function  computedStyle(elem, property) {
     if  (!elem || !property) {
         return  '' ;
     }
     var  style =  '' ;
     if  (elem.currentStyle) {
         style = elem.currentStyle[camelize(property)];
     else  if  (document.defaultView.getComputedStyle) {
         style = document.defaultView.getComputedStyle(elem,  null ).getPropertyValue(property);
     }
     return  style;
}
 
 
/**
  * 将-连接属性名转换为驼峰命名形式
  * @param {string} str -连接字符串
  * @returns {string} 驼峰命名字符串
  */
function  camelize(str) {
     return  str.replace(/-(\w)/g,  function  (s, p1) {
         return  p1.toUpperCase();
     });
}
 
 
/**
  * 在elem获取的背景色是否为最终的背景色
  * @param elem
  * @returns {boolean}
  */
function  isFinalBGColor(elem) {
     var  bgc = computedStyle(elem,  'background-color' );
     return  (!!bgc) && (bgc !==  'transparent' ) && (bgc !==  'rgba(0, 0, 0, 0)' ) && (computedStyle(elem,  'opacity' ) !==  '0' ) && (computedStyle(elem,  'visibility' ) !==  'hidden' ) && (computedStyle(elem,  'display' ) !==  'none' );
}
 
 
/**
  * 获得元素最终的背景色(不考虑半透明叠加颜色的情况)
  * @param elem
  * @returns {string}
  */
function  getFinalBGColor(elem) {
     if  (isFinalBGColor(elem)){
         return  computedStyle(elem,  'background-color' );
     } else  if  (elem!==document.documentElement) {
         return  getFinalBGColor(elem.parentNode);
     }
     return  '' ;
}

    经过测试,在通常情况下,以上代码可用。










本文转自 iampomelo 51CTO博客,原文链接:http://blog.51cto.com/iampomelo/1901241,如需转载请自行联系原作者
目录
相关文章
|
4月前
|
前端开发 JavaScript
几种常见的获取页面元素数据的方法
几种常见的获取页面元素数据的方法
27 0
|
6月前
|
前端开发
css样式覆盖顺序
css样式覆盖顺序
|
1月前
|
索引
将数组指定索引位置的元素 移动到 目标索引位置,且不改变其他元素原本的顺序,注意这个不是对调元素位置,是移动某一个元素位置不影响其他元素顺(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)
将数组指定索引位置的元素 移动到 目标索引位置,且不改变其他元素原本的顺序,注意这个不是对调元素位置,是移动某一个元素位置不影响其他元素顺(使用场景:拖拽改变数据的顺序,点击上下左右箭头移动元素顺序)
|
JavaScript 容器 前端开发
js计算元素距离顶部的高度及元素是否在可视区判断
前言:   在业务当中,我们经常要计算元素的大小和元素在页面的位置信息。比如说,在一个滚动区域内,我要知道元素A是在可视区内,还是在隐藏内容区(滚动到外边看不到了)。有时还要进一步知道,元素是全部都显示在可视区,还是有部分在可视区部分在隐藏内容区。
5235 0
|
5月前
|
JavaScript
【sgDrag】自定义组件:基于Vue开发支持批量声明拖拽元素、被碰撞元素,拖拽全过程监听元素碰撞检测并返回拖拽原始元素、克隆元素及其getBoundingClientRect对象和碰撞接触元素数组。
【sgDrag】自定义组件:基于Vue开发支持批量声明拖拽元素、被碰撞元素,拖拽全过程监听元素碰撞检测并返回拖拽原始元素、克隆元素及其getBoundingClientRect对象和碰撞接触元素数组。
|
6月前
几种隐藏元素的方法
几种隐藏元素的方法
17 0
|
8月前
|
移动开发
操作元素样式
操作元素样式
|
9月前
隐藏页面的元素的方式
隐藏页面的元素的方式
|
10月前
|
前端开发 容器
css中如何调整元素位置
css中如何调整元素位置
103 0
|
JavaScript API 容器
彻底弄懂元素样式、位置、大小相关计算
在我们日常开发中偶尔会碰到获取元素样式、设置某元素样式、计算元素位置、计算滚动距离等需求。但是js中关于元素位置、样式、大小的api种类繁多,稍不留神就会搞不清楚。今天笔者就带你彻底弄清楚,让你在这类问题上不再迷茫。
164 0