Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何通过JS获得定义的元素宽度?_Javascript_Css - Fatal编程技术网

Javascript 如何通过JS获得定义的元素宽度?

Javascript 如何通过JS获得定义的元素宽度?,javascript,css,Javascript,Css,我需要找出页面上某个元素通过CSS定义的宽度;我不需要浏览器计算的实际宽度 从内联样式属性获取宽度值没有问题,但是当宽度定义位于CSS文件中时,如何获取宽度定义 下面是一个包含3个div元素的简短示例: 第一个div使用内联CSS宽度,我可以找到它 第二个div具有通过CSS定义的相对宽度→ 如何找到“50%”值 第三个div没有宽度定义→ 我怎样才能发现这个div没有宽度 var-box1=document.getElementById('item1'); var box2=docume

我需要找出页面上某个元素通过CSS定义的宽度;我不需要浏览器计算的实际宽度

从内联样式属性获取宽度值没有问题,但是当宽度定义位于CSS文件中时,如何获取宽度定义

下面是一个包含3个div元素的简短示例:

  • 第一个div使用内联CSS宽度,我可以找到它
  • 第二个div具有通过CSS定义的相对宽度→ 如何找到“50%”值
  • 第三个div没有宽度定义→ 我怎样才能发现这个div没有宽度
var-box1=document.getElementById('item1');
var box2=document.getElementById('item2');
var box3=document.getElementById('item3');
console.log('Box 1 width:',box1.style.width);//一切都好!
console.log('Box 2 width:',box2.style.width);//要求的结果:“50%”
console.log('Box 3 width:',box3.style.width);//所需结果:“,”初始“或未定义
#item1{宽度:200px;}
#第2项{宽度:50%;}
#第1项、第2项、第3项{背景:ccc;边距:2px;填充:5px}
框1
方框2
框3编辑

我最初的答案遗漏了一点:如果元素应用了内联样式,请使用它,如果没有内联样式,请查看样式表

getComputedStyle
将为您提供div的实际宽度,而不是样式表中指定的宽度

如果需要查找样式表中定义的规则,而不是元素的实际样式值,可以通过迭代样式表来查找

让cssRules=Array.from(document.styleSheets[0].rules)//你设定的三种风格
函数getStylesheetPropertyForElement(id,属性){
let element=document.getElementById(id),appliedStyle=“”;
如果(!element)返回false;
//如果可用,请选择内联样式!
if(element.style[property])返回element.style[property]//
//颠倒规则的顺序。
//天真地假设最近的规则就是应用的规则
//不尝试处理优先级和!重要
cssRules.reverse().some(规则=>{
//此规则的选择器是否匹配?
if(element.matches(rule.selectorText)){
//是的。对所需的财产有规定吗?
if(Array.from(rule.style).some(el=>el==property)){
//伟大的
appliedStyle=rule.style[property];
返回true;
}
}
});
返回appliedStyle;
}
log(getStylesheetPropertyForElement('item1','width')//汽车
log(getStylesheetPropertyForElement('item2','width')//50%
log(getStylesheetPropertyForElement('item3','width')//“”
#item1{宽度:200px;}
#第2项{宽度:50%;}
#第1项、第2项、第3项{背景:ccc;边距:2px;填充:5px}
框1
方框2

框3
这些解决方案都有效。我不知道我怎么会想念他们。。。谢谢@Philipp我理解你的问题,这里发布的解决方案不起作用,因为它们显示了元素宽度的实际值,而不是在样式表中指定的原始值,在它被内联或继承覆盖之前style@chiliNUT,我提供的解决方案链接只是解决方案的提示。@chiliNUT你说得对。我在jsbin中测试了
getComputedStyle
方法-结果看起来不错,但在实际的JS文件中,结果不是定义,而是解析值。框1的宽度应该是每个问题的“自动”…我制作了一个jsbin,将此答案的结果与
getComputedStyle
方法进行比较。这个答案是正确的!→ (注意:当“输出”被禁用时,两种方法都会给出正确的结果)完美的解决方案。我将把你的代码留给我自己,以备将来之用。
:)
@iAmOren这是一个伟大的观点!我回答了“工作表采用了什么样式”的问题,但没有回答nuance@chiliNUT我需要知道用户是否为截面定义了自定义宽度。宽度可以在可视化生成器中指定,也可以通过CSS文件指定(或者根本不指定)。当宽度未定义或设置为“自动”时,我的脚本需要应用默认值。这就是为什么我不能使用计算的宽度,因为它不能区分自定义宽度和自动宽度