如何获取元素的最终background-color
发布时间 - 2026-01-10 22:53:01 点击率:次一、题目

用JS代码求出页面上一个元素的最终的background-color,不考虑IE浏览器,不考虑元素float情况。
二、题目解析
1.考察底层JavaScript基础
前端开发,日常最常接触的就是页面样式的编写。而摆脱jQuery等工具库,用原生js获取样式,是每个前端程序猿进阶阶段必须掌握的技能。
2.考察面试者的思维缜密程度和开发经验
如果认为单单求元素计算后的样式,就有点too young了。页面的样式的复杂,永远是最虐心的。就算前端有多牛,一听到兼容IE6,论谁都会心塞。所以还要考虑特殊的情况:display,opacity,visibility的取值。
三、理论基础
1. 内联样式
内联样式可以通过元素的style属性获取,如果style属性有background-color值,则可以直接获取出来 (暂不考虑!important) 。
2. 外联的层叠样式
DOM2样式规范在document.defaultView中包含了一个getComputedStyle()方法。该方法返回一个只读的CSSStyleDeclaration对象,其中包含特定元素的所有计算样式。
四、解题
4.1 将所有工具方法封装在WDS(wall dom script)命名空间中
(function(WDS, undefined){
// 封装代码...
})(window.WDS || (window.WDS = {}));
代码封装在命名空间里,不会造成无意间的代码污染。
4.2 工具方法camelize
// 字符串转换为驼峰写法
function camelize(str) {
return str.replace(/-(\w)/g, function (strMatch, p1){
return p1.toUpperCase();
});
}
该方法是为了方便后续getStyle()方法的编写,而独立出来的。
作用是将连字符类的css属性值,转换成驼峰写法。
例如:将background-color转换为backgroundColor
4.3 获取特定元素的计算样式
// 获取元素计算后的样式
function getStyle(elem, property){
if(!elem || !property){
return false;
}
var value = elem.style[camelize(property)], // 先获取是否有内联样式
css; // 获取的所有计算样式
// 无内联样式,则获取层叠样式表计算后的样式
if(!value){
if(document.defaultView && document.defaultView.getComputedStyle){
css = document.defaultView.getComputedStyle(elem, null);
value = css ? css.getPropertyValue(property) : null;
}
}
return value;
}
做到这一步,第一个考察点基本就满足了。也能获知面试者是否具备足够扎实的js基础。
另外,像安全保护性的判断if(!elem || !property)和功能嗅探if(document.defaultView && document.defaultView.getComputedStyle),都能很好地体现开发者的代码逻辑和开发经验。
4.4 排除特殊情况
// 检测获取的背景色是否有效
function checkBgValue(elem){
var value = getStyle(elem, 'background-color'),
hasColor = value ? true : false; // 是否有颜色
// 排除特殊情况
if(value == "transparent" || value == "rgba(0, 0, 0, 0)"){
// 未设置background-color,或者设置为跟随父节点
hasColor = false;
}else if(getStyle(elem, 'opacity') == "0"){
// dom节点透明度为全透明
hasColor = false;
}else if(getStyle(elem, 'visibility') == "hidden"){
// dom节点不可见
hasColor = false;
}else if(getStyle(elem, 'display') == "none"){
// dom节点不可见
hasColor = false;
}
return hasColor;
}
4.5 获取div在页面最终显示的颜色
// 获取div最终显示的颜色
function getRealBg(elem){
if(checkBgValue(elem)){
return getStyle(elem, 'background-color');
}else if(elem != document.documentElement){
return getRealBg(elem.parentNode);
}
return '';
}
获取样式值采用递归方式处理。
如果能顺利获取到元素样式,且不触发4.4 排除特殊情况中的一种,则直接返回结果。
触发了特殊情况,则需要查找父节点以及更上层的节点的样式,来获取肉眼能看到,显示在页面上的background-color值。
在向上回溯的过程中,如果已经回溯到html根节点,则可以停止回溯。所以加了判断else if(elem != document.documentElement)
五、遗漏的大boss
5.1 大boss !important
如果乱用 !important,对大型项目的维护和开发,绝对是一场噩梦。因为优先级规则的计算,!important永远处在食物链的最顶层。
当前题目不考虑这种情况,也是我的偷懒。确实很棘手,就不写这个逻辑分支的代码了。这里提醒一下~
5.2 大boss 父节点及根节点设置了不可见css属性
只要设置该css语句:html {display:none;},页面所有元素立刻消失不见。而任意特定元素的上级节点,只要设置了 opacity,display,visibility,判断逻辑瞬间变得复杂起来。所以,这个浑水我也不趟 O(∩_∩)O哈哈~
六、改进的点
其实特殊情况排除的判断,我偷懒没做到最好——rgb颜色值和特定颜色值(比如red)没有进行统一的转换,只是加了生硬的判断if(value == "transparent" || value == "rgba(0, 0, 0, 0)")。
有兴趣的可以搜索下颜色值转换的js方法,这里我就不写了。
七、源码和demo
源码地址:https://github.com/wall-wxk/blogDemo/blob/master/2017/02/05/getStyle.html
demo:https://wall-wxk.github.io/blogDemo/2017/02/05/getStyle.html
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
# 获取 元素
# background color
# BootStrap Table 获取同行不同列元素的方法
# jQuery获取this当前对象子元素对象的方法
# js通过classname来获取元素的方法
# javascript中获取元素标签中间的内容的实现方法
# JS获取html元素的标记名实现方法
# js获取元素的标签名实现方法
# jQuery实现获取元素索引值index的方法
# jQuery元素属性操作实例(设置、获取及删除元素属性)
# js 获取元素所有兄弟节点的实现方法
# 原生js获取元素样式的简单方法
# JQuery获取样式中的background-color颜色值的问题
# 求出
# 则可
# 递归
# 转换为
# 装在
# 不写
# 进阶
# 我就
# 也不
# 很好
# 第一个
# 都能
# 也能
# 有多
# 可以通过
# 有兴趣
# 这种情况
# 谁都
# 绝对是
# 设置为
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
如何自定义建站之星网站的导航菜单样式?
详解vue.js组件化开发实践
大连 网站制作,大连天途有线官网?
UC浏览器如何设置启动页 UC浏览器启动页设置方法
Laravel Fortify是什么,和Jetstream有什么关系
如何快速辨别茅台真假?关键步骤解析
jquery插件bootstrapValidator表单验证详解
Laravel怎么使用Intervention Image库处理图片上传和缩放
用v-html解决Vue.js渲染中html标签不被解析的问题
Laravel用户认证怎么做_Laravel Breeze脚手架快速实现登录注册功能
韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南
昵图网官方站入口 昵图网素材图库官网入口
C++用Dijkstra(迪杰斯特拉)算法求最短路径
javascript日期怎么处理_如何格式化输出
如何挑选优质建站一级代理提升网站排名?
linux写shell需要注意的问题(必看)
Linux网络带宽限制_tc配置实践解析【教程】
如何构建满足综合性能需求的优质建站方案?
JS中对数组元素进行增删改移的方法总结
JS碰撞运动实现方法详解
Laravel如何使用模型观察者?(Observer代码示例)
PythonWeb开发入门教程_Flask快速构建Web应用
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
Laravel如何使用Gate和Policy进行授权?(权限控制)
mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?
Midjourney怎么调整光影效果_Midjourney光影调整方法【指南】
VIVO手机上del键无效OnKeyListener不响应的原因及解决方法
javascript读取文本节点方法小结
香港网站服务器数量如何影响SEO优化效果?
如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环
如何在 React 中条件性地遍历数组并渲染元素
如何在Tomcat中配置并部署网站项目?
头像制作网站在线观看,除了站酷,还有哪些比较好的设计网站?
Laravel怎么实现搜索功能_Laravel使用Eloquent实现模糊查询与多条件搜索【实例】
详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)
如何在阿里云虚拟服务器快速搭建网站?
如何在阿里云香港服务器快速搭建网站?
Win11任务栏卡死怎么办 Windows11任务栏无反应解决方法【教程】
Laravel API路由如何设计_Laravel构建RESTful API的路由最佳实践
历史网站制作软件,华为如何找回被删除的网站?
悟空识字怎么关闭自动续费_悟空识字取消会员自动扣费步骤
如何快速使用云服务器搭建个人网站?
Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程
如何快速搭建二级域名独立网站?
北京的网站制作公司有哪些,哪个视频网站最好?
如何选择PHP开源工具快速搭建网站?
Python企业级消息系统教程_KafkaRabbitMQ高并发应用
想要更高端的建设网站,这些原则一定要坚持!
Laravel路由怎么定义_Laravel核心路由系统完全入门指南
Laravel怎么处理异常_Laravel自定义异常处理与错误页面教程

