Comment obtenir juste une partie numérique de la propriété CSS avec jQuery?

158

J'ai besoin de faire un calcul numérique basé sur les propriétés CSS. Cependant, lorsque j'utilise ceci pour obtenir des informations:

$(this).css('marginBottom')

il renvoie la valeur «10px». Y a-t-il une astuce pour obtenir simplement la partie numérique de la valeur, que ce pxsoit %ou emou quoi que ce soit?

Tim Sheiner
la source

Réponses:

163

Cela nettoiera tous les non-chiffres, non-points et non-signe-signe de la chaîne:

$(this).css('marginBottom').replace(/[^-\d\.]/g, '');

MISE À JOUR pour les valeurs négatives

zakovyrya
la source
4
C'est génial à condition que vous n'ayez pas affaire à des nombres négatifs. Je ne suis pas un gourou des regex, donc je ne peux pas fournir un meilleur échantillon :)
Gary
39
Envisagez d'utiliser parseFloat qui gère tous les caractères autorisés dans les nombres à virgule flottante et renvoie également un nombre au lieu d'une chaîne - voir la réponse de maximelebreton .
Oliver
6
Cela ne devrait pas être la réponse acceptée car elle ne répond pas correctement à la question. Les solutions parseFloat / parseInt sont meilleures. La question se pose en ce qui concerne les calculs numériques . Cette réponse renvoie une chaîne. Cela signifie que "20" + 20 = "2020", ce qui n'est pas bon pour quiconque est impliqué.
mastaBlasta
@zakovyrya pourriez-vous expliquer le RegExp utilisé/[^-\d\.]/g
Alexander
1
@Alexander Les crochets avec un signe d'insertion signifient PAS: [^ <tout ce que vous mettez ici>]. Dans cette expression régulière, il correspond à n'importe quel symbole qui n'est PAS un signe moins, un chiffre ou un point. Supprime essentiellement tout ce qui ne peut pas faire partie du nombre
zakovyrya
284
parseInt($(this).css('marginBottom'), 10);

parseInt ignorera automatiquement les unités.

Par exemple:

var marginBottom = "10px";
marginBottom = parseInt(marginBottom, 10);
alert(marginBottom); // alerts: 10
Bob
la source
1
Cela semble très bien fonctionner dans tous les cas sur lesquels je suis tombé par hasard, et je le trouve beaucoup plus lisible que n'importe quelle solution d'expression régulière.
Markus Amalthea Magnuson
3
vous voudrez peut-être ajouter le radix (10) à parseInt si vous utilisez cette solution.
asawilliams
47
Vous voudrez peut-être utiliser parseFloat au lieu de parseIntpour tenir compte du cas où vous recevez une valeur non entière - comme dans la réponse de maximelebreton .
Oliver
3
En fait, parseInt n'a pas besoin du paramètre de base ", 10", puisque 10 est la valeur par défaut. Moins de paramètres = meilleure lisibilité, code plus court, moins de bogues.
Pointer Null
2
10 n'est la valeur par défaut pour parseInt que si le nombre ne peut pas être interprété comme un octal (par exemple, «0700» serait analysé comme 448 au lieu de 700, ce qui est probablement ce qui est souhaité).
Robert C. Barth
122

Avec la méthode replace, votre valeur css est une chaîne et non un nombre.

Cette méthode est plus propre, simple et renvoie un nombre:

parseFloat($(this).css('marginBottom'));
maximelebreton
la source
2
C'est la meilleure solution, car OP demande d'éventuelles unités non entières ( %, em)
Andre Figueiredo
14
parseFloat($(this).css('marginBottom'))

Même si marginBottom est défini dans em, la valeur à l'intérieur de parseFloat ci-dessus sera en px, car il s'agit d'une propriété CSS calculée.

Alex Pavlov
la source
3
parseFloat n'a qu'un seul argument - la base (10) que vous avez fournie ici sera ignorée. La réponse la plus correcte serait donc celle de maximelebreton .
Oliver
Doit-il être parseFloat ($ (this) .css ('marginBottom'), 10)
user1736947
9
$(this).css('marginBottom').replace('px','')
Diodeus - James MacFarlane
la source
2
Cela ne traiterait que le cas «px». Donc je suppose qu'un remplacement séparé devrait être fait pour chacun des «suffixes» restants.
Grzegorz Oledzki
3
Soyez prudent - les autres suffixes ne sont pas en pixels, donc si vous vous attendez pxmais que emvous les avez, vous devez les convertir.
Ariel
c'est ce que je pensais - y a-t-il des routines de bibliothèque pour cela? Comme je pense que c'est une condition assez raisonnable d'attendre du px, mais pour des raisons de robustesse, quelles sont nos options ...? (Juste réfléchir, ici - je ne vais pas trop m'embêter puisque je contrôle les valeurs)
lol
5

J'utilise un simple plugin jQuery pour renvoyer la valeur numérique de n'importe quelle propriété CSS unique.

Il s'applique parseFloatà la valeur renvoyée par la cssméthode par défaut de jQuery .

Définition du plugin:

$.fn.cssNum = function(){
  return parseFloat($.fn.css.apply(this,arguments));
}

Usage:

var element = $('.selector-class');
var numericWidth = element.cssNum('width') * 10 + 'px';
element.css('width', numericWidth);
Quickredfox
la source
5

Supposons que vous ayez une propriété margin-bottom définie sur 20px / 20% / 20em. Pour obtenir la valeur sous forme de nombre, il existe deux options:

Option 1:

parseInt($('#some_DOM_element_ID').css('margin-bottom'), 10);

La fonction parseInt () analyse une chaîne et renvoie un entier. Ne changez pas les 10 trouvés dans la fonction ci-dessus (connue sous le nom de "radix") à moins que vous ne sachiez ce que vous faites.

L'exemple de sortie sera: 20 (si la marge inférieure est définie en px) pour% et em il affichera le nombre relatif basé sur la taille de l'élément parent / police actuelle.

Option 2 (personnellement, je préfère cette option)

parseFloat($('#some_DOM_element_ID').css('margin-bottom'));

L'exemple de sortie sera: 20 (si la marge inférieure est définie en px) pour% et em il affichera le nombre relatif basé sur la taille de l'élément parent / police actuelle.

La fonction parseFloat () analyse une chaîne et renvoie un nombre à virgule flottante.

La fonction parseFloat () détermine si le premier caractère de la chaîne spécifiée est un nombre. Si tel est le cas, il analyse la chaîne jusqu'à ce qu'elle atteigne la fin du nombre et renvoie le nombre sous forme de nombre et non sous forme de chaîne.

L'avantage de l'option 2 est que si vous obtenez des nombres décimaux retournés (par exemple 20,32322px), vous obtiendrez le nombre retourné avec les valeurs derrière la virgule décimale. Utile si vous avez besoin de renvoyer des nombres spécifiques, par exemple si votre marge inférieure est définie sur em ou %

Arman Nisch
la source
4

parseinttronquera toutes les valeurs décimales (par exemple 1.5emdonne 1).

Essayez une replacefonction avec regex par exemple

$this.css('marginBottom').replace(/([\d.]+)(px|pt|em|%)/,'$1');
pelms
la source
4

Id aller pour:

Math.abs(parseFloat($(this).css("property")));
mojo
la source
Pas une solution générique. Dans la plupart des cas, je pense que je veux savoir que marginc'est négatif ou positif!
Andre Figueiredo
3

Le moyen le plus simple d'obtenir la largeur de l'élément sans unités est:

target.width()

Source: https://api.jquery.com/width/#width2

Paul Leclercq
la source
Idéal pour la largeur et la hauteur. $ (selector) .width () et $ (selector) .height () sont en effet des nombres. Pas utile pour les autres accessoires css: marge, remplissage.
eon
3

Vous pouvez implémenter ce plugin jQuery très simple :

Définition du plugin:

(function($) {
   $.fn.cssValue = function(p) {
      var result;
      return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
   };
})(jQuery);

Il est résistant aux NaNvaleurs qui peuvent se produire dans l'ancienne version d'IE (retournera à la 0place)

Usage:

$(this).cssValue('marginBottom');

Prendre plaisir! :)

CodeGems
la source
1
C'est une bonne idée, mais n'oubliez pas de faire attention aux effets secondaires comme appeler une fonction de coût inconnu plus que nécessaire. var result; return isNaN(result = parseFloat(this.css(p))) ? 0 : result;
Nicole
2

Pour améliorer la réponse acceptée, utilisez ceci:

Number($(this).css('marginBottom').replace(/[^-\d\.]/g, ''));
ATR
la source
2

Si c'est juste pour "px", vous pouvez également utiliser:

$(this).css('marginBottom').slice(0, -2);
Carli Beeli
la source
0

Devrait supprimer des unités tout en préservant les décimales.

var regExp = new RegExp("[a-z][A-Z]","g");
parseFloat($(this).css("property").replace(regExp, ""));
Tyler
la source
-1

utilisation

$(this).cssUnit('marginBottom');

qui renvoient un tableau. le premier index renvoie la valeur de la marge inférieure (exemple 20 pour 20px) et le second index renvoie l'unité de la marge inférieure (exemple px pour 20px)

morpheis camus
la source
1
cssUnit fait en fait partie de jQueryUI, pas de jQuery.
cvkline