Auffüllen oder Randwert in Pixel als Ganzzahl mit jQuery

207

jQuery verfügt über die Funktionen height () und width (), die die Höhe oder Breite in Pixel als Ganzzahl ... zurückgeben.

Wie kann ich mit jQuery einen Füll- oder Randwert eines Elements in Pixel und als Ganzzahl abrufen?

Meine erste Idee war, Folgendes zu tun:

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

Aber wie kann ich den Wert in Pixel erhalten, wenn zum Beispiel in ems eine Auffüllung angegeben ist?


Als ich mir das von Chris Pebble vorgeschlagene JSizes-Plugin ansah, stellte ich fest, dass meine eigene Version die richtige war :). jQuery gibt immer einen Wert in Pixel zurück, daher war es die Lösung, ihn nur auf eine Ganzzahl zu analysieren.

Vielen Dank an Chris Pebble und Ian Robinson

Malik Amurlayev
quelle
Können Sie bitte eine Antwort aus den unten verfügbaren Antworten auswählen?
Wes Modes
4
Ein Hinweis für Personen in diesem Thread: Geben Sie bei der Verwendung immer Radix an parseInt. Zitieren von MDN: " radix Ein int zwischen 2 und 36, das den Radix (die Basis in mathematischen Zahlensystemen) der oben genannten Zeichenfolge darstellt. Geben Sie 10 für das Dezimalzahlensystem an. Geben Sie diesen Parameter immer an, um Verwirrung beim Leser zu vermeiden und ein vorhersagbares Verhalten zu gewährleisten Unterschiedliche Implementierungen führen zu unterschiedlichen Ergebnissen, wenn kein Radix angegeben wird. Der Standardwert ist normalerweise 10. " Siehe: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
dgellow

Antworten:

226

Sie sollten in der Lage sein, CSS zu verwenden ( http://docs.jquery.com/CSS/css#name ). Möglicherweise müssen Sie spezifischer sein, z. B. "links auffüllen" oder "oben am Rand".

Beispiel:

CSS

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

JS

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

Das Ergebnis ist 10px.

Wenn Sie den ganzzahligen Wert erhalten möchten, können Sie Folgendes tun:

parseInt($("a").css("margin-top"))
Ian Robinson
quelle
5
Ich habe nicht überprüft, ob die jQuery-Methode tatsächlich das Suffix "px" zurückgibt oder nicht, aber das JSizesPlugin aus der anderen Antwort (die ich letztendlich verwendet habe) gibt eine Ganzzahl zurück, wenn der Rückgabewert übergeben wird ParseInt(...), nur zu Ihrer Information.
Dan Herbert
12
Zu Ihrer Information: jQuery fügt das 'px' hinzu, daher funktioniert Ians Lösung und gibt auch eine Ganzzahl zurück, wenn sie an parseInt () übergeben wird - und es ist kein Plugin erforderlich:parseInt($('a').css('margin-top').replace('px', ''))
Peter Rust
56
parseInt ist schneller als das Ersetzen ('px', '') um 49% auf chrome jsperf.com/replace-vs-parseint
Bank
17
Wenn das Auffüllen / der Rand im CSS als em oder pt ausgedrückt wird, wird .css()der Wert am Ende immer noch mit "px" zurückgegeben?
ingredient_15939
22
@ Zutat_15939 - Habe es gerade versucht und ja; es berechnet den tatsächlichen Pixelwert und gibt ihn mit px zurück. Gleiches gilt für Randbreiten. Alte Frage, die ich kenne, aber als niemand Ihre Frage beantwortete, dachte ich, ich würde es tun, um anderen Nachzüglern zu helfen ...
Whelkaholism
79

Vergleichen Sie die äußere und innere Höhe / Breite, um den Gesamtrand und die Polsterung zu erhalten:

var that = $("#myId");
alert(that.outerHeight(true) - that.innerHeight());
svinto
quelle
toller Tipp! Hat mir geholfen
Abe Petrillo
1
Ich wusste nicht, dass OuterHeight Existed. Vielen Dank!
AlexMorley-Finch
6
Denken Sie daran, dass OuterWidth / Height auch Randbreiten enthält
Electrichead
7
innertWidth / innerHeight berücksichtigen auch das Auffüllen in ihren Berechnungen. Um die Breite / Höhe ohne Auffüllen zu erhalten, müssen Sie .width () und .height () verwenden. api.jquery.com/innerWidth api.jquery.com/width api.jquery.com/outerWidth
Andrew Ensley
2
that.outerHeight(true) - that.outerHeight()würde die gesamten vertikalen Ränder angeben, da OuterHeight () Auffüllungen und Ränder enthalten würde, Ränder jedoch ausschließen würde. Siehe api.jquery.com/outerWidth/ .
Aximili
35

Die parseInt-Funktion verfügt über einen "radix" -Parameter, der das bei der Konvertierung verwendete Zahlensystem definiert. Beim Aufrufen wird parseInt(jQuery('#something').css('margin-left'), 10);der linke Rand als Ganzzahl zurückgegeben.

Dies ist, was JSizes verwenden.

Guigouz
quelle
3
Vielen Dank dafür, ich hasse es, Plugins für winzige Funktionen einbinden zu müssen.
Brian
2
Sie müssen nicht einmal den "Radix" übergeben, da er standardmäßig 10 ist.
Alexander Bird
5
Beachten Sie, dass parseInt NaN zurückgeben kann (was wiederum dazu führt, dass die auf dieser Variablen basierenden Berechnungen fehlschlagen) - fügen Sie anschließend eine isNaN-Prüfung hinzu! Beispielfall: parseInt('auto', 10);( autoist gültig margin-left).
Thomas
@sethAlexanderBird Sie haben korrekt angegeben, dass der Radix standardmäßig 10 ist. Wenn jedoch Code-Flusen für Sie wichtig sind (und dies wahrscheinlich auch sein sollten), kreischen jsLint und jsHint Sie an, wenn Sie sie weglassen.
Greg
30

BITTE laden Sie keine andere Bibliothek, nur um etwas zu tun, das bereits nativ verfügbar ist!

jQuery's .css()konvertiert zunächst% und em in ihre Pixeläquivalente und parseInt()entfernt die 'px'vom Ende der zurückgegebenen Zeichenfolge und konvertiert sie in eine Ganzzahl:

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

So erhalten Sie die umliegenden Dimensionen:

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

Beachten Sie, dass jede Variable paddingTopBottombeispielsweise die Summe der Ränder auf beiden Seiten des Elements enthält. dh , paddingTopBottom == paddingTop + paddingBottom. Ich frage mich, ob es eine Möglichkeit gibt, sie separat zu erhalten. Wenn sie gleich sind, können Sie natürlich durch 2 teilen :)

FireAphis
quelle
true = Rand einschließen. +1000 Internet
Glyphe
Dies ist die beste Lösung, da sie auch funktioniert IE 7. Siehe: stackoverflow.com/questions/590602/…
Leniel Maccaferri
9

Diese einfache Funktion wird es tun:

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

Verwendung:

var padding = $('#myId').pixels('paddingTop');
mpen
quelle
3
berücksichtigt nicht auto, inheritund %Werte
Thomas
3
@ Thomas: Nicht wahr. jsfiddle.net/nXyFN jQuery scheint das Ergebnis immer in Pixel zurückzugeben.
Mpen
4
@Mark jsfiddle.net/BNQ6S IE7 : NaN, hängt vom Browser ab. Soweit ich weiß, normalisiert sich jQuery nicht .css()anders als .width()&.height()
Thomas
1
@ Thomas: Interessant. Ians Lösung (am besten bewertet) hat dann auch das gleiche Problem. Die Lösung von svinto ist wahrscheinlich die beste.
Mpen
9

Parse int

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

gibt 0 für 0px zurück

a53-416
quelle
9

Sie können sie wie bei jedem CSS-Attribut abrufen :

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

Sie können sie mit einem zweiten Attribut in der CSS-Methode festlegen:

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

BEARBEITEN: Wenn Sie nur den Pixelwert benötigen, verwenden Sie parseInt(val, 10):

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

ok nur um die ursprüngliche Frage zu beantworten:

Sie können die Auffüllung als verwendbare Ganzzahl wie folgt erhalten:

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

Wenn Sie eine andere Messung wie px definiert haben, ersetzen Sie einfach "ems" durch "px". parseInt interpretiert den Stringpart als falschen Wert, daher ist es wichtig, ihn durch ... nichts zu ersetzen.

EeKay
quelle
2

Sie können das jquery-Framework auch selbst um Folgendes erweitern:

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

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

Fügen Sie dabei Ihren jquery-Objekten eine Funktion namens margin () hinzu, die eine Auflistung wie die Offset-Funktion zurückgibt.

fx.

$("#myObject").margin().top
Cralexns
quelle
2
Leider gibt dies nicht die oberen und linken Ränder, sondern die totalVertical und totalHorizontal Ränder
Code Commander
Es könnte jedoch mit der Funktion parseInt in einer der anderen Lösungen bearbeitet werden, um eine nahtlosere Randfunktion zu ermöglichen
Brian
1

Verwenden Sie nicht string.replace ("px", ""));

Verwenden Sie parseInt oder parseFloat!

RubbelDeCatc
quelle
0

Ich benutze wahrscheinlich das gquub-Plugin github.com/bramstein/jsizes für Auffüllungen und Ränder auf sehr komfortable Weise. Danke ...

Mustafah
quelle
0

Nicht zu Nekro, aber ich habe dies gemacht, das Pixel basierend auf einer Vielzahl von Werten bestimmen kann:

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

Auf diese Weise berücksichtigen wir die Größenbestimmung und Auto / Erben.

Nijikokun
quelle
Beachten Sie, dass dies parseInt()falsch ist. Die Breite oder Höhe kann Gleitkomma sein.
Alexis Wilke