Valor de preenchimento ou margem em pixels como número inteiro usando jQuery

207

O jQuery possui as funções height () en width () que retornam a altura ou largura em pixels como número inteiro ...

Como posso obter um valor de preenchimento ou margem de um elemento em pixels e como inteiro usando jQuery?

Minha primeira ideia foi fazer o seguinte:

var padding = parseInt(jQuery("myId").css("padding-top"));

Mas se o preenchimento é fornecido no ems, por exemplo, como posso obter o valor em pixels?


Olhando para o plugin JSizes sugerido por Chris Pebble, percebi que minha própria versão era a correta :). O jQuery retorna sempre o valor em pixels; portanto, apenas a análise foi feita em número inteiro.

Agradecimentos a Chris Pebble e Ian Robinson

Malik Amurlayev
fonte
Você pode escolher uma resposta dentre as respostas disponíveis abaixo?
Wes Modos de
4
Uma observação para as pessoas neste segmento: sempre especifique radix ao usar parseInt. Citando MDN: " radix Um int entre 2 e 36 que representa o radical (a base nos sistemas de números matemáticos) da cadeia de caracteres acima mencionada. Especifique 10 para o sistema de números decimais. Sempre especifique este parâmetro para eliminar a confusão do leitor e garantir um comportamento previsível. Implementações diferentes produzem resultados diferentes quando um radical não é especificado, geralmente padronizando o valor para 10. " Veja: developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/…
dgellow 28/01

Respostas:

226

Você deve poder usar CSS ( http://docs.jquery.com/CSS/css#name ). Pode ser necessário ser mais específico, como "padding-left" ou "margin-top".

Exemplo:

CSS

a, a:link, a:hover, a:visited, a:active {color:black;margin-top:10px;text-decoration: none;}

JS

$("a").css("margin-top");

O resultado é 10px.

Se você deseja obter o valor inteiro, pode fazer o seguinte:

parseInt($("a").css("margin-top"))
Ian Robinson
fonte
5
Eu não verifiquei se o método jQuery realmente retorna o sufixo "px" ou não; no entanto, o JSizesplug-in da outra resposta (que acabei usando) retorna um número inteiro quando o valor de retorno é passado ParseInt(...), apenas FYI.
31119 Dan Herbert
12
FYI: o jQuery adiciona o 'px', portanto a solução de Ian funciona e também retornará um número inteiro quando passado para parseInt () - e não requer um plug-in:parseInt($('a').css('margin-top').replace('px', ''))
Peter Rust
56
parseInt é mais rápido que substituir ('px', '') em 49% no chrome jsperf.com/replace-vs-parseint
Bank
17
Se padding / margin for expresso como em ou pt no CSS, .css()ainda retornará o valor com "px" no final?
ingredient_15939
22
@ ingrediente_15939 - Apenas tentei e sim; calcula o valor real do pixel e o retorna com px. O mesmo para larguras de borda. Velha pergunta eu sei, mas como ninguém respondeu sua pergunta eu pensei que eu iria fazê-lo para ajudar outras retardatários ...
Whelkaholism
79

Compare a altura / largura externa e interna para obter a margem total e o preenchimento:

var that = $("#myId");
alert(that.outerHeight(true) - that.innerHeight());
svinto
fonte
ótima dica! Ajudou-me para fora
Abe Petrillo
1
Eu não percebi que outerHeight existia. Muito obrigado!
AlexMorley-Finch
6
Lembre-se que outerWidth / Altura inclui larguras de fronteira muito embora
electrichead
7
innertWidth / innerHeight também inclui preenchimento em seus cálculos. Para obter a largura / altura sem preenchimento, é necessário usar .width () e .height (). api.jquery.com/innerWidth api.jquery.com/width api.jquery.com/outerWidth
Andrew Ensley
2
that.outerHeight(true) - that.outerHeight()daria as margens verticais totais, porque outerHeight () incluiria preenchimentos e bordas, mas excluiria margens. Consulte api.jquery.com/outerWidth/ .
Aximili
35

A função parseInt possui um parâmetro "radix" que define o sistema numérico usado na conversão, portanto, a chamada parseInt(jQuery('#something').css('margin-left'), 10);retorna a margem esquerda como um número inteiro.

É isso que o JSizes usa.

guigouz
fonte
3
Obrigado por isso, eu odeio ter que incluir plugins para pequenas peças de funcionalidade.
Brian #
2
Você não precisa mesmo de passar a "raiz", uma vez que o padrão é 10.
Alexander Ave
5
Esteja ciente de que parseInt pode retornar NaN (que, por sua vez, faz os cálculos com base nessa variável falharem) - adicione uma verificação isNaN posteriormente! Caso de exemplo: parseInt('auto', 10);( autoé válido margin-left).
Thomas
@sethAlexanderBird você está certo ao afirmar que o radix será o padrão para 10, no entanto, se o linting de código for importante para você (e provavelmente deveria ser), o jsLint e o jsHint irão gritar com você se você o deixar de fora.
Greg
30

POR FAVOR, não carregue outra biblioteca apenas para fazer algo que já esteja disponível de forma nativa!

O jQuery's .css()converte% 'e em's em seu equivalente de pixel para começar e parseInt()removerá 'px'o final da string retornada e o converterá em um número inteiro:

http://jsfiddle.net/BXnXJ/

$(document).ready(function () {
    var $h1 = $('h1');
    console.log($h1);
    $h1.after($('<div>Padding-top: ' + parseInt($h1.css('padding-top')) + '</div>'));
    $h1.after($('<div>Margin-top: ' + parseInt($h1.css('margin-top')) + '</div>'));
});
RavenHursT
fonte
11

Veja como você pode obter as dimensões circundantes:

var elem = $('#myId');

var marginTopBottom  = elem.outerHeight(true) - elem.outerHeight();
var marginLeftRight  = elem.outerWidth(true)  - elem.outerWidth();

var borderTopBottom  = elem.outerHeight() - elem.innerHeight();
var borderLeftRight  = elem.outerWidth()  - elem.innerWidth();

var paddingTopBottom  = elem.innerHeight() - elem.height();
var paddingLeftRight  = elem.innerWidth()  - elem.width();

Preste atenção que cada variável, paddingTopBottompor exemplo, contém a soma das margens nos dois lados do elemento; ou seja, paddingTopBottom == paddingTop + paddingBottom. Gostaria de saber se existe uma maneira de obtê-los separadamente. Claro, se eles são iguais, você pode dividir por 2 :)

FireAphis
fonte
true = incluir margem. +1000 internets
glifo
Esta é a melhor solução, porque também funciona IE 7. Veja: stackoverflow.com/questions/590602/…
Leniel Maccaferri
9

Esta função simples fará isso:

$.fn.pixels = function(property) {
    return parseInt(this.css(property).slice(0,-2));
};

Uso:

var padding = $('#myId').pixels('paddingTop');
mpen
fonte
3
não leva em conta auto, inherite %valores
Thomas
3
@ Thomas: Não é verdade. jsfiddle.net/nXyFN O jQuery parece sempre retornar o resultado em pixels.
MPEN
4
@ Mark jsfiddle.net/BNQ6S IE7 :,NaN depende do navegador. Até onde eu sei, o jQuery não normaliza .css()ao contrário .width()& #.height()
Thomas
1
@ Thomas: Interessante. A solução de Ian (melhor classificada) também tem o mesmo problema. A solução da svinto é provavelmente a melhor.
MPEN
9

Parse int

parseInt(canvas.css("margin-left")); 

retorna 0 para 0 px

a53-416
fonte
9

Você pode simplesmente pegá-los como em qualquer atributo CSS :

alert($("#mybox").css("padding-right"));
alert($("#mybox").css("margin-bottom"));

Você pode configurá-los com um segundo atributo no método css:

$("#mybox").css("padding-right", "20px");

EDIT: Se você precisar apenas do valor de pixel, use parseInt(val, 10):

parseInt($("#mybox").css("padding-right", "20px"), 10);
Rob Grant
fonte
3

ok apenas para responder à pergunta original:

você pode obter o preenchimento como um número inteiro utilizável como este:

var padding = parseInt ($ ("myId"). css ("padding-top"). replace ("ems", ""));

Se você definiu outra medida como px, substitua "ems" por "px". parseInt interpreta o stringpart como um valor errado, portanto é importante substituí-lo por ... nothing.

EeKay
fonte
2

Você também pode estender a estrutura do jquery com algo como:

jQuery.fn.margin = function() {
var marginTop = this.outerHeight(true) - this.outerHeight();
var marginLeft = this.outerWidth(true) - this.outerWidth();

return {
    top: marginTop,
    left: marginLeft
}};

Adicionando uma função aos objetos jquery, denominada margin (), que retorna uma coleção como a função offset.

fx.

$("#myObject").margin().top
cralexns
fonte
2
Infelizmente, isso não fornece as margens superior e esquerda, mas as margens totalVertical e totalHorizontal
Code Commander
No entanto, poderia ser editadas usando a função parselnt em uma das outras soluções para permitir uma função de margem mais uniforme aparecendo
Brian
1

Não use string.replace ("px", ""));

Use parseInt ou parseFloat!

RubbelDeCatc
fonte
0

Não para necro, mas eu fiz isso que pode determinar pixels com base em uma variedade de valores:

$.fn.extend({
  pixels: function (property, base) {
    var value = $(this).css(property);
    var original = value;
    var outer = property.indexOf('left') != -1 || property.indexOf('right') != -1 
      ? $(this).parent().outerWidth()
      : $(this).parent().outerHeight();

    // EM Conversion Factor
    base = base || 16;

    if (value == 'auto' || value == 'inherit') 
        return outer || 0;

    value = value.replace('rem', '');
    value = value.replace('em', '');

    if (value !== original) {
       value = parseFloat(value);
       return value ? base * value : 0;
    }

    value = value.replace('pt', '');

    if (value !== original) {
       value = parseFloat(value);
       return value ? value * 1.333333 : 0; // 1pt = 1.333px
    }

    value = value.replace('%', '');

    if (value !== original) {
      value = parseFloat(value);
      return value ? (outer * value / 100) : 0;
    }

    value = value.replace('px', '');
    return parseFloat(value) || 0;
  }
});

Dessa forma, levamos em conta o dimensionamento e a herança automática.

Nijikokun
fonte
Observe que parseInt()está errado, a largura ou a altura podem ser pontos flutuantes.
Alexis Wilke