obter o valor percentual da regra CSS em jQuery

98

Digamos que a regra seja a seguinte:

.largeField {
    width: 65%;
}

Existe uma maneira de obter '65% 'de volta de alguma forma, e não o valor do pixel?

Obrigado.

EDIT: Infelizmente, o uso de métodos DOM não é confiável no meu caso, pois tenho uma folha de estilo que importa outras folhas de estilo e, como resultado, o parâmetro cssRules acaba com um valor nulo ou indefinido .

Essa abordagem, no entanto, funcionaria na maioria dos casos simples (uma folha de estilo, várias declarações de folha de estilo separadas dentro da tag head do documento).

montrealista
fonte
1
Seria melhor propagar esses dados no próprio elemento e, em seguida, rastrear como eles mudam no futuro.
Travis J

Respostas:

51

Receio que não haja uma maneira embutida. Você pode fazer algo assim:

var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';
Adam Lassek
fonte
19
só para ficar claro, isso não mostra o valor do seu estilo, mas sim um valor calculado
Anthony Johnston
2
@shevski funciona bem, você tem que adicionar class="largeField"ao intervalo, atualmente você está selecionando um conjunto vazio.
Adam Lassek
Eu sei o que não está funcionando e é por isso que é um contra-exemplo.
Shevski
2
@shevski, meu exemplo fornece um valor calculado de um elemento existente na página, como Anthony já havia apontado há um ano. Seus comentários são supérfluos.
Adam Lassek
@AdamLassek, Anthony não disse que mais existe.
shevski
116

Maneira mais facil

$('.largeField')[0].style.width

// >>> "65%"
redexp
fonte
50
Apenas uma observação: isso só funcionará com css aplicado diretamente no elemento (por exemplo style="width:65%").
brianreavis
3
Ótimo!! Para retornar apenas os números: parseInt ($ ('. LargeField') [0] .style.width, 10);
Tiago
4
Tiago, você pode simplesmente usar parseFloat ().
Gavin
Isso funciona apenas em estilo embutido, como disse @brianreavis.
Akansh
84

Isso é definitivamente possível!

Você deve primeiro ocultar () o elemento pai. Isso impedirá que o JavaScript calcule pixels para o elemento filho.

$('.parent').hide();
var width = $('.child').width();
$('.parent').show();
alert(width);

Veja meu exemplo .

Agora ... Eu me pergunto se sou o primeiro a descobrir esse hack :)

Atualizar:

One-liner

element.clone().appendTo('body').wrap('<div style="display: none"></div>').css('width');

Ele deixará um elemento oculto antes da </body>tag, o que você pode desejar .remove().

Veja um exemplo de one-liner .

Estou aberto a ideias melhores!

timofey.com
fonte
1
Esta deve ser a solução aceita. Também posso confirmar que funciona para mim quando as outras respostas não obtêm o valor percentual originalmente atribuído.
EricP
1
Para evitar cintilação, clone o filho, oculte o pai e recupere a largura. var clone = $ ('. filho'). clone ();
user1491819
3
Atualizar: função getCssWidth (childSelector) {return jQuery (childSelector) .parent (). Clone (). Hide (). Find (childSelector) .width (); } console.log ('largura do filho:' + getCssWidth ('. filho')) ;;
user1491819
1
Solução incrível! Aqui está um equivalente pure-js do script jsfiddle.net/Sjeiti/2qkftdjd
Sjeiti 01 de
1
Se a resposta $ (...) [0] .style.width funcionar, então não deveria ser essa a solução aceita? Esta solução, embora elegante, apresenta algumas deficiências de desempenho.
Mihai Danila
44

Você pode acessar o document.styleSheetsobjeto:

<style type="text/css">
    .largeField {
        width: 65%;
    }
</style>
<script type="text/javascript">
    var rules = document.styleSheets[0].rules || document.styleSheets[0].cssRules;
    for (var i=0; i < rules.length; i++) {
        var rule = rules[i];
        if (rule.selectorText.toLowerCase() == ".largefield") {
            alert(rule.style.getPropertyValue("width"));
        }
    }
</script>
quiabo
fonte
8
+1 uso adequado de métodos DOM (às vezes jQuery não é a resposta)
bobince
1
1 Estou com você aqui para precisão. Estou curioso para saber como cada navegador oferece suporte a isso, mas esta é a resposta certa.
cgp
Funciona bem em casos mais simples, FF e IE7, mas não para mim (veja EDIT acima).
montrealist
1
Você também tentou percorrer todas as folhas de estilo? Meu exemplo usou apenas o primeiro ( styleSheets[0]).
Gumbo de
Desculpe se esta é uma pergunta noob, mas como for (var i=0; rules.length; i++)funcionaria? Não deveria serfor (var i=0; i<rules.length; i++)
sbichenko
18

Atrasado, mas para usuários mais novos, tente fazer isso se o estilo css contiver uma porcentagem :

$element.prop('style')['width'];
ddanone
fonte
Funcionou como um encanto para o tamanho da fonte css. $ element.prop ('style') ['font-size];
Jason
10

Um plugin jQuery baseado na resposta de Adams:

(function ($) {

    $.fn.getWidthInPercent = function () {
        var width = parseFloat($(this).css('width'))/parseFloat($(this).parent().css('width'));
        return Math.round(100*width)+'%';
    };

})(jQuery);

$('body').html($('.largeField').getWidthInPercent());​​​​​

Retornará '65% '. Só retorna números arredondados para funcionar melhor se você gostar do if (largura == '65%'). Se você tivesse usado a resposta de Adams diretamente, isso não funcionou (eu tenho algo como 64.93288590604027). :)

Leonard Pauli
fonte
3

Com base na solução excelente e surpreendente da timofey, aqui está uma implementação Javascript pura:

function cssDimensions(element)
  var cn = element.cloneNode();
  var div = document.createElement('div');
  div.appendChild(cn);
  div.style.display = 'none';
  document.body.appendChild(div);
  var cs = window.getComputedStyle
    ? getComputedStyle(cn, null)
    : cn.currentStyle;
  var ret = { width: cs.width, height: cs.height };
  document.body.removeChild(div);
  return ret;
}

Espero que seja útil para alguém.

Gregory Magarshak
fonte
um erro de sintaxe, você esqueceu {no final da primeira linha.
Akansh
apenas esta solução mostra corretamente 'auto' quando a largura para div não está definida, jquery css ('largura') retorna '0px'. todas as outras respostas incorretas ...
Alexey Obukhov
1

Eu tenho um problema semelhante em Obter valores de folha de estilo global em jQuery , eventualmente eu vim com a mesma solução acima .

Só queria cruzar as duas perguntas para que outras pessoas possam se beneficiar de descobertas posteriores.

Horst Walter
fonte
2
Sua pergunta e esta já estão vinculadas (veja a barra lateral “Vinculado” à direita) em virtude do comentário de shesek sobre sua pergunta.
Chris Johnsen de
0

Você pode colocar estilos que precisa acessar com jQuery em:

  1. o cabeçalho do documento diretamente
  2. em um include, qual script do lado do servidor então coloca na cabeça

Então, deve ser possível (embora não necessariamente fácil) escrever uma função js para analisar tudo dentro das tags de estilo no cabeçalho do documento e retornar o valor de que você precisa.

onde
fonte
0

Você pode usar a função css (largura) para retornar a largura atual do elemento.

ie.

var myWidth = $("#myElement").css("width");

Veja também: http://api.jquery.com/width/ http://api.jquery.com/css/

user267867
fonte
por que isso está marcado? há um bug aberto neste bugs.jquery.com/ticket/4772 , parece que há alguma inconsistência em chamar isso dependendo se você colocou seu estilo embutido ou em uma folha de estilo jsfiddle.net/boushley/MSyqR/2
Anthony Johnston
1
eu não consigo obter% com isso
alguém sem uso
0

Não há nada em jQuery e nada simples mesmo em javascript. Pegando a resposta de timofey e executando com ela, criei esta função que funciona para obter todas as propriedades que você deseja:

// gets the style property as rendered via any means (style sheets, inline, etc) but does *not* compute values
// domNode - the node to get properties for 
// properties - Can be a single property to fetch or an array of properties to fetch
function getFinalStyle(domNode, properties) {
    if(!(properties instanceof Array)) properties = [properties]

    var parent = domNode.parentNode
    if(parent) {
        var originalDisplay = parent.style.display
        parent.style.display = 'none'
    }
    var computedStyles = getComputedStyle(domNode)

    var result = {}
    properties.forEach(function(prop) {
        result[prop] = computedStyles[prop]
    })

    if(parent) {
        parent.style.display = originalDisplay
    }

    return result
}
BT
fonte
0

Converter de pixels em porcentagem usando multiplicação cruzada .

Configuração da fórmula:

1.) (element_width_pixels / parent_width_pixels) = (element_width_percentage / 100)

2.) element_width_percentage = (100 * element_width_pixels) / parent_width_pixels

O código real:

<script>

   var $width_percentage = (100 * $("#child").width()) / $("#parent").width();

</script>
Zachary Horton
fonte