Wartość wypełnienia lub marginesu w pikselach jako liczba całkowita przy użyciu jQuery

207

jQuery ma funkcje height () en width (), które zwracają wysokość lub szerokość w pikselach jako liczbę całkowitą ...

Jak uzyskać wartość wypełnienia lub marginesu elementu w pikselach i liczbach całkowitych za pomocą jQuery?

Moim pierwszym pomysłem było wykonanie następujących czynności:

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

Ale jeśli na przykład podano ems, to jak mogę uzyskać wartość w pikselach?


Przeglądając wtyczkę JSizes, sugerowaną przez Chrisa Pebble'a, zdałem sobie sprawę, że moja własna wersja była właściwa :). jQuery zwraca zawsze wartość w pikselach, więc rozwiązaniem było właśnie parsowanie jej do liczby całkowitej.

Dzięki Chris Pebble i Ian Robinson

Malik Amurlayev
źródło
Czy możesz wybrać odpowiedź spośród odpowiedzi dostępnych poniżej?
Wes Modes
4
Uwaga dla osób w tym wątku: zawsze określaj podstawę, kiedy używasz parseInt. Cytując MDN: „ podstawa Liczba całkowita między 2 a 36, ​​która reprezentuje podstawkę (podstawę w matematycznych systemach liczbowych) wyżej wymienionego łańcucha. Podaj 10 dla systemu liczb dziesiętnych. Zawsze określ ten parametr, aby wyeliminować zamieszanie czytelnika i zagwarantować przewidywalne zachowanie Różne implementacje dają różne wyniki, gdy podstawa nie jest podana, zwykle przyjmując domyślną wartość 10. ” Zobacz: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
dgellow

Odpowiedzi:

226

Powinieneś być w stanie korzystać z CSS ( http://docs.jquery.com/CSS/css#name ). Być może będziesz musiał być bardziej szczegółowy, np. „Padding-left” lub „margin-top”.

Przykład:

CSS

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

JS

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

Wynik to 10 pikseli.

Jeśli chcesz uzyskać wartość całkowitą, możesz wykonać następujące czynności:

parseInt($("a").css("margin-top"))
Ian Robinson
źródło
5
Nie sprawdziłem, czy metoda jQuery faktycznie zwraca sufiks „px”, czy nie, jednak JSizeswtyczka z drugiej odpowiedzi (którą ostatecznie wykorzystałem) zwraca liczbę całkowitą po przekazaniu wartości zwracanej ParseInt(...), tylko FYI.
Dan Herbert
12
FYI: jQuery dodaje „px”, więc rozwiązanie Iana działa, a także zwróci liczbę całkowitą, gdy zostanie przekazane do parseInt () - i nie wymaga wtyczki:parseInt($('a').css('margin-top').replace('px', ''))
Peter Rust
56
parseInt jest szybszy niż zamień ('px', '') o 49% na chrome jsperf.com/replace-vs-parseint
Bank
17
Jeśli dopełnienie / margines jest wyrażone w CSS jako em lub pt, czy .css()nadal zwróci wartość z „px” na końcu?
ingredient_15939
22
@ component_15939 - Właśnie wypróbowałem i tak; oblicza rzeczywistą wartość pikseli i zwraca ją z px. To samo dotyczy szerokości granic. Stare pytanie, wiem, ale ponieważ nikt nie odpowiedział na twoje pytanie, pomyślałem, że zrobię to, aby pomóc innym spóźnialskim ...
Whelkaholism
79

Porównaj zewnętrzną i wewnętrzną wysokość / szerokość, aby uzyskać całkowity margines i wypełnienie:

var that = $("#myId");
alert(that.outerHeight(true) - that.innerHeight());
Svinto
źródło
świetna wskazówka! Pomógł mi
Abe Petrillo
1
nie zdawałem sobie sprawy, że istniała zewnętrzna wysokość. Dziękuję Ci bardzo!
AlexMorley-Finch,
6
Pamiętaj, że zewnętrzna szerokość / wysokość zawiera również szerokości granic
electrichead
7
innertWidth / innerHeight uwzględniają również dopełnianie w swoich obliczeniach, aby uzyskać szerokość / wysokość bez dopełniania, należy użyć .width () i .height (). api.jquery.com/innerWidth api.jquery.com/width api.jquery.com/outerWidth
Andrew Ensley
2
that.outerHeight(true) - that.outerHeight()dałoby całkowite marginesy pionowe, ponieważ outerHeight () obejmowałby wypełnienia i obramowania, ale wykluczałby marginesy. Zobacz api.jquery.com/outerWidth/ .
Aximili
35

Funkcja parseInt ma parametr „radix”, który definiuje system liczbowy używany podczas konwersji, więc wywołanie parseInt(jQuery('#something').css('margin-left'), 10);zwraca lewy margines jako liczbę całkowitą.

Właśnie tego używa JSizes.

guigouz
źródło
3
Dzięki za to nie lubię dołączać wtyczek do niewielkich elementów funkcjonalności.
Brian,
2
Nie musisz nawet przekazywać „podstawki”, ponieważ domyślnie jest to 10.
Alexander Bird
5
Pamiętaj, że parseInt może zwrócić NaN (co z kolei powoduje, że obliczenia oparte na tej zmiennej zawodzą) - następnie dodaj kontrolę isNaN! Przykładowy przypadek: parseInt('auto', 10);( autojest poprawny margin-left).
Thomas
@sethAlexanderBird masz rację stwierdzając, że podstawa domyślnie wynosi 10, jednak jeśli przycinanie kodu jest dla ciebie ważne (i prawdopodobnie powinno być), jsLint i jsHint będą cię drżeć, jeśli go pominiesz.
Greg
30

PROSZĘ nie ładuj innej biblioteki, aby zrobić coś, co jest już dostępne natywnie!

jQuery's .css()konwertuje% i em na ich ekwiwalent pikselowy na początek, i parseInt()usuwa 'px'koniec końca zwracanego ciągu i konwertuje go na liczbę całkowitą:

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
źródło
11

Oto, w jaki sposób możesz uzyskać otaczające wymiary:

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

Zwróć uwagę, że paddingTopBottomna przykład każda zmienna zawiera sumę marginesów po obu stronach elementu; tj paddingTopBottom == paddingTop + paddingBottom. Zastanawiam się, czy istnieje sposób, aby uzyskać je osobno. Oczywiście, jeśli są równe, możesz podzielić przez 2 :)

FireAphis
źródło
true = włącz margines. +1000 internetów
glif
To najlepsze rozwiązanie, ponieważ działa również na IE 7. Zobacz: stackoverflow.com/questions/590602/...
Leniel Maccaferri
9

Ta prosta funkcja to zrobi:

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

Stosowanie:

var padding = $('#myId').pixels('paddingTop');
mpen
źródło
3
nie uwzględnia auto, inherita %wartości
Thomas
3
@Thomas: Nieprawda. jsfiddle.net/nXyFN jQuery zawsze zwraca wynik w pikselach.
mpen
4
@Mark jsfiddle.net/BNQ6S IE7: NaNzależy od przeglądarki. O ile mi wiadomo, jQuery nie normalizuje się w .css()przeciwieństwie do .width()&.height()
Thomas
1
@Thomas: Interesujące. Rozwiązanie Iana (najwyżej oceniane) również ma ten sam problem. Rozwiązanie svinto jest prawdopodobnie najlepsze.
mpen
9

Parse int

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

zwraca 0 dla 0px

a53-416
źródło
9

Możesz je po prostu pobrać jak w przypadku dowolnego atrybutu CSS :

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

Możesz ustawić je za pomocą drugiego atrybutu w metodzie css:

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

EDYCJA: Jeśli potrzebujesz tylko wartości w pikselach, użyj parseInt(val, 10):

parseInt($("#mybox").css("padding-right", "20px"), 10);
Rob Grant
źródło
3

ok, aby odpowiedzieć na oryginalne pytanie:

możesz uzyskać dopełnienie jako użyteczną liczbę całkowitą taką jak ta:

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

Jeśli zdefiniowałeś inny pomiar, np. Px, po prostu zamień „ems” na „px”. parseInt interpretuje stringpart jako złą wartość, dlatego ważne jest, aby zastąpić go ... nic.

EeKay
źródło
2

Możesz także samodzielnie rozszerzyć framework jquery o coś takiego:

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

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

W ten sposób dodajemy funkcję do twoich obiektów jquery o nazwie margin (), która zwraca kolekcję taką jak funkcja offset.

fx.

$("#myObject").margin().top
cralexns
źródło
2
Niestety nie daje to górnego i lewego marginesu, ale raczej całkowity Pionowy i całkowity Poziomy marginesy
Code Commander
Można go jednak edytować za pomocą funkcji parsowania w jednym z innych rozwiązań, aby umożliwić bardziej płynnie wyglądającą funkcję marginesu
Brian
1

Nie używaj string.replace („px”, „”));

Użyj parseInt lub parseFloat!

RubbelDeCatc
źródło
0

Nie chcę tego robić, ale zrobiłem to, co może określać piksele na podstawie różnych wartości:

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

W ten sposób bierzemy pod uwagę wielkość i auto / dziedziczenie.

Nijikokun
źródło
Zauważ, że parseInt()jest źle, szerokość lub wysokość mogą być zmiennoprzecinkowymi.
Alexis Wilke