Holen Sie sich einen CSS-Wert mit JavaScript

198

Ich weiß, dass ich einen CSS-Wert über JavaScript festlegen kann , z.

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

Aber ich kann bekommen einen aktuellen spezifischen Stil Wert? Ich habe gelesen, wo ich den gesamten Stil für das Element erhalten kann, aber ich möchte nicht den gesamten String analysieren müssen, wenn ich nicht muss.

Michael Paul
quelle
Welchen 'spezifischen Stilwert' möchten Sie erreichen?
BryanH
Aktuelle Positionierungswerte: Höhe, Breite, Oberseite, Rand usw.
Michael Paul
2
Ihre Frage lässt var top = document.getElementById('image_1').style.top; vermuten , dass Sie etwas wollen, wie Sie es vielleicht umformulieren möchten, wenn Sie es nicht wollen
Marc
Vielen Dank, beide Methoden funktionieren perfekt, genau das, was ich brauchte. Die Jquery-Methode ist etwas kompakter, daher werde ich sie wahrscheinlich verwenden.
Michael Paul

Antworten:

355

Sie können verwenden getComputedStyle().

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

jsFiddle .

Alex
quelle
10
Wenn Sie beispielsweise die Hintergrundfarbe eines Div ändern möchten, achten Sie darauf, NICHT "backgroundColor" anstelle von "backgroung-color" zu verwenden;)
Taufe
4
Ist slw ein Akronym oder meintest du langsam?
David Winiecki
3
getComputedStyle wird in IE 8 und niedriger nicht unterstützt.
David Winiecki
6
Etwas abseits des Themas: Einige (alle?) CSS-Kurzschrift-Eigenschaften sind in JavaScript nicht verfügbar. ZB kann man links auffüllen, aber nicht auffüllen. JSFiddle
David Winiecki
4
@ DavidWiniecki Ich glaube nicht wirklich, dass Webdevs IE8 immer noch als Mainstream-Browser betrachten sollten. wenn man bedenkt, dass es nicht mehr von Microsoft unterstützt wird
Kevin Kuyl
23

Mit der Eigenschaft element.style können Sie nur die CSS-Eigenschaften kennen, die in diesem Element als Inline definiert wurden (programmgesteuert oder im style-Attribut des Elements definiert). Sie sollten den berechneten Stil erhalten.

Es ist nicht so einfach, dies browserübergreifend zu tun. Der IE hat seinen eigenen Weg über die element.currentStyle-Eigenschaft, und der von anderen Browsern implementierte DOM Level 2-Standardweg erfolgt über die document.defaultView.getComputedStyle-Methode.

Die beiden Methoden weisen Unterschiede auf. Beispielsweise erwartet die IE-Eigenschaft element.currentStyle, dass Sie auf die CSS-Eigenschaftsnamen zugreifen, die aus zwei oder mehr Wörtern in camelCase bestehen (z. B. maxHeight, fontSize, backgroundColor usw.). Die Standardmethode erwartet die Eigenschaften mit der Wörter, die durch Bindestriche getrennt sind (z. B. maximale Höhe, Schriftgröße, Hintergrundfarbe usw.). ......

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

Hauptreferenz-Stackoverflow

Amir Movahedi
quelle
21

Verwenden Sie Folgendes. Es hat mir geholfen.

document.getElementById('image_1').offsetTop

Siehe auch Stile abrufen .

user843938
quelle
16

Browserübergreifende Lösung zur Überprüfung von CSS-Werten ohne DOM-Manipulation:

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

Verwendung:

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

Bereinigte Version (erzwingt die Auswahl des Selektors in Kleinbuchstaben und ermöglicht den Anwendungsfall ohne führendes ".")

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];
     }
    }
   }
  }
 }
Karolf
quelle
Ich hatte einen langen Tag und das funktionierte aus mehreren Gründen nicht. pastie.org/9754599 funktioniert viel besser, indem ungültige Regellisten verworfen und beide Seiten des Finales verkleinert werden ===. Vielen Dank, dass Ihre Lösung den Tag gerettet hat!
Richard Fox
Gute Antwort, am Ende wurde eine bereinigte Version hinzugefügt, um einige Probleme bei der Verwendung von Randfällen zu beheben.
unsynchronisiert
7

Wenn Sie es programmgesteuert einstellen, können Sie es einfach wie eine Variable (dh document.getElementById('image_1').style.top) aufrufen . Andernfalls können Sie immer jQuery verwenden:

<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>
adotout
quelle
7
Ich denke nicht, dass Ihr jQuery-Beispiel sehr klar (oder richtig) ist.
Alex
Die Stileigenschaft gibt alle Stilinline-Elemente zurück, die nicht durch CSS-Regeln definiert sind.
Steven Koch
2

Wenn Sie in Bibliotheken, warum nicht MyLibrary und getStyle .

Die jQuery CSS - Methode ist falsch benannt, CSS ist nur eine Art und Weise Arten der Einstellung und stellen nicht notwendigerweise die tatsächlichen Werte eines Style - Eigenschaften des Elements.

RobG
quelle
2

Im Jahr 2020

vor Gebrauch prüfen

Sie können computedStyleMap () verwenden

Die Antwort ist gültig, aber manchmal müssen Sie überprüfen, welche Einheit zurückgegeben wird. Sie können dies ohne eine slice()oder eine substring()Zeichenfolge erhalten.

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>

Nisharg Shah
quelle
1

Aus Sicherheitsgründen möchten Sie möglicherweise überprüfen, ob das Element vorhanden ist, bevor Sie versuchen, daraus zu lesen. Wenn es nicht vorhanden ist, löst Ihr Code eine Ausnahme aus, die die Ausführung auf dem Rest Ihres JavaScript stoppt und dem Benutzer möglicherweise eine Fehlermeldung anzeigt - nicht gut. Sie möchten in der Lage sein, anmutig zu scheitern.

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
}
BryanH
quelle
5
Das ist eine schlechte Idee, es sei denn, Sie erwarten wirklich, dass sich der Knoten möglicherweise nicht im DOM befindet. Blinde Nullprüfungen, wenn keine Null erwartet wird, können dazu führen, dass keine Fehler angezeigt werden, aber es ist wahrscheinlicher, dass ein Fehler ausgeblendet wird. Wenn Sie erwarten, dass der Knoten vorhanden ist, codieren Sie ihn nicht, da er nicht vorhanden ist. Lassen Sie einen Fehler auftreten, damit Sie Ihren Code korrigieren können. Diese Antwort hat nichts mit der Frage selbst zu tun und da es sich eher um einen (schlechten) Vorschlag handelt, sollte es sich um einen Kommentar handeln.
Juan Mendes
2
Vielen Dank für Ihren Kommentar. Ich mache das, weil ich dazu neige, mich defensiv zu entwickeln. Hier ist die Frage: Wie würden Sie den Fehler auf dem Computer des Benutzers sehen? Denken Sie daran, was für Sie auf Ihrem Computer funktioniert, funktioniert möglicherweise nicht für andere (verschiedene Browser und Betriebssysteme, Plugins, die das Seitenverhalten beeinflussen, verschiedene andere deaktivierte Dinge usw.). Der Punkt war, dass es ordnungsgemäß fehlschlug, damit die Seite immer noch etwas in der Nähe des beabsichtigten Ziels tat, anstatt dem Benutzer einen nutzlosen Fehler zu melden.
BryanH
@BryanH Gibt es einen Browser-Fehler, bei dem kein Element mit der ID "image_1" gerendert wird? ;)
alex
@alex Nein. Wenn diese ID kein Element enthält, schlägt der OP-Code mit einem Fehler fehl. Beispiel . Mein Vorschlag war, zu codieren, damit dies niemals passieren kann.
BryanH
0

Die oben angegebene browserübergreifende Lösung ohne DOM-Manipulation funktioniert nicht, da sie die erste und nicht die letzte Übereinstimmungsregel enthält. Die letzte Übereinstimmungsregel ist diejenige, die gilt. Hier ist eine Arbeitsversion:

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

Diese einfache Suche funktioniert jedoch bei komplexen Selektoren nicht.

jcdufourd
quelle