Obter um valor CSS com JavaScript

200

Eu sei que posso definir um valor CSS através do JavaScript, como:

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

Mas posso obter um valor de estilo específico atual? Eu li onde posso obter o estilo inteiro para o elemento, mas não quero analisar a cadeia inteira, se não precisar.

Michael Paul
fonte
Qual 'valor de estilo específico' você está tentando obter?
precisa
Os valores actuais de posicionamento: altura, largura, parte superior, a margem, etc
Michael Paul
2
Sua pergunta leva a acreditar que você quer algo como var top = document.getElementById('image_1').style.top; pode querer reformular-lo se isso não é o que você quer
Marc
Thx Todos, ambos os métodos funcionam perfeitamente, exatamente o que eu precisava. O método Jquery é um pouco mais compacto, então provavelmente vou usá-lo.
Michael Paul

Respostas:

359

Você pode usar getComputedStyle().

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

jsFiddle .

alex
fonte
10
Se você quiser cor de uma div por exemplo, mudança de fundo, ter cuidado para não usar "backgroundColor" em vez de "backgroung-color";)
baptx
4
Slw é um acrônimo ou você quis dizer lento?
David Winiecki
3
O getComputedStyle não é suportado no IE 8 e abaixo.
David Winiecki
6
Um pouco fora do tópico: algumas propriedades (todas?) Abreviadas de css não estão acessíveis em JavaScript. Por exemplo, você pode obter preenchimento à esquerda, mas não preenchimento. JSFiddle
David Winiecki
4
@DavidWiniecki Eu realmente não acredito que os webdevs ainda devam considerar o IE8 um navegador convencional. considerando que não é mais suportada pela Microsoft
Kevin Kuyl
23

A propriedade element.style permite que você saiba apenas as propriedades CSS definidas como embutidas nesse elemento (programaticamente ou definidas no atributo style do elemento); você deve obter o estilo calculado.

Não é tão fácil fazer isso de uma maneira cruzada do navegador, o IE tem seu próprio caminho, através da propriedade element.currentStyle, e a maneira padrão do DOM Nível 2, implementada por outros navegadores, é através do método document.defaultView.getComputedStyle.

As duas maneiras têm diferenças, por exemplo, a propriedade IE element.currentStyle espera que você acesse os nomes das propriedades CSS compostas por duas ou mais palavras em camelCase (por exemplo, maxHeight, fontSize, backgroundColor etc.), a maneira padrão espera as propriedades com o palavras separadas por traços (por exemplo, altura máxima, tamanho da fonte, cor do plano de fundo, etc.). ......

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

Referência principal stackoverflow

Amir Movahedi
fonte
21

Use o seguinte. Isso me ajudou.

document.getElementById('image_1').offsetTop

Veja também Obter estilos .

user843938
fonte
16

Solução entre navegadores para verificar valores CSS sem manipulação de 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')

Versão higienizada (força a entrada do seletor em minúsculas e permite o caso de uso sem levar ".")

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
fonte
Eu estava tendo um longo dia e isso não estava funcionando por vários motivos. pastie.org/9754599 funciona muito melhor jogando listas de regras inválidas e minúsculas nos dois lados do final ===. Muito obrigado, sua solução ainda salvou o dia!
Richard Fox
boa resposta, adicionou uma versão higienizada no final para corrigir alguns problemas de uso de casos extremos.
não sincronizado
7

Se você o definir programaticamente, poderá chamá-lo como uma variável (ou seja document.getElementById('image_1').style.top). Caso contrário, você sempre poderá usar o 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
fonte
7
Não acho que seu exemplo de jQuery seja muito claro (ou correto).
alex
A propriedade style retorna todo o estilo inline aplicado ao elemento, não definido pelas regras css.
Steven Koch
2

Se você gosta de bibliotecas, por que não MyLibrary e getStyle .

O método jQuery css está com o nome errado, CSS é apenas uma maneira de definir estilos e não representa necessariamente os valores reais das propriedades de estilo de um elemento.

RobG
fonte
2

Em 2020

verifique antes de usar

Você pode usar computedStyleMap ()

A resposta é válida, mas às vezes você precisa verificar qual unidade ela retorna, pode obtê-la sem nenhuma slice()ou substring()string.

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
fonte
1

Por uma questão de segurança, convém verificar se o elemento existe antes de tentar lê-lo. Se não existir, seu código emitirá uma exceção, que interromperá a execução no restante do JavaScript e potencialmente exibirá uma mensagem de erro para o usuário - nada bom. Você deseja poder falhar normalmente.

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
fonte
5
Essa é uma péssima idéia, a menos que você realmente espere que o nó possa não estar no DOM. Verificações nulas cegas quando um nulo não é esperado podem dar a aparência de nenhum erro, mas é mais provável que oculte um erro. Se você espera que o nó esteja lá, não codifique para ele, não deixe que ocorra um erro para que você possa corrigir seu código. Essa resposta não tem nada a ver com a pergunta em si e, como é mais uma sugestão (ruim), deve ser um comentário.
Juan Mendes
2
Obrigado por seu comentário. Faço isso porque tenho tendência a me desenvolver defensivamente. Aqui está a pergunta: como você veria o erro na máquina do usuário? Lembre-se de que o que funciona para você em sua máquina pode não funcionar para outras pessoas (navegadores e SOs diferentes, plug-ins que afetam o comportamento da página, várias outras coisas desativadas etc.). O objetivo era fazer com que falhasse normalmente, para que a página ainda fizesse algo parecido com o pretendido, em vez de exibir um erro inútil para o usuário.
precisa saber é o seguinte
@BryanH Há um bug no navegador em que ele não renderiza um elemento com um ID de "imagem_1"? ;) #
288 alex
@alex No. Se não houver nenhum elemento com esse ID, o código do OP falhará com um erro. Exemplo . Minha sugestão foi codificar para que isso nunca possa acontecer.
BryanH
0

A solução de navegador cruzado sem a manipulação de DOM fornecida acima não funciona porque fornece a primeira regra de correspondência, não a última. A última regra correspondente é a que se aplica. Aqui está uma versão de trabalho:

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

No entanto, essa pesquisa simples não funcionará no caso de seletores complexos.

jcdufourd
fonte