Remplissage ou valeur de marge en pixels sous forme d'entier à l'aide de jQuery


207

jQuery a des fonctions height () et width () qui retournent la hauteur ou la largeur en pixels sous forme d'entier ...

Comment puis-je obtenir un remplissage ou une valeur de marge d'un élément en pixels et sous forme d'entier en utilisant jQuery?

Ma première idée a été de faire ce qui suit:

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

Mais si le remplissage est donné en ems par exemple, comment puis-je obtenir la valeur en pixels?


En examinant le plugin JSizes suggéré par Chris Pebble, j'ai réalisé que ma propre version était la bonne :). jQuery retourne toujours la valeur en pixels, donc la simple analyse en entier était la solution.

Merci à Chris Pebble et Ian Robinson


Pouvez-vous choisir une réponse parmi les réponses disponibles ci-dessous?
Wes Modes

4
Une note aux gens dans ce fil: spécifiez toujours radix lorsque vous utilisez parseInt. Citant MDN: " radix Un entier compris entre 2 et 36 qui représente le radix (la base dans les systèmes numériques mathématiques) de la chaîne mentionnée ci-dessus. Spécifiez 10 pour le système numérique décimal. Spécifiez toujours ce paramètre pour éliminer la confusion du lecteur et garantir un comportement prévisible . Des implémentations différentes produisent des résultats différents lorsqu'une base n'est pas spécifiée, la valeur par défaut étant généralement 10. » Voir: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
dgellow

Réponses:


226

Vous devriez pouvoir utiliser CSS ( http://docs.jquery.com/CSS/css#name ). Vous devrez peut-être être plus précis, comme "padding-left" ou "margin-top".

Exemple:

CSS

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

JS

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

Le résultat est 10px.

Si vous souhaitez obtenir la valeur entière, vous pouvez effectuer les opérations suivantes:

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

5
Je n'ai pas vérifié si la méthode jQuery retourne réellement le suffixe "px" ou non, cependant le JSizesplugin de l'autre réponse (que j'ai fini par utiliser) retourne un entier lorsque la valeur de retour est passée ParseInt(...), juste FYI.
Dan Herbert

12
Pour info: jQuery ajoute le 'px', donc la solution d'Ian fonctionne et retournera également un entier lorsqu'elle sera passée dans parseInt () - et elle ne nécessite pas de plugin:parseInt($('a').css('margin-top').replace('px', ''))
Peter Rust

56
parseInt est plus rapide que replace ('px', '') de 49% sur chrome jsperf.com/replace-vs-parseint
Bank

17
Si le remplissage / marge est exprimé en em ou pt dans le CSS, .css()retournera- t-il toujours la valeur avec "px" à la fin?
ingrédient_15939

22
@ ingrédient_15939 - Je viens de l'essayer et oui; il calcule la valeur réelle des pixels et la renvoie avec px. Idem pour les largeurs de bordure. Vieille question, je sais, mais comme personne n'a répondu à votre question, j'ai pensé que je le ferais pour aider les autres retardataires ...
Whelkaholism

79

Comparez les hauteurs / largeurs extérieures et intérieures pour obtenir la marge totale et le rembourrage:

var that = $("#myId");
alert(that.outerHeight(true) - that.innerHeight());

bon conseil! M'a aidé
Abe Petrillo

1
Je ne savais pas que la hauteur extérieure existait. Merci beaucoup!
AlexMorley-Finch

6
N'oubliez pas que la largeur / hauteur externe inclut également les largeurs de bordure
electrichead

7
innertWidth / innerHeight inclut également le rembourrage dans leurs calculs, pour obtenir la largeur / hauteur sans rembourrage, vous devez utiliser .width () et .height (). api.jquery.com/innerWidth api.jquery.com/width api.jquery.com/outerWidth
Andrew Ensley

2
that.outerHeight(true) - that.outerHeight()donnerait les marges verticales totales, car externeHeight () inclurait les rembourrages et les bordures mais exclurait les marges. Voir api.jquery.com/outerWidth/ .
Aximili

35

La fonction parseInt a un paramètre "radix" qui définit le système numérique utilisé lors de la conversion, donc appeler parseInt(jQuery('#something').css('margin-left'), 10);renvoie la marge gauche sous forme d'entier.

C'est ce que JSizes utilise.


3
Merci pour cela, je déteste devoir inclure des plugins pour de minuscules fonctionnalités.
Brian

2
Vous n'avez même pas besoin de passer le "radix" car il est par défaut à 10.
Alexander Bird

5
Sachez que parseInt peut retourner NaN (qui à son tour fait échouer les calculs basés sur cette variable) - ajoutez ensuite un contrôle isNaN! Exemple de cas: parseInt('auto', 10);( autoest valide margin-left).
Thomas

@sethAlexanderBird vous avez raison en déclarant que le radix sera par défaut à 10, cependant si le linting de code est important pour vous (et il devrait probablement l'être) jsLint et jsHint vous hurleront dessus si vous l'omettez.
Greg

30

VEUILLEZ ne pas aller charger une autre bibliothèque juste pour faire quelque chose qui est déjà nativement disponible!

jQuery .css()convertit les% et les em en leur équivalent pixel pour commencer, et parseInt()supprimera le 'px'de la fin de la chaîne retournée et le convertira en un entier:

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

11

Voici comment obtenir les dimensions environnantes:

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();

Faites attention à ce que chaque variable, paddingTopBottompar exemple, contienne la somme des marges des deux côtés de l'élément; à savoir paddingTopBottom == paddingTop + paddingBottom. Je me demande s'il existe un moyen de les obtenir séparément. Bien sûr, s'ils sont égaux, vous pouvez diviser par 2 :)


true = inclure la marge. +1000 internets
glyphe

C'est la meilleure solution car elle fonctionne également IE 7. Voir: stackoverflow.com/questions/590602/…
Leniel Maccaferri

9

Cette fonction simple le fera:

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

Usage:

var padding = $('#myId').pixels('paddingTop');

3
ne tient pas compte auto, inheritet les %valeurs
Thomas

3
@Thomas: Pas vrai. jsfiddle.net/nXyFN jQuery semble toujours renvoyer le résultat en pixels.
mpen

4
@Mark jsfiddle.net/BNQ6S IE7: NaNcela dépend du navigateur. Pour autant que je sache, jQuery ne se normalise pas .css()contrairement à .width()&.height()
Thomas

1
@Thomas: Intéressant. La solution d'Ian (la mieux notée) a également le même problème. La solution de svinto est probablement la meilleure.
mpen

9

Parse int

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

renvoie 0 pour 0px


9

Vous pouvez simplement les récupérer comme avec n'importe quel attribut CSS :

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

Vous pouvez les définir avec un deuxième attribut dans la méthode css:

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

EDIT: Si vous avez besoin uniquement de la valeur en pixels, utilisez parseInt(val, 10):

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

3

ok juste pour répondre à la question d'origine:

vous pouvez obtenir le remplissage comme un entier utilisable comme ceci:

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

Si vous avez défini une autre mesure comme px, remplacez simplement "ems" par "px". parseInt interprète la chaîne de caractères comme une valeur erronée, il est donc important de la remplacer par ... rien.


2

Vous pouvez également étendre vous-même le framework jquery avec quelque chose comme:

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

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

Ajoutant ainsi une fonction sur vos objets jquery appelée margin (), qui retourne une collection comme la fonction offset.

fx.

$("#myObject").margin().top

2
Malheureusement, cela ne vous donne pas les marges supérieure et gauche, mais plutôt les marges totaleVerticale et totaleHorizontal
Code Commander

Cependant, il pourrait être modifié à l'aide de la fonction parseInt dans l'une des autres solutions pour permettre une fonction de marge apparente plus transparente
Brian

1

N'utilisez pas string.replace ("px", ""));

Utilisez parseInt ou parseFloat!




0

Pas pour necro mais j'ai fait cela qui peut déterminer les pixels en fonction d'une variété de valeurs:

$.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;
  }
});

De cette façon, nous prenons en compte le dimensionnement et l'auto / héritage.


Notez que parseInt()c'est faux, la largeur ou la hauteur peuvent être des points flottants.
Alexis Wilke
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.