obtenir la valeur de pourcentage de la règle CSS dans jQuery

98

Disons que la règle est la suivante:

.largeField {
    width: 65%;
}

Existe-t-il un moyen de récupérer «65%» d'une manière ou d'une autre, et non la valeur de pixel?

Merci.

EDIT: Malheureusement, l'utilisation des méthodes DOM n'est pas fiable dans mon cas, car j'ai une feuille de style qui importe d'autres feuilles de style, et par conséquent, le paramètre cssRules se termine par null ou non défini valeur .

Cette approche, cependant, fonctionnerait dans la plupart des cas simples (une feuille de style, plusieurs déclarations de feuille de style distinctes à l'intérieur de la balise head du document).

montréaliste
la source
1
Il serait préférable de semer ces données sur l'élément lui-même, puis de suivre son évolution dans le futur.
Travis J

Réponses:

51

Il n'y a pas de moyen intégré, j'en ai peur. Vous pouvez faire quelque chose comme ceci:

var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';
Adam Lassek
la source
19
juste pour être clair, cela ne vous dit pas la valeur de votre style, cela vous donne une valeur calculée
Anthony Johnston
2
@shevski cela fonctionne bien, vous devez ajouter class="largeField"à la plage, actuellement vous sélectionnez un ensemble vide.
Adam Lassek
Je sais ce qui ne fonctionne pas et c'est pourquoi c'est un contre-exemple.
shevski
2
@shevski mon exemple donne une valeur calculée d'un élément existant sur la page, comme Anthony l'avait déjà souligné il y a un an. Vos commentaires sont superflus.
Adam Lassek
@AdamLassek, Anthony n'a pas dit qu'il existait le plus.
shevski
116

Le moyen le plus simple

$('.largeField')[0].style.width

// >>> "65%"
redexp
la source
50
Juste une note: cela ne fonctionnera qu'avec css directement appliqué sur l'élément (par exemple style="width:65%").
brianreavis
3
Génial!! Pour renvoyer uniquement les nombres: parseInt ($ ('. LargeField') [0] .style.width, 10);
Tiago
4
Tiago, vous pouvez simplement utiliser parseFloat ().
Gavin
Cela ne fonctionne que dans le style en ligne, comme l'a dit @brianreavis.
Akansh le
84

C'est très certainement possible!

Vous devez d'abord masquer () l'élément parent. Cela empêchera JavaScript de calculer les pixels de l'élément enfant.

$('.parent').hide();
var width = $('.child').width();
$('.parent').show();
alert(width);

Voyez mon exemple .

Maintenant ... je me demande si je suis le premier à découvrir ce hack :)

Mettre à jour:

Bon mot

element.clone().appendTo('body').wrap('<div style="display: none"></div>').css('width');

Il laissera un élément caché avant la </body>balise, ce que vous voudrez peut-être .remove().

Voir un exemple de one-liner .

Je suis ouvert à de meilleures idées!

timofey.com
la source
1
Cela devrait être la solution acceptée. Je peux également confirmer que cela fonctionne pour moi lorsque les autres réponses n'obtiennent pas la valeur de pourcentage initialement attribuée.
EricP
1
Pour éviter le scintillement, clonez l'enfant, masquez le parent, puis récupérez la largeur. var clone = $ ('. enfant'). clone ();
user1491819
3
Mise à jour: function getCssWidth (childSelector) {return jQuery (childSelector) .parent (). Clone (). Hide (). Find (childSelector) .width (); } console.log ('largeur enfant:' + getCssWidth ('. enfant')) ;;
user1491819
1
Solution géniale! Voici un équivalent pur-js du script jsfiddle.net/Sjeiti/2qkftdjd
Sjeiti
1
Si la réponse $ (...) [0] .style.width fonctionne, cela ne devrait-il pas être la solution acceptée? Cette solution, bien qu'élégante, souffre de certains défauts de performances.
Mihai Danila
44

Vous pouvez accéder à l' document.styleSheetsobjet:

<style type="text/css">
    .largeField {
        width: 65%;
    }
</style>
<script type="text/javascript">
    var rules = document.styleSheets[0].rules || document.styleSheets[0].cssRules;
    for (var i=0; i < rules.length; i++) {
        var rule = rules[i];
        if (rule.selectorText.toLowerCase() == ".largefield") {
            alert(rule.style.getPropertyValue("width"));
        }
    }
</script>
Gombo
la source
8
+1 utilisation correcte des méthodes DOM (parfois jQuery n'est pas la réponse)
bobince
1
+1 Je suis avec vous ici pour plus de précision. Je suis curieux de savoir comment chaque navigateur prend en charge cela, mais c'est la bonne réponse.
cgp
Fonctionne bien dans des cas plus simples, à la fois FF et IE7, mais pas pour moi (voir EDIT ci-dessus).
montrealist le
1
Avez-vous également essayé de parcourir toutes les feuilles de style? Mon exemple a simplement utilisé le premier ( styleSheets[0]).
Gumbo le
Désolé si c'est une question noob, mais comment cela for (var i=0; rules.length; i++)fonctionnerait-il? Ne devrait-il pas êtrefor (var i=0; i<rules.length; i++)
sbichenko
18

En retard, mais pour les utilisateurs plus récents, essayez ceci si le style css contient un pourcentage :

$element.prop('style')['width'];
ddanone
la source
A fonctionné comme un charme pour la taille de la police css. $ element.prop ('style') ['font-size];
Jason
10

Un plugin jQuery basé sur la réponse Adams:

(function ($) {

    $.fn.getWidthInPercent = function () {
        var width = parseFloat($(this).css('width'))/parseFloat($(this).parent().css('width'));
        return Math.round(100*width)+'%';
    };

})(jQuery);

$('body').html($('.largeField').getWidthInPercent());​​​​​

Renvoie «65%». Ne renvoie que des nombres arrondis pour mieux fonctionner si vous aimez if (width == '65%'). Si vous aviez utilisé directement la réponse d'Adams, cela n'avait pas fonctionné (j'ai obtenu quelque chose comme 64,93288590604027). :)

Leonard Pauli
la source
3

S'appuyant sur l'excellente et surprenante solution de timofey, voici une implémentation purement Javascript:

function cssDimensions(element)
  var cn = element.cloneNode();
  var div = document.createElement('div');
  div.appendChild(cn);
  div.style.display = 'none';
  document.body.appendChild(div);
  var cs = window.getComputedStyle
    ? getComputedStyle(cn, null)
    : cn.currentStyle;
  var ret = { width: cs.width, height: cs.height };
  document.body.removeChild(div);
  return ret;
}

J'espère que c'est utile à quelqu'un.

Grégory Magarshak
la source
une erreur de syntaxe, vous avez oublié {en fin de première ligne.
Akansh le
seule cette solution affiche correctement 'auto' lorsque la largeur pour div n'est pas définie, jquery css ('width') renvoie '0px'. toutes les autres réponses sont incorrectes ...
Alexey Obukhov
1

J'ai un problème similaire dans Obtenir les valeurs de la feuille de style globale dans jQuery , j'ai finalement trouvé la même solution que ci-dessus .

Je voulais juste croiser les deux questions afin que d'autres puissent bénéficier des résultats ultérieurs.

Horst Walter
la source
2
Votre question et celle-ci sont déjà liées (voir la barre latérale «Lié» à droite) en vertu du commentaire de shesek sur votre question.
Chris Johnsen
0

Vous pouvez mettre les styles auxquels vous avez besoin d'accéder avec jQuery soit dans:

  1. la tête du document directement
  2. dans un include, quel script côté serveur met ensuite dans la tête

Ensuite, il devrait être possible (mais pas nécessairement facile) d'écrire une fonction js pour analyser tout ce qui se trouve dans les balises de style dans l'en-tête du document et renvoyer la valeur dont vous avez besoin.

où rhys
la source
0

Vous pouvez utiliser la fonction css (largeur) pour renvoyer la largeur actuelle de l'élément.

c'est à dire.

var myWidth = $("#myElement").css("width");

Voir aussi: http://api.jquery.com/width/ http://api.jquery.com/css/

user267867
la source
pourquoi est-ce marqué? il y a un bogue ouvert sur ce bugs.jquery.com/ticket/4772 , il semble qu'il y ait une incohérence dans l'appel selon que vous mettez votre style en ligne ou dans une feuille de style jsfiddle.net/boushley/MSyqR/2
Anthony Johnston
1
je ne peux pas obtenir% avec ça
someoneuseless
0

Il n'y a rien dans jQuery, et rien de simple même en javascript. En prenant la réponse de timofey et en courant avec elle, j'ai créé cette fonction qui fonctionne pour obtenir toutes les propriétés que vous voulez:

// gets the style property as rendered via any means (style sheets, inline, etc) but does *not* compute values
// domNode - the node to get properties for 
// properties - Can be a single property to fetch or an array of properties to fetch
function getFinalStyle(domNode, properties) {
    if(!(properties instanceof Array)) properties = [properties]

    var parent = domNode.parentNode
    if(parent) {
        var originalDisplay = parent.style.display
        parent.style.display = 'none'
    }
    var computedStyles = getComputedStyle(domNode)

    var result = {}
    properties.forEach(function(prop) {
        result[prop] = computedStyles[prop]
    })

    if(parent) {
        parent.style.display = originalDisplay
    }

    return result
}
BT
la source
0

Conversion de pixels en pourcentage en utilisant la multiplication croisée .

Configuration de la formule:

1.) (element_width_pixels / parent_width_pixels) = (element_width_pixels / 100)

2.) element_width_percentage = (100 * element_width_pixels) / parent_width_pixels

Le code actuel:

<script>

   var $width_percentage = (100 * $("#child").width()) / $("#parent").width();

</script>
Zachary Horton
la source