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

montrealistisch
quelle
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')) ) + '%';
Adam Lassek
quelle
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%"
redexp
quelle
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!

timofey.com
quelle
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>
Gumbo
quelle
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'];
Ddanon
quelle
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). :) :)

Leonard Pauli
quelle
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.

Gregory Magarshak
quelle
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
1

Ich habe ein ähnliches Problem beim Abrufen der Werte des globalen Stylesheets in jQuery . Schließlich habe ich die gleiche Lösung wie oben gefunden .

Ich wollte nur die beiden Fragen miteinander verknüpfen, damit andere von späteren Erkenntnissen profitieren können.

Horst Walter
quelle
2
Ihre und diese Frage sind bereits verknüpft (siehe die Seitenleiste „Verknüpft“ rechts), da shesek Ihre Frage kommentiert hat.
Chris Johnsen
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.

whereesrhys
quelle
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/

user267867
quelle
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
}
BT
quelle
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>
Zachary Horton
quelle