Ottieni un valore CSS con JavaScript


200

So di poter impostare un valore CSS tramite JavaScript come:

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

Ma posso ottenere un valore di stile specifico corrente? Ho letto dove posso ottenere l'intero stile per l'elemento, ma non voglio analizzare l'intera stringa se non devo.


Quale "valore di stile specifico" stai cercando di ottenere?
BryanH,

valori attuali di posizionamento: altezza, larghezza, cima, margine, ecc.
Michael Paul

2
La tua domanda sembra credere che tu voglia qualcosa come var top = document.getElementById('image_1').style.top; May potrebbe riformularla se non è quello che vuoi
Marc

Grazie a tutti, entrambi i metodi funzionano perfettamente, proprio quello di cui avevo bisogno. Il metodo Jquery è un po 'più compatto, quindi probabilmente lo userò.
Michael Paul,

Risposte:


359

È possibile utilizzare getComputedStyle().

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

jsFiddle .


10
Se ad esempio vuoi cambiare il colore di sfondo di un div, fai attenzione a NON UTILIZZARE "backgroundColor" invece di "backgroung-color";)
baptx,

4
Slw è un acronimo o intendevi lento?
David Winiecki,

3
getComputedStyle non è supportato in IE 8 e versioni successive.
David Winiecki,

6
Un po 'fuori tema: alcune proprietà css (tutte?) Abbreviate non sono accessibili in JavaScript. Ad esempio è possibile ottenere il riempimento a sinistra ma non il riempimento. JSFiddle
David Winiecki,

4
@DavidWiniecki non credo davvero che i webdev debbano ancora considerare IE8 un browser tradizionale. considerando che non è più supportato da microsoft
Kevin Kuyl il

23

La proprietà element.style ti consente di conoscere solo le proprietà CSS che sono state definite come inline in quell'elemento (programmaticamente o definite nell'attributo style dell'elemento), dovresti ottenere lo stile calcolato.

Non è così facile farlo in un browser incrociato, IE ha il suo modo, attraverso la proprietà element.currentStyle, e il modo standard DOM Level 2, implementato da altri browser è attraverso il metodo document.defaultView.getComputedStyle.

I due modi presentano differenze, ad esempio la proprietà IE element.currentStyle prevede che tu acceda ai nomi delle proprietà CSS composti da due o più parole in camelCase (ad es. MaxHeight, fontSize, backgroundColor, ecc.), Il modo standard prevede le proprietà con parole separate da trattini (ad es. altezza massima, dimensione carattere, colore di sfondo, ecc.). ......

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

Stackoverflow di riferimento principale



16

Soluzione cross-browser per il controllo dei valori CSS senza manipolazione 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];
   }
  }
 }
};

Uso:

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

Versione disinfettata (impone l'ingresso del selettore in minuscolo e consente l'uso del caso senza ".")

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

Ho avuto una lunga giornata e questo non ha funzionato per una serie di motivi. pastie.org/9754599 funziona molto meglio lanciando liste di regole non valide e mettendo in minuscolo entrambi i lati della finale ===. Mille grazie per la tua soluzione ancora salvata la giornata!
Richard Fox,

buona risposta, aggiunta una versione disinfettata alla fine per risolvere alcuni problemi di utilizzo dei casi limite.
non sincronizzato il

7

Se lo imposti a livello di codice, puoi semplicemente chiamarlo come una variabile (ad es document.getElementById('image_1').style.top.). Altrimenti, puoi sempre usare 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>

7
Non credo che il tuo esempio di jQuery sia molto chiaro (o corretto).
alex

La proprietà style restituisce tutto lo stile inline applicato all'elemento, non definito dalle regole css.
Steven Koch,

2

Se ti piacciono le librerie, perché non MyLibrary e getStyle .

Il metodo CSS jQuery è erroneamente chiamato, CSS è solo un modo di impostare gli stili e non rappresenta necessariamente i valori effettivi delle proprietà di stile di un elemento.


2

Nel 2020

controllare prima dell'uso

Puoi usare computedStyleMap ()

La risposta è valida ma a volte è necessario verificare quale unità restituisce, è possibile ottenerla senza nessuna slice()o substring()stringa.

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>


1

Per motivi di sicurezza, potresti voler verificare che l'elemento esista prima di tentare di leggerlo. Se non esiste, il tuo codice genererà un'eccezione, che interromperà l'esecuzione sul resto del tuo JavaScript e potenzialmente visualizzerà un messaggio di errore per l'utente - non va bene. Vuoi essere in grado di fallire con grazia.

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
}

5
Questa è una cattiva idea, a meno che non ti aspetti davvero che il nodo potrebbe non essere nel DOM. I controlli null ciechi quando non è previsto un null possono dare l'impressione di non avere errori, ma è più probabile che nasconda un bug. Se si prevede che il nodo sia presente, non codificare perché non è presente, lasciare che si verifichi un errore in modo da poter correggere il codice. Questa risposta non ha nulla a che fare con la domanda stessa e poiché è più di un (cattivo) suggerimento, dovrebbe essere un commento.
Juan Mendes,

2
Grazie per il tuo commento. Lo faccio perché tendo a svilupparmi in modo difensivo. Ecco la domanda: come vedresti l'errore sul computer dell'utente? Ricorda, ciò che funziona per te sul tuo computer potrebbe non funzionare per altri (browser e sistemi operativi diversi, plug-in che influiscono sul comportamento della pagina, varie altre cose disattivate, ecc.). Il punto era che falliva con grazia, quindi la pagina faceva ancora qualcosa di simile a ciò che era previsto invece di far apparire un errore inutile per l'utente.
BryanH,

@BryanH Esiste un bug del browser in cui non viene eseguito il rendering di un elemento con ID "image_1"? ;)
alex

@alex No. Se non esiste alcun elemento con quell'id, il codice dell'OP fallirà con un errore. Esempio . Il mio suggerimento era di programmare in modo che ciò non possa mai accadere.
BryanH,

0

La soluzione cross-browser senza la manipolazione DOM indicata sopra non funziona perché fornisce la prima regola corrispondente, non l'ultima. L'ultima regola corrispondente è quella applicabile. Ecco una versione funzionante:

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

Tuttavia, questa semplice ricerca non funzionerà in caso di selettori complessi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.