【问题标题】:Get a CSS value with JavaScript使用 JavaScript 获取 CSS 值
【发布时间】:2011-09-14 08:35:15
【问题描述】:

我知道我可以通过 JavaScript 设置一个 CSS 值,例如:

document.getElementById('image_1').style.top = '100px';

但是,我可以获取当前的特定样式值吗?我已经阅读了在哪里可以获得元素的整个样式,但如果不需要,我不想解析整个字符串。

【问题讨论】:

  • 你想获得什么“特定的风格价值”?
  • 当前定位值:高度、宽度、顶部、边距等
  • 你的问题让人相信你想要var top = document.getElementById('image_1').style.top; 这样的东西,如果这不是你想要的,可能需要改写
  • 谢谢所有,这两种方法都能完美运行,正是我所需要的。 Jquery 方法更紧凑一些,所以我可能会使用它。

标签: javascript css


【解决方案1】:

您可以使用getComputedStyle()

    var element = document.getElementById('image_1'),
        style = window.getComputedStyle(element),
        top = style.getPropertyValue('top');
    console.log(top);
<img id="image_1">

jsFiddle.

【讨论】:

  • 如果你想改变一个 div 的背景颜色,注意不要使用 "backgroundColor" 而不是 "backgroung-color" ;)
  • slw 是首字母缩略词还是你的意思是慢?
  • getComputedStyle 在 IE 8 及以下版本中不受支持。
  • 有点离题:一些(全部?)shorthand css properties 在 JavaScript 中无法访问。例如。你可以得到 padding-left 但不是 padding。 JSFiddle
  • @DavidWiniecki 我真的不相信 webdevs 仍然应该将 IE8 视为主流浏览器。考虑到微软不再支持它
【解决方案2】:

如果您以编程方式设置它,您可以像变量一样调用它(即document.getElementById('image_1').style.top)。否则,你总是可以使用 jQuery:

<html>
    <body>
        <div id="test" style="height: 100px;">Test</div>
        <script type="text/javascript" src="jquery.min.js"></script>
        <script type="text/javascript">
            alert($("#test").css("height"));
        </script>
    </body>
</html>

【讨论】:

  • 我认为您的 jQuery 示例不是很清楚(或正确)。
  • style 属性返回所有样式内联应用于元素,未由 css 规则定义。
【解决方案3】:

为了安全起见,您可能希望在尝试读取该元素之前检查该元素是否存在。如果它不存在,您的代码将抛出一个异常,这将停止在您的 JavaScript 的其余部分上执行,并可能向用户显示一条错误消息——不好。你希望能够优雅地失败。

var height, width, top, margin, item;
item = document.getElementById( "image_1" );
if( item ) {
  height = item.style.height;
  width = item.style.width;
  top = item.style.top;
  margin = item.style.margin;
} else {
  // Fail gracefully here
}

【讨论】:

  • 这是个坏主意,除非你真的期望节点可能不在 DOM 中。当不期望 null 时进行盲目的 null 检查可能会让您看起来没有错误,但它更有可能隐藏错误。如果您希望节点存在,请不要为其不存在编码,让错误发生以便您可以修复您的代码。这个答案与问题本身无关,因为它更像是一个(坏的)建议,它应该是一个评论。
  • 感谢您的评论。我这样做是因为我倾向于在防守端发展。问题是:您如何看待用户机器上的错误?请记住,在您的机器上对您有用的东西可能对其他人不起作用(不同的浏览器和操作系统、影响页面行为的插件、各种其他关闭的东西等)。关键是让它优雅地失败,这样页面仍然会做一些接近预期的事情,而不是向用户弹出一个无用的错误。
  • @BryanH 有一个浏览器错误,它不会呈现 id 为“image_1”的元素? ;)
  • @alex 否。如果没有具有该 id 的元素,则 OP 的代码将失败并出现错误。 Example。我的建议是编写代码,这样就永远不会发生。
【解决方案4】:

使用以下内容。它帮助了我。

document.getElementById('image_1').offsetTop

另请参阅Get Styles

【讨论】:

    【解决方案5】:

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

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

    这两种方式有区别,例如IE element.currentStyle 属性期望你访问由camelCase 中的两个或多个单词组成的CSS 属性名(例如maxHeight、fontSize、backgroundColor 等),标准方式期望用破折号分隔的单词的属性(例如,最大高度、字体大小、背景颜色等)。 ......

    function getStyle(el, styleProp) {
        var value, defaultView = (el.ownerDocument || document).defaultView;
        // W3C standard way:
        if (defaultView && defaultView.getComputedStyle) {
            // sanitize property name to css notation
            // (hyphen 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;
        }
    }
    

    Main reference stackoverflow

    【讨论】:

      【解决方案6】:

      无需 DOM 操作即可检查 CSS 值的跨浏览器解决方案:

      function get_style_rule_value(selector, style)
      {
       for (var i = 0; i < document.styleSheets.length; i++)
       {
        var mysheet = document.styleSheets[i];
        var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
      
        for (var j = 0; j < myrules.length; j++)
        {
         if (myrules[j].selectorText && myrules[j].selectorText.toLowerCase() === selector)
         {
          return myrules[j].style[style];
         }
        }
       }
      };
      

      用法:

      get_style_rule_value('.chart-color', 'backgroundColor')
      

      经过清理的版本(强制选择器输入为小写,并允许用例不带前导“.”)

      function get_style_rule_value(selector, style)
      {
       var selector_compare=selector.toLowerCase();
       var selector_compare2= selector_compare.substr(0,1)==='.' ?  selector_compare.substr(1) : '.'+selector_compare;
      
       for (var i = 0; i < document.styleSheets.length; i++)
       {
        var mysheet = document.styleSheets[i];
        var myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
      
        for (var j = 0; j < myrules.length; j++)
        {
          if (myrules[j].selectorText)
          {
           var check = myrules[j].selectorText.toLowerCase();
           switch (check)
           {
            case selector_compare  :
            case selector_compare2 : return myrules[j].style[style];
           }
          }
         }
        }
       }
      

      【讨论】:

      • 我度过了漫长的一天,但由于多种原因无法正常工作。 pastie.org/9754599 通过丢弃无效的规则列表并将最终 === 的两边都小写,效果会更好。非常感谢您的解决方案仍然挽救了局面!
      • 好答案,在最后添加了一个净化版本以修复一些边缘案例使用问题。
      【解决方案7】:

      上面给出的没有 DOM 操作的跨浏览器解决方案不起作用,因为它给出了第一个匹配规则,而不是最后一个。最后一个匹配规则是适用的。这是一个工作版本:

      function getStyleRuleValue(style, selector) {
        let value = null;
        for (let i = 0; i < document.styleSheets.length; i++) {
          const mysheet = document.styleSheets[i];
          const myrules = mysheet.cssRules ? mysheet.cssRules : mysheet.rules;
          for (let j = 0; j < myrules.length; j++) {
            if (myrules[j].selectorText && 
                myrules[j].selectorText.toLowerCase() === selector) {
              value =  myrules[j].style[style];
            }
          }
        }
        return value;
      }  
      

      但是,这种简单的搜索不适用于复杂的选择器。

      【讨论】:

        【解决方案8】:

        2021 年

        check使用前

        你可以使用computedStyleMap()

        答案是有效的,但有时您需要检查它返回的单位,无需任何slice()substring() 字符串即可获得。

        var element = document.querySelector('.js-header-rep');
        element.computedStyleMap().get('padding-left');
        

        var element = document.querySelector('.jsCSS');
        var con = element.computedStyleMap().get('padding-left');
        console.log(con);
        .jsCSS {
          width: 10rem;
          height: 10rem;
          background-color: skyblue;
          padding-left: 10px;
        }
        &lt;div class="jsCSS"&gt;&lt;/div&gt;

        【讨论】:

        • Safari 说“TypeError: element.computedStyleMap 不是函数”。 :-(
        • Safari 到现在还没有支持 :-(
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-30
        • 2011-07-08
        • 2017-04-24
        相关资源
        最近更新 更多