Uzyskaj wartość CSS za pomocą JavaScript

199

Wiem, że mogę ustawić wartość CSS za pomocą JavaScript, na przykład:

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

Ale czy mogę uzyskać aktualną określoną wartość stylu? Przeczytałem, gdzie mogę uzyskać cały styl dla elementu, ale nie chcę analizować całego łańcucha, jeśli nie muszę.

Michael Paul
źródło
Jaką „konkretną wartość stylu” próbujesz uzyskać?
BryanH
aktualne wartości pozycjonowania: wysokość, szerokość, góra, margines itp.
Michael Paul
2
Twoje pytanie pozwala sądzić, że chcesz coś takiego. var top = document.getElementById('image_1').style.top; Może chcesz przeformułować, jeśli nie tego chcesz
Marc
Dzięki, obie metody działają idealnie, dokładnie to, czego potrzebowałem. Metoda Jquery jest nieco bardziej zwarta, więc prawdopodobnie jej użyję.
Michael Paul

Odpowiedzi:

357

Możesz użyć getComputedStyle().

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

jsFiddle .

alex
źródło
10
Jeśli chcesz na przykład zmienić kolor tła div, uważaj, aby NIE UŻYWAĆ „backgroundColor” zamiast „backgroung-color”;)
baptx
4
Czy slw jest akronimem, czy miałeś na myśli slow?
David Winiecki
3
getComputedStyle nie jest obsługiwany w IE 8 i niższych wersjach.
David Winiecki
6
Trochę nie na temat: niektóre (wszystkie?) Skrócone właściwości css nie są dostępne w JavaScript. Np. Możesz dostać dopełnienie w lewo, ale nie dopełnienie. JSFiddle
David Winiecki
4
@DavidWiniecki Nie sądzę, aby webdevs nadal uważali IE8 za przeglądarkę głównego nurtu. biorąc pod uwagę, że nie jest już obsługiwany przez Microsoft
Kevin Kuyl
23

Właściwość element.style pozwala poznać tylko właściwości CSS, które zostały zdefiniowane jako wbudowane w tym elemencie (programowo lub zdefiniowane w atrybucie stylu elementu), należy uzyskać obliczony styl.

Nie jest to takie łatwe w przeglądarce, IE ma swój własny sposób, poprzez właściwość element.currentStyle, a standardowy sposób DOM Level 2, implementowany przez inne przeglądarki, to metoda document.defaultView.getComputedStyle.

Istnieją dwa sposoby różnic, na przykład właściwość IE element.currentStyle oczekuje, że uzyskasz dostęp do nazw właściwości CSS złożonych z dwóch lub więcej słów w camelCase (np. MaxHeight, fontSize, backgroundColor itp.), Standardowy sposób oczekuje właściwości z właściwościami wyrazy oddzielone myślnikami (np. maksymalna wysokość, rozmiar czcionki, kolor tła itp.). ......

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

Główny przepływ stosu referencji

Amir Movahedi
źródło
21

Użyj następujących. Pomogło mi to.

document.getElementById('image_1').offsetTop

Zobacz także Uzyskaj style .

użytkownik843938
źródło
16

Rozwiązanie dla przeglądarki do sprawdzania wartości CSS bez manipulacji DOM:

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

Stosowanie:

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

Wersja odkażona (zmusza wejście selektora do małych liter i pozwala na użycie przypadku bez poprzedzającego „.”)

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
źródło
Miałem długi dzień i to nie działało z wielu powodów. pastie.org/9754599 działa o wiele lepiej, wyrzucając niepoprawne listy reguł i opuszczając obie strony finałowej wersji ===. Wielkie dzięki, Twoje rozwiązanie wciąż uratowało ten dzień!
Richard Fox,
dobra odpowiedź, dodałem odkażoną wersję na końcu, aby naprawić kilka problemów związanych z przypadkowymi przypadkami.
niezsynchronizowany
7

Jeśli ustawisz go programowo, możesz po prostu wywołać go jak zmienną (tj document.getElementById('image_1').style.top.). W przeciwnym razie zawsze możesz użyć 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>
adotout
źródło
7
Nie sądzę, aby twój przykład jQuery był bardzo jasny (lub poprawny).
alex
właściwość style zwraca wszystkie wbudowane style stosowane do elementu, nie zdefiniowane przez reguły css.
Steven Koch
2

Jeśli jesteś w bibliotekach, dlaczego nie MyLibrary i getStyle .

Metoda css jQuery jest źle nazwana, CSS jest tylko jednym ze sposobów ustawiania stylów i niekoniecznie odzwierciedla rzeczywiste wartości właściwości stylu elementu.

RobG
źródło
2

W 2020 r

sprawdź przed użyciem

Możesz użyć computedStyleMap ()

Odpowiedź jest ważny, ale czasami trzeba sprawdzić, co jednostka powraca, można dostać bez slice()lub substring()sznurkiem.

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
źródło
1

Ze względów bezpieczeństwa możesz chcieć sprawdzić, czy element istnieje, zanim spróbujesz go odczytać. Jeśli nie istnieje, kod wygeneruje wyjątek, który zatrzyma wykonanie na pozostałej części JavaScript i potencjalnie wyświetli komunikat o błędzie dla użytkownika - źle. Chcesz być w stanie z wdziękiem ponieść porażkę.

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
źródło
5
To zły pomysł, chyba że naprawdę spodziewasz się, że węzeł może nie znajdować się w DOM. Ślepe zerowanie sprawdza, kiedy nie jest oczekiwane zero, może sprawiać wrażenie braku błędów, ale bardziej prawdopodobne jest ukrycie błędu. Jeśli spodziewasz się, że węzeł tam będzie, nie koduj go, ponieważ nie ma go, pozwól na wystąpienie błędu, abyś mógł naprawić swój kod. Ta odpowiedź nie ma nic wspólnego z samym pytaniem, a ponieważ jest to raczej (zła) sugestia, powinien to być komentarz.
Juan Mendes,
2
Dzięki za komentarz. Robię to, ponieważ mam tendencję do rozwoju obronnego. Oto pytanie: jak zobaczyłbyś błąd na komputerze użytkownika? Pamiętaj, że to, co działa na twoim komputerze, może nie działać dla innych (różne przeglądarki i systemy operacyjne, wtyczki, które wpływają na zachowanie strony, różne inne rzeczy wyłączone itp.). Chodziło o to, aby zawiodła z gracją, więc strona nadal robiła coś bliskiego temu, co było zamierzone, zamiast wyświetlać użytkownikowi bezużyteczny błąd.
BryanH,
@BryanH Wystąpił błąd przeglądarki, który nie renderuje elementu o identyfikatorze „image_1”? ;)
alex
@alex Nie. Jeśli nie ma elementu o tym identyfikatorze, kod OP nie powiedzie się z błędem. Przykład . Moją sugestią było kodowanie, aby nigdy tak się nie stało.
BryanH
0

Podane powyżej rozwiązanie dla wielu przeglądarek bez manipulacji DOM nie działa, ponieważ daje pierwszą pasującą regułę, a nie ostatnią. Obowiązuje ostatnia pasująca reguła. Oto działająca wersja:

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

Jednak to proste wyszukiwanie nie będzie działać w przypadku złożonych selektorów.

jcdufourd
źródło