代码之家  ›  专栏  ›  技术社区  ›  Sofi Davidov

style.display返回错误值

  •  0
  • Sofi Davidov  · 技术社区  · 5 年前

    我知道我可以 设置

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

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

    0 回复  |  直到 12 年前
        1
  •  345
  •   Josh Schultz    6 年前

    你可以用 getComputedStyle() .

    var element = document.getElementById('image_1'),
        style = window.getComputedStyle(element),
        top = style.getPropertyValue('top');
    

    jsFiddle .

        2
  •  23
  •   Community CDub    7 年前

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

    用跨浏览器的方式来实现它并不容易,IE有自己的方法,通过element.currentStyle属性,而其他浏览器实现的DOM级别2标准方法是通过document.defaultView.getComputedStyle方法。

    这两种方法有区别,例如,IE element.currentStyle属性希望访问由camelCase中的两个或多个单词组成的CSS属性名(例如max height、font size、background color等),标准方法希望属性的单词用破折号分隔(例如max height、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

        3
  •  20
  •   Peter Mortensen icecrime    10 年前

    使用以下命令。它帮助了我。

    document.getElementById('image_1').offsetTop
    

    Get Styles .

        4
  •  16
  •   John    5 年前

    无需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];
         }
        }
       }
      }
     }
    
        5
  •  7
  •   T J    8 年前

    如果您以编程方式设置它,您可以像调用变量一样调用它(即。 document.getElementById('image_1').style.top

    <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>
    
        6
  •  2
  •   RobG    13 年前

    如果你喜欢图书馆,为什么不 MyLibrary getStyle .

    css

        7
  •  1
  •   BryanH Philipp Andreychev    13 年前

    出于安全考虑,您可能希望在尝试读取元素之前检查该元素是否存在。如果它不存在,代码将抛出一个异常,它将停止对其余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
    }
    
        8
  •  1
  •   Nisharg Shah    5 年前

    2019年

    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;
    }
    <div class="jsCSS"></div>
        9
  •  0
  •   jcdufourd    7 年前

    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;
    }  
    

    但是,对于复杂的选择器,这种简单的搜索将不起作用。