Ermittelt den prozentualen Wert der CSS-Regel in jQuery


98

Angenommen, die Regel lautet wie folgt:

.largeField {
    width: 65%;
}

Gibt es eine Möglichkeit, '65% 'irgendwie zurückzubekommen und nicht den Pixelwert?

Vielen Dank.

BEARBEITEN: Leider ist die Verwendung von DOM-Methoden in meinem Fall unzuverlässig, da ich ein Stylesheet habe, das andere Stylesheets importiert, und der Parameter cssRules daher entweder den Wert null oder einen undefinierten Wert hat.

Dieser Ansatz würde jedoch in den einfachsten Fällen funktionieren (ein Stylesheet, mehrere separate Stylesheet-Deklarationen innerhalb des Head- Tags des Dokuments).


1
Es ist am besten, diese Daten auf das Element selbst zu übertragen und dann zu verfolgen, wie es sich in Zukunft ändert.
Travis J

Antworten:


51

Ich fürchte, es gibt keinen eingebauten Weg. Sie können so etwas tun:

var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';

19
Nur um klar zu sein, dies sagt Ihnen nicht den Wert in Ihrem Stil, es gibt Ihnen einen berechneten Wert
Anthony Johnston

2
@ Shevski es funktioniert gut, Sie müssen class="largeField"die Spanne hinzufügen , derzeit wählen Sie eine leere Menge.
Adam Lassek

Ich weiß, was darin nicht funktioniert, und deshalb ist es ein Gegenbeispiel.
Shevski

2
@shevski Mein Beispiel gibt einen berechneten Wert eines vorhandenen Elements auf der Seite an, wie Anthony bereits vor einem Jahr betont hat. Ihre Kommentare sind überflüssig.
Adam Lassek

@AdamLassek, Anthony hat nicht gesagt, dass es am meisten existiert.
Shevski

116

Einfachster Weg

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

// >>> "65%"

50
Nur eine Anmerkung: Dies funktioniert nur mit CSS, das direkt auf das Element angewendet wird (z style="width:65%". B. ).
Brianreavis

3
Toll!! Um nur die Zahlen zurückzugeben: parseInt ($ ('. LargeField') [0] .style.width, 10);
Tiago

4
Tiago, Sie können einfach parseFloat () verwenden.
Gavin

Dies funktioniert nur im Inline-Stil, wie @brianreavis sagte.
Akansh

84

Das ist definitiv möglich!

Sie müssen zuerst das übergeordnete Element ausblenden (). Dadurch wird verhindert, dass JavaScript Pixel für das untergeordnete Element berechnet.

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

Siehe mein Beispiel .

Nun ... ich frage mich, ob ich diesen Hack als Erster entdecke :)

Aktualisieren:

Einzeiler

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

Es hinterlässt ein verstecktes Element vor dem </body>Tag, das Sie möglicherweise möchten .remove().

Sehen Sie sich ein Beispiel für einen Einzeiler an .

Ich bin offen für bessere Ideen!


1
Dies sollte die akzeptierte Lösung sein. Ich kann auch bestätigen, dass es bei mir funktioniert, wenn die anderen Antworten nicht den ursprünglich zugewiesenen Prozentwert erhalten.
EricP

1
Um ein Flackern zu vermeiden, klonen Sie das Kind, verstecken Sie das Elternteil und rufen Sie die Breite ab. var clone = $ ('. child'). clone ();
user1491819

3
Update: Funktion getCssWidth (childSelector) {return jQuery (childSelector) .parent (). Clone (). Hide (). Find (childSelector) .width (); } console.log ('untergeordnete Breite:' + getCssWidth ('. child')) ;;
user1491819

1
Tolle Lösung! Hier ist ein reines js-Äquivalent des Skripts jsfiddle.net/Sjeiti/2qkftdjd
Sjeiti

1
Wenn die Antwort $ (...) [0] .style.width funktioniert, sollte das dann nicht die akzeptierte Lösung sein? Diese Lösung ist zwar elegant, weist jedoch einige Leistungsmängel auf.
Mihai Danila

44

Sie können auf das document.styleSheetsObjekt zugreifen :

<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>

8
+1 ordnungsgemäße Verwendung von DOM-Methoden (manchmal ist jQuery nicht die Antwort)
Bobince

1
+1 Ich bin hier, um die Genauigkeit zu gewährleisten. Ich bin gespannt, wie jeder Browser dies unterstützt, aber das ist die richtige Antwort.
CGP

Funktioniert gut in einfacheren Fällen, sowohl FF als auch IE7, aber nicht für mich (siehe EDIT oben).
Montrealist

1
Haben Sie auch versucht, alle Stylesheets durchzugehen? In meinem Beispiel wurde nur das erste ( styleSheets[0]) verwendet.
Gumbo

Entschuldigung, wenn dies eine Noob-Frage ist, aber wie würde das for (var i=0; rules.length; i++)funktionieren? Sollte es nicht seinfor (var i=0; i<rules.length; i++)
sbichenko

18

Verspätet, aber für neuere Benutzer, versuchen Sie dies, wenn der CSS-Stil einen Prozentsatz enthält :

$element.prop('style')['width'];

Arbeitete wie ein Zauber für CSS-Schriftgröße. $ element.prop ('style') ['Schriftgröße];
Jason

10

Ein jQuery-Plugin basierend auf Adams Antwort:

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

Gibt '65% 'zurück. Gibt nur gerundete Zahlen zurück, um besser zu funktionieren, wenn Sie möchten, wenn (width == '65%'). Wenn Sie Adams Antwort direkt verwendet hätten, hätte das nicht funktioniert (ich habe so etwas wie 64.93288590604027). :) :)


3

Aufbauend auf der hervorragenden und überraschenden Lösung von timofey finden Sie hier eine reine Javascript-Implementierung:

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

Hoffe, es ist hilfreich für jemanden.


Einen Syntaxfehler, den Sie {am Ende der ersten Zeile vergessen haben .
Akansh

Nur diese Lösung zeigt 'auto' korrekt an, wenn width für div nicht gesetzt ist. jquery css ('width') gibt '0px' zurück. alle anderen Antworten falsch ...
Alexey Obukhov


0

Sie können Stile, auf die Sie mit jQuery zugreifen müssen, wie folgt einfügen:

  1. der Kopf des Dokuments direkt
  2. in einem Include, welches serverseitige Skript dann in den Kopf setzt

Dann sollte es möglich (wenn auch nicht unbedingt einfach) sein, eine js-Funktion zu schreiben, um alles innerhalb der Stil-Tags im Dokumentkopf zu analysieren und den gewünschten Wert zurückzugeben.


0

Mit der Funktion css (width) können Sie die aktuelle Breite des Elements zurückgeben.

dh.

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

Siehe auch: http://api.jquery.com/width/ http://api.jquery.com/css/


warum ist das markiert? Auf dieser bugs.jquery.com/ticket/4772 ist ein Fehler offen. Es sieht so aus, als ob es eine gewisse Inkonsistenz beim Aufrufen gibt, je nachdem, ob Sie Ihren Stil inline oder in ein Stylesheet jsfiddle.net/boushley/MSyqR/2
Anthony setzen Johnston

1
Ich kann nicht% damit bekommen
jemand nutzlos

0

In jQuery gibt es nichts und auch in Javascript nichts Unkompliziertes. Ausgehend von der Antwort von timofey habe ich diese Funktion erstellt, mit der Sie alle gewünschten Eigenschaften abrufen können:

// 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
}

0

Konvertieren Sie mithilfe der Kreuzmultiplikation von Pixel in Prozent .

Formel-Setup:

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

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

Der eigentliche Code:

<script>

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

</script>
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.