【问题标题】:How to get defined width of element via JS? [duplicate]如何通过 JS 获取元素的定义宽度? [复制]
【发布时间】:2020-12-18 07:35:29
【问题描述】:

我需要找出页面上元素的通过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); // all good!
console.log('Box 2 width:', box2.style.width); // required result: "50%"
console.log('Box 3 width:', box3.style.width); // required result: "", "initial" or undefined
#item1 { width: 200px; }
#item2 { width: 50%; }

#item1, #item2, #item3 { background: #ccc; margin: 2px; padding: 5px }
<div id="item1" style="width: auto">Box 1</div>
<div id="item2">Box 2</div>
<div id="item3">Box 3</div>

【问题讨论】:

  • 这些解决方案都有效。我不知道我怎么会想念他们...谢谢!
  • @Philipp 据我了解您的问题,此处发布的解决方案不起作用,因为它们显示元素宽度的实际值,而不是样式表中指定的原始值,然后用内联或继承样式
  • @chiliNUT,我提供的解决方案链接只是一个解决方案的提示。
  • @chiliNUT 你是对的。我在 jsbin 中测试了 getComputedStyle 方法 - 结果看起来确实不错,但在实际的 JS 文件中,结果不是定义而是解析值

标签: javascript css


【解决方案1】:

编辑

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

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

如果您需要找出样式表中定义的规则,而不是元素的实际样式值,您可以通过遍历样式表来实现。

let cssRules = Array.from(document.styleSheets[0].rules); //the 3 styles youve set
function getStylesheetPropertyForElement(id, property) {
    let element = document.getElementById(id), appliedStyle ="";
    if (!element) return false;
    // prefer inline style if available!
    if (element.style[property]) return element.style[property];//
    // reverse the order of the rules. 
    // naively assumes the most recent rule is the one thats applied
    // makes no attempt to handle priority and !important
    cssRules.reverse().some(rule => {
        // does the selector for this rule match?
        if (element.matches(rule.selectorText)) {
            //yes. is there a rule for the required property?
            if (Array.from(rule.style).some(el=>el === property)) {
                // great
                appliedStyle = rule.style[property];
                return true;
            }
        }
    });
    return appliedStyle;
}
console.log(getStylesheetPropertyForElement('item1', 'width')); //auto
console.log(getStylesheetPropertyForElement('item2', 'width')); //50%
console.log(getStylesheetPropertyForElement('item3', 'width')); //""
#item1 { width: 200px; }
#item2 { width: 50%; }

#item1, #item2, #item3 { background: #ccc; margin: 2px; padding: 5px }
<div id="item1" style="width: auto">Box 1</div>
<div id="item2">Box 2</div>
<div id="item3">Box 3</div>

【讨论】:

  • 框 1 的宽度应为每个问题显示“自动”...
  • 我制作了一个 jsbin 来将此答案的结果与getComputedStyle 方法进行比较。这个答案是正确的! →jsbin.com/poqudug/edit?js,console,output(注意:当“输出”被禁用时,两种方法都会给出正确的结果)
  • 完美解决方案。将来我会为自己使用您的代码:)
  • @iAmOren 这是一个很好的观点!我回答了“工作表应用了哪种样式”的问题,却忽略了细微差别
  • @chiliNUT 我需要知道用户是否为部分定义了自定义宽度。宽度可以在可视化构建器中指定,也可以通过 CSS 文件指定(或根本不指定)。当宽度未定义或设置为“自动”时,我的脚本需要应用默认值。这就是为什么我不能使用计算宽度,因为它不区分自定义宽度和自动宽度
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 2022-07-15
  • 2017-11-28
  • 2013-07-31
相关资源
最近更新 更多