2008-12-08 7 views
158

Comme dans le sujet, comment peut-on obtenir la largeur totale d'un élément, y compris sa bordure et son remplissage, en utilisant jQuery? J'ai le plugin jQuery dimensions, et en cours d'exécution .width() sur mon 760px-wide, 10px rembourrage DIV renvoie 760.Largeur totale de l'élément (y compris le remplissage et la bordure) dans jQuery

Peut-être que je fais quelque chose de mal, mais si mon élément se manifeste comme 780 pixels de large et Firebug me dit qu'il y a 10px padding dessus, mais appeler .width() donne seulement 760, je serais dur de voir comment.

Merci pour vos suggestions.

Répondre

215

[Mise à jour]

La réponse originale a été écrite avant jQuery 1.3, et les fonctions qui existaient à l'époque où ne suffisent pas par eux-mêmes pour calculer la largeur.

Maintenant, comme J-P indique correctement, jQuery a les fonctions outerWidth et outerHeight qui comprennent le border et padding par défaut, et aussi le margin si le premier argument de la fonction est true


[Original réponse]

La méthode width ne nécessite plus le plugin dimensions, b omme il a été ajouté à la jQuery Core

Ce que vous devez faire est d'obtenir le rembourrage, la marge et les valeurs de largeur frontière de ce div particulier et les ajouter au résultat de la méthode width

Quelque chose comme ceci:

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 

divisé en plusieurs lignes pour le rendre plus lisible

de cette façon, vous obtiendrez toujours la valeur calculée correcte, même si vous ch ange Les valeurs de remplissage ou de marge de la css

+3

En général, je préfère croire que jQuery faire le calcul de moi-même. Le problème est que la fonction width() ne précise pas ce qu'elle fait dans le cas de "box-sizing: border-box". Je l'ai juste testé, et il renvoie la largeur intérieure, à l'exclusion du rembourrage, etc. Cela peut être ou ne pas être correct; différentes personnes peuvent s'attendre à des choses différentes. Donc l'exemple de code ci-dessus fonctionne réellement, mais ce n'est peut-être pas le moyen le plus fiable. Comme indiqué dans d'autres réponses, je recommande d'utiliser la fonction outerWidth() à la place. Il promet au moins ce qu'il est censé faire dans la documentation. –

+4

La fonction outerWidth/outerHeight n'existait pas quand je l'ai écrit cette réponse. –

+30

+1 outerWidth était ce que je cherchais. – bendewey

178

Toute personne trébuchant autre sur cette réponse devrait noter que jQuery maintenant (> = 1.3) a outerHeight/outerWidth fonctions pour récupérer la largeur, y compris remplissage/bordures, par exemple

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

Pour inclure la marge ainsi, il suffit de passer true:

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

Je n'ai pas la capacité d'édition, mais Je changerais le premier commentaire à: // Retourne la largeur + padding + bordures Et changer le deuxième commentaire à // Retourne la largeur + padding + bordures + marges – CtrlDot

+0

vient de modifier, merci Nick! – James

+0

Il fonctionne comme grâce charme tant – Thiyagesh

2

ressemble outerWidth est cassé dans la dernière version de jquery.

L'écart se produit lorsque

la div extérieure est flottante, la div intérieure a l'ensemble de la largeur (plus petite que la div externe) la div intérieure a style = "margin: auto"

0

même les navigateurs peuvent retourner des chaînes pour la largeur de la frontière, dans cette parseInt retourne NaN alors assurez-vous d'analyser la valeur int correctement.

 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")); 
2

Juste pour la simplicité j'ai encapsulé la grande réponse d'Andreas Grech ci-dessus dans certaines fonctions. Pour ceux qui veulent un peu de couper-coller.

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
$(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> 
+0

Merci d'avoir posté votre réponse! Veuillez vous assurer de lire attentivement la [FAQ sur l'autopromotion] (http://stackoverflow.com/faq#promotion). Notez également qu'il est * obligatoire * que vous publiez une clause de non-responsabilité chaque fois que vous créez un lien vers votre propre site/produit. –

Questions connexes