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

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

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


当前回答

出于安全考虑,在尝试读取元素之前,您可能希望检查元素是否存在。如果它不存在,您的代码将抛出一个异常,这将停止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
}

其他回答

元素。style属性让你只知道在该元素中定义为内联的CSS属性(通过编程方式,或者在元素的style属性中定义),你应该得到计算的样式。

在跨浏览器的方式中并不是那么容易做到的,IE有自己的方式,通过元素。而DOM Level 2的标准方式,被其他浏览器实现是通过document.defaultView.getComputedStyle方法。

这两种方式有区别,例如IE元素。currentStyle属性期望你访问由两个或多个单词组成的CSS属性名(如maxHeight, fontSize, backgroundColor等),标准方式期望用破折号分隔的属性(如max-height, font-size, background-color等)。 ......

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

主参考堆栈溢出

使用下面的方法。它帮助了我。

document.getElementById('image_1').offsetTop

参见获取样式。

上述没有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;
}  

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

出于安全考虑,在尝试读取元素之前,您可能希望检查元素是否存在。如果它不存在,您的代码将抛出一个异常,这将停止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
}

如果你以编程方式设置它,你可以像调用变量一样调用它(即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>