Largura total do elemento (incluindo preenchimento e borda) no jQuery


164

Como no assunto, como obter a largura total de um elemento, incluindo sua borda e preenchimento, usando jQuery? Eu tenho o plugin de dimensões do jQuery, e rodando .width()no meu 760px-wide, 10px paddingretorna DIV 760.

Talvez eu esteja fazendo algo errado, mas se meu elemento se manifestar como 780 pixels widee o Firebug me disser que existe 10px padding, mas ligar .width()apenas dá 760, seria difícil ver como.

Obrigado por todas as sugestões.

Respostas:


216

[Atualizar]

A resposta original foi escrita antes do jQuery 1.3 e as funções que existiam no momento não eram adequadas por si mesmas para calcular toda a largura.

Agora, como o JP afirma corretamente, o jQuery possui as funções outerWidth e outerHeight, que incluem o bordere paddingpor padrão, e também o marginif, o primeiro argumento da função étrue


[Resposta original]

O widthmétodo não requer mais o dimensionsplug - in, porque ele foi adicionado aojQuery Core

O que você precisa fazer é obter os valores de preenchimento, margem e largura da borda dessa div específica e adicioná-los ao resultado do widthmétodo

Algo assim:

var theDiv = $("#theDiv");
var totalWidth = theDiv.width();
totalWidth += parseInt(theDiv.css("padding-left"), 10) + parseInt(theDiv.css("padding-right"), 10); //Total Padding Width
totalWidth += parseInt(theDiv.css("margin-left"), 10) + parseInt(theDiv.css("margin-right"), 10); //Total Margin Width
totalWidth += parseInt(theDiv.css("borderLeftWidth"), 10) + parseInt(theDiv.css("borderRightWidth"), 10); //Total Border Width

Divida em várias linhas para torná-lo mais legível

Dessa forma, você sempre obterá o valor calculado correto, mesmo se alterar os valores de preenchimento ou margem do css


3
Em geral, prefiro acreditar no jQuery do que fazer o cálculo por conta própria. O problema é que a função width () na verdade não especifica o que faz no caso de "dimensionamento de caixa: caixa de borda". Acabei de testá-lo e ele retorna a largura interna, excluindo o preenchimento etc. Isso pode ou não estar correto; pessoas diferentes podem esperar coisas diferentes. Portanto, o exemplo de código acima realmente funciona, mas pode não ser o caminho mais confiável. Conforme indicado em algumas outras respostas, eu recomendaria o uso da função outerWidth (). Pelo menos promete o que é suposto na documentação.
Jan Zich

4
A função outerWidth / outerHeight não existia quando escrevi esta resposta.
Andreas Grech

Apenas um comentário rápido sobre o meu código antigo, se alguém ainda o estiver usando; os parseInts podem ser alterados para o +operador para tornar o código mais sucinto. Assim, parseInt(theDiv.css("padding-left"), 10)poderia ser transformado para +theDiv.css("padding-left")etc ...
Andreas Grech

182

Qualquer pessoa que tropeçar nessa resposta deve observar que o jQuery agora (> = 1.3) tem outerHeight/ outerWidthfunções para recuperar a largura, incluindo preenchimento / bordas, por exemplo

$(elem).outerWidth(); // Returns the width + padding + borders

Para incluir a margem também, basta passar true:

$(elem).outerWidth( true ); // Returns the width + padding + borders + margins

3
Eu não tenho a capacidade de editar, mas eu mudaria o primeiro comentário para: // retorna a largura + estofamento + fronteiras e mudar o segundo comentário para // retorna a largura + estofamento + fronteiras + margens
CtrlDot

2

parece que outerWidth está quebrado na versão mais recente do jquery.

A discrepância acontece quando

a div externa é flutuada, a div interna tem a largura definida (menor que a div externa) a div interna possui style = "margin: auto"


2

Por simplicidade, encapsulei a grande resposta de Andreas Grech acima em algumas funções. Para aqueles que querem um pouco de felicidade, recorte e cole.

function getTotalWidthOfObject(object) {

    if(object == null || object.length == 0) {
        return 0;
    }

    var value       = object.width();
    value           += parseInt(object.css("padding-left"), 10) + parseInt(object.css("padding-right"), 10); //Total Padding Width
    value           += parseInt(object.css("margin-left"), 10) + parseInt(object.css("margin-right"), 10); //Total Margin Width
    value           += parseInt(object.css("borderLeftWidth"), 10) + parseInt(object.css("borderRightWidth"), 10); //Total Border Width
    return value;
}

function  getTotalHeightOfObject(object) {

    if(object == null || object.length == 0) {
        return 0;
    }

    var value       = object.height();
    value           += parseInt(object.css("padding-top"), 10) + parseInt(object.css("padding-bottom"), 10); //Total Padding Width
    value           += parseInt(object.css("margin-top"), 10) + parseInt(object.css("margin-bottom"), 10); //Total Margin Width
    value           += parseInt(object.css("borderTopWidth"), 10) + parseInt(object.css("borderBottomWidth"), 10); //Total Border Width
    return value;
}

0

os mesmos navegadores podem retornar string para a largura da borda; nesse parseInt retornará NaN, portanto, certifique-se de analisar o valor para int corretamente.

        var getInt = function (string) {
            if (typeof string == "undefined" || string == "")
                return 0;
            var tempInt = parseInt(string);

            if (!(tempInt <= 0 || tempInt > 0))
                return 0;
            return tempInt;
        }

        var liWidth = $(this).width();
        liWidth += getInt($(this).css("padding-left"));
        liWidth += getInt($(this).css("padding-right"));
        liWidth += getInt($(this).css("border-left-width"));
        liWidth += getInt($(this).css("border-right-width"));

0
$(document).ready(function(){     
$("div.width").append($("div.width").width()+" px");
$("div.innerWidth").append($("div.innerWidth").innerWidth()+" px");   
$("div.outerWidth").append($("div.outerWidth").outerWidth()+" px");         
});


<div class="width">Width of this div container without including padding is: </div>  
<div class="innerWidth">width of this div container including padding is: </div> 
<div class="outerWidth">width of this div container including padding and margin is:     </div>

Obrigado por postar sua resposta! Leia atentamente as Perguntas frequentes sobre autopromoção. Observe também que é necessário que você publique um aviso sempre que vincular ao seu próprio site / produto.
Andrew Barber
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.