Riempimento o valore del margine in pixel come numero intero usando jQuery


207

jQuery ha funzioni height () en width () che restituisce l'altezza o la larghezza in pixel come numero intero ...

Come posso ottenere un riempimento o un valore di margine di un elemento in pixel e come numero intero usando jQuery?

La mia prima idea era di fare quanto segue:

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

Ma se il riempimento viene fornito in ems, ad esempio, come posso ottenere il valore in pixel?


Guardando il plugin JSizes suggerito da Chris Pebble mi sono reso conto che la mia versione era quella giusta :). jQuery restituisce sempre un valore in pixel, quindi la soluzione era solo l'analisi di un numero intero.

Grazie a Chris Pebble e Ian Robinson


Puoi per favore scegliere una risposta tra le risposte disponibili qui sotto?
Modalità Wes,

4
Una nota per le persone in questo thread: specifica sempre radix quando lo usi parseInt. Citando MDN: " radix Un int tra 2 e 36 che rappresenta la radice (la base nei sistemi numerici matematici) della stringa sopra menzionata. Specificare 10 per il sistema numerico decimale. Specificare sempre questo parametro per eliminare la confusione del lettore e garantire un comportamento prevedibile Diverse implementazioni producono risultati diversi quando non viene specificata una radice, di solito il valore predefinito è 10. " Vedi: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
dgellow

Risposte:


226

Dovresti essere in grado di usare CSS ( http://docs.jquery.com/CSS/css#name ). Potrebbe essere necessario essere più specifici come "padding-left" o "margin-top".

Esempio:

CSS

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

JS

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

Il risultato è 10px.

Se si desidera ottenere il valore intero, è possibile effettuare le seguenti operazioni:

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

5
Non ho verificato se il metodo jQuery restituisce effettivamente il suffisso "px" o meno, tuttavia il JSizesplug-in dall'altra risposta (che ho finito per usare) restituisce un numero intero quando viene passato il valore restituito ParseInt(...), solo FYI.
Dan Herbert,

12
Cordiali saluti: jQuery aggiunge il 'px', quindi la soluzione di Ian funziona e restituirà anche un numero intero quando viene passato a parseInt () - e non richiede un plug-in:parseInt($('a').css('margin-top').replace('px', ''))
Peter Rust,

56
parseInt è più veloce della sostituzione ('px', '') del 49% su Chrome jsperf.com/replace-vs-parseint
Banca

17
Se il riempimento / margine è espresso come em o pt nel CSS, .css()restituirà comunque il valore con "px" alla fine?
ingrediente_15939

22
@ ingrediente_15939 - L'ho appena provato e sì; calcola il valore attuale del pixel e lo restituisce con px. Lo stesso vale per le larghezze dei bordi. Vecchia domanda che conosco, ma dato che nessuno ha risposto alla tua domanda, ho pensato che l'avrei fatto per aiutare altri ritardatari ...
Whelkaholism

79

Confronta altezza / larghezza esterne ed interne per ottenere il margine totale e l'imbottitura:

var that = $("#myId");
alert(that.outerHeight(true) - that.innerHeight());

ottimo consiglio! Mi ha aiutato
Abe Petrillo,

1
non mi ero reso conto che esteriormente esistesse. Grazie mille!
AlexMorley-Finch

6
Ricorda che outerWidth / Height include anche le larghezze del bordo
elettrichead

7
innertWidth / innerHeight include anche l'imbottitura nei loro calcoli, per ottenere la larghezza / altezza senza imbottitura, è necessario utilizzare .width () e .height (). api.jquery.com/innerWidth api.jquery.com/width api.jquery.com/outerWidth
Andrew Ensley

2
that.outerHeight(true) - that.outerHeight()darebbe il totale dei margini verticali, poiché outerHeight () includerebbe imbottiture e bordi ma escluderebbe i margini. Vedi api.jquery.com/outerWidth/ .
Aximili,

35

La funzione parseInt ha un parametro "radix" che definisce il sistema numerico utilizzato sulla conversione, quindi la chiamata parseInt(jQuery('#something').css('margin-left'), 10);restituisce il margine sinistro come intero.

Questo è quello che usano JSizes.


3
Grazie per questo, odio dover includere plugin per minuscole funzionalità.
Brian,

2
Non è nemmeno necessario passare il "radix" in quanto il valore predefinito è 10.
Alexander Bird

5
Ricorda che parseInt può restituire NaN (che a sua volta fa fallire i calcoli basati su quella variabile) - aggiungi successivamente un controllo isNaN! Caso di esempio: parseInt('auto', 10);( autoè valido margin-left).
Thomas

@sethAlexanderBird ha ragione nel dichiarare che il radix sarà automaticamente impostato su 10, tuttavia se la sfilacciatura del codice è importante per te (e probabilmente dovrebbe esserlo) jsLint e jsHint ti scricchioleranno se lo lasci fuori.
Greg,

30

PER FAVORE non andare a caricare un'altra libreria solo per fare qualcosa che è già nativamente disponibile!

jQuery's .css()converte% 's ed em's nel loro equivalente pixel per cominciare, e parseInt()rimuoverà 'px'la fine della stringa restituita e la convertirà in un numero intero:

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

11

Ecco come puoi ottenere le dimensioni circostanti:

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

Prestare attenzione che ogni variabile, paddingTopBottomad esempio, contenga la somma dei margini su entrambi i lati dell'elemento; Per esempio, paddingTopBottom == paddingTop + paddingBottom. Mi chiedo se c'è un modo per ottenerli separatamente. Naturalmente, se sono uguali, puoi dividere per 2 :)


true = include margin. +1000 internet
glifo

Questa è la soluzione migliore perché funziona anche su IE 7. Vedi: stackoverflow.com/questions/590602/...
Leniel Maccaferri

9

Questa semplice funzione lo farà:

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

Uso:

var padding = $('#myId').pixels('paddingTop');

3
non tiene conto auto, inherite %valori
Thomas

3
@Thomas: Non è vero. jsfiddle.net/nXyFN jQuery sembra restituire il risultato in pixel, sempre.
aprono il

4
@Mark jsfiddle.net/BNQ6S IE7: NaNdipende dal browser. Per quanto ne so jQuery non si normalizza .css()diversamente da .width()&.height()
Thomas

1
@Thomas: interessante. Anche la soluzione di Ian (più votata) presenta lo stesso problema. La soluzione di svinto è probabilmente la migliore.
Aprire il

9

Parse int

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

restituisce 0 per 0px


9

Puoi semplicemente afferrarli come con qualsiasi attributo CSS :

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

Puoi impostarli con un secondo attributo nel metodo css:

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

EDIT: se hai bisogno solo del valore in pixel, usa parseInt(val, 10):

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

3

ok solo per rispondere alla domanda originale:

puoi ottenere il riempimento come intero utilizzabile come questo:

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

Se hai definito un'altra misura come px basta sostituire "ems" con "px". parseInt interpreta la stringa come un valore errato, quindi è importante sostituirla con ... nulla.


2

Puoi anche estendere tu stesso il framework jquery con qualcosa del tipo:

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

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

Quindi aggiungendo una funzione sui tuoi oggetti jquery chiamata margin (), che restituisce una collezione come la funzione offset.

fx.

$("#myObject").margin().top

2
Sfortunatamente questo non ti dà i margini superiore e sinistro, ma piuttosto i margini Verticale e Totale Orizzontali
Codice Commander

Tuttavia, potrebbe essere modificato utilizzando la funzione parseInt in una delle altre soluzioni per consentire una funzione di margine che appare più uniforme
Brian




0

Non per necro ma ho fatto questo che può determinare i pixel in base a una varietà di valori:

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

In questo modo, prendiamo in considerazione il dimensionamento e l'auto / eredità.


Si noti che parseInt()è sbagliato, la larghezza o l'altezza possono essere punti mobili.
Alexis Wilke,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.