【问题标题】:How to get an HTML element's style values in javascript?如何在 javascript 中获取 HTML 元素的样式值?
【发布时间】:2011-02-09 11:30:37
【问题描述】:

我正在寻找一种方法来从具有样式标记设置的样式的元素中检索样式。

<style> 
#box {width: 100px;}
</style>

在体内

<div id="box"></div>

我正在寻找不使用库的直接 javascript。

我尝试了以下方法,但一直收到空白:

alert (document.getElementById("box").style.width);  
alert (document.getElementById("box").style.getPropertyValue("width"));

我注意到,如果我使用 javascript 设置了样式,我只能使用上述内容,但无法使用样式标签。

【问题讨论】:

标签: javascript html css stylesheet


【解决方案1】:

使用getComputedStyle函数,计算样式包含所有CSS属性设置为一个元素。即使不为元素设置属性。您仍然会在计算样式中找到该属性。

示例:


<style>
#Body_element {
color: green;
}
</style>

<body id="Body_element">
<script>
     alert(getComputedStyle(Body_element).color)
</script>
</body>

【讨论】:

    【解决方案2】:

    您可以创建函数getStyles,它将接受一个元素,其他参数是您想要的值的属性。

    const convertRestArgsIntoStylesArr = ([...args]) => {
        return args.slice(1);
    }
    
    const getStyles = function () {
        const args = [...arguments];
        const [element] = args;
    
        let stylesProps = [...args][1] instanceof Array ? args[1] : convertRestArgsIntoStylesArr(args);
    
        const styles = window.getComputedStyle(element);
        const stylesObj = stylesProps.reduce((acc, v) => {
            acc[v] = styles.getPropertyValue(v);
            return acc;
        }, {});
    
        return stylesObj;
    };
    

    现在,你可以像这样使用这个函数:

    const styles = getStyles(document.body, "height", "width");
    

    const styles = getStyles(document.body, ["height", "width"]);
    

    【讨论】:

      【解决方案3】:

      我相信你现在可以使用 Window.getComputedStyle()

      Documentation MDN

      var style = window.getComputedStyle(element[, pseudoElt]);
      

      获取元素宽度的示例:

      window.getComputedStyle(document.querySelector('#mainbar')).width
      

      【讨论】:

        【解决方案4】:

        jQuery,你可以做alert($("#theid").css("width"))

        -- 如果你没有看过 jQuery,我强烈推荐它;它使许多简单的 JavaScript 任务变得毫不费力。

        更新

        为了记录,这篇文章已有 5 年历史了。网络已经发展,继续前进,等等。有一些方法可以使用 Plain Old Javascript 来做到这一点,这更好。

        【讨论】:

        • 他在问题中明确表示不想使用库(jQuery是库...)
        【解决方案5】:

        element.style 属性让您只知道在该元素中定义为 inline 的 CSS 属性(以编程方式,或在元素的 style 属性中定义),您应该获得 计算样式

        跨浏览器的方式没那么容易做到,IE有自己的方式,通过element.currentStyle属性,以及DOM Level 2的标准方式,其他浏览器实现的是通过document.defaultView.getComputedStyle 方法。

        这两种方式是有区别的,比如IE的element.currentStyle属性期望你访问的CCS属性名是由camelCase中的两个或多个单词组成的(例如maxHeight,fontSizebackgroundColor 等),标准方式需要用破折号分隔单词的属性(例如 max-heightfont-sizebackground-color 等)。

        此外,IE element.currentStyle 将返回所有指定单位的尺寸(例如 12pt、50%、5em),标准方式将始终以像素为单位计算实际尺寸。

        我前段时间做了一个跨浏览器的函数,可以让你以跨浏览器的方式获取计算出来的样式:

        function getStyle(el, styleProp) {
          var value, defaultView = (el.ownerDocument || document).defaultView;
          // W3C standard way:
          if (defaultView && defaultView.getComputedStyle) {
            // sanitize property name to css notation
            // (hypen separated words eg. font-Size)
            styleProp = styleProp.replace(/([A-Z])/g, "-$1").toLowerCase();
            return defaultView.getComputedStyle(el, null).getPropertyValue(styleProp);
          } else if (el.currentStyle) { // IE
            // sanitize property name to camelCase
            styleProp = styleProp.replace(/\-(\w)/g, function(str, letter) {
              return letter.toUpperCase();
            });
            value = el.currentStyle[styleProp];
            // convert other units to pixels on IE
            if (/^\d+(em|pt|%|ex)?$/i.test(value)) { 
              return (function(value) {
                var oldLeft = el.style.left, oldRsLeft = el.runtimeStyle.left;
                el.runtimeStyle.left = el.currentStyle.left;
                el.style.left = value || 0;
                value = el.style.pixelLeft + "px";
                el.style.left = oldLeft;
                el.runtimeStyle.left = oldRsLeft;
                return value;
              })(value);
            }
            return value;
          }
        }
        

        上述函数在某些情况下并不完美,例如对于颜色,标准方法将以 rgb(...) 表示法返回颜色,在 IE 上它们将按原样返回颜色已定义。

        我目前正在撰写该主题的一篇文章,您可以关注我对这个功能所做的更改here

        【讨论】:

        • @BalusC:我觉得这个问题比较通用,也许版主可以合并它们?...
        • 这比我想象的要复杂得多。非常感谢您的快速回复。我试着寻找这个,但我不断得到不同库的答案,尤其是 jQuery。 @BalusC:感谢编辑
        • document.defaultViewwindow。所以你可以直接使用getComputedStyle,而不是document.defaultView.getComputedStyle
        • 您的开头段落解释了为什么在将我的内联 CSS 移动到单独的文件后,我的 Javascript 无法正常工作。我在网上找到的唯一指出这一点的地方,谢谢!
        猜你喜欢
        • 1970-01-01
        • 2012-11-09
        • 1970-01-01
        • 2015-02-24
        • 2022-08-14
        • 1970-01-01
        • 2010-12-18
        • 2019-10-12
        相关资源
        最近更新 更多