Valor de margen o margen en píxeles como entero utilizando jQuery

207

jQuery tiene funciones height () en width () que devuelve la altura o el ancho en píxeles como entero ...

¿Cómo puedo obtener un valor de margen o margen de un elemento en píxeles y como entero usando jQuery?

Mi primera idea fue hacer lo siguiente:

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

Pero si el relleno se da en ems, por ejemplo, ¿cómo puedo obtener el valor en píxeles?


Al examinar el complemento JSizes sugerido por Chris Pebble, me di cuenta de que mi propia versión era la correcta :). jQuery devuelve siempre el valor en píxeles, por lo que solo analizarlo como entero fue la solución.

Gracias a Chris Pebble e Ian Robinson

Malik Amurlayev
fuente
¿Puede elegir una respuesta entre las respuestas disponibles a continuación?
Wes Modes
44
Una nota para las personas en este hilo: siempre especifique radix cuando lo use parseInt. Citando MDN: " radix Un int entre 2 y 36 que representa la raíz (la base en los sistemas de numeración matemática) de la cadena mencionada anteriormente. Especifique 10 para el sistema de numeración decimal. Siempre especifique este parámetro para eliminar la confusión del lector y garantizar un comportamiento predecible . Las diferentes implementaciones producen resultados diferentes cuando no se especifica una raíz, por lo general, el valor predeterminado es 10. " Ver: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
dgellow

Respuestas:

226

Debería poder usar CSS ( http://docs.jquery.com/CSS/css#name ). Es posible que deba ser más específico, como "padding-left" o "margin-top".

Ejemplo:

CSS

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

JS

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

El resultado es 10px.

Si desea obtener el valor entero, puede hacer lo siguiente:

parseInt($("a").css("margin-top"))
Ian Robinson
fuente
55
No he comprobado si el método jQuery realmente devuelve el sufijo "px" o no, sin embargo, el JSizescomplemento de la otra respuesta (que terminé usando) devuelve un número entero cuando se pasa el valor devuelto ParseInt(...), solo para su información.
Dan Herbert el
12
FYI: jQuery agrega el 'px', por lo que la solución de Ian funciona y también devolverá un número entero cuando se pase a parseInt () - y no requiere un complemento:parseInt($('a').css('margin-top').replace('px', ''))
Peter Rust
56
parseInt es más rápido que reemplazar ('px', '') en un 49% en chrome jsperf.com/replace-vs-parseint
Banco
17
Si el relleno / margen se expresa como em o pt en el CSS, ¿ .css()aún devolverá el valor con "px" al final?
ingrediente_15939
22
@ ingrediente_15939 - Solo lo probé y sí; calcula el valor de píxel real y lo devuelve con px. Lo mismo para los anchos de borde. Vieja pregunta lo sé, pero ya que nadie respondió a su pregunta, pensé que lo haría para ayudar a otros que llegan tarde ...
Whelkaholism
79

Compare la altura / anchura exterior e interior para obtener el margen total y el relleno:

var that = $("#myId");
alert(that.outerHeight(true) - that.innerHeight());
svinto
fuente
gran consejo! Me ayudó a salir
Abe Petrillo
1
no me di cuenta de la altura externa existente. ¡Muchas gracias!
AlexMorley-Finch
66
Recuerde que exterior Ancho / Altura también incluye anchos de borde
electrichead
77
innertWidth / innerHeight también incluye relleno en sus cálculos, para obtener el ancho / alto sin relleno, debe usar .width () y .height (). api.jquery.com/innerWidth api.jquery.com/width api.jquery.com/outerWidth
Andrew Ensley
2
that.outerHeight(true) - that.outerHeight()daría los márgenes verticales totales, porque outsideHeight () incluiría rellenos y bordes pero excluiría los márgenes. Ver api.jquery.com/outerWidth/ .
Aximili
35

La función parseInt tiene un parámetro "radix" que define el sistema de numeración utilizado en la conversión, por lo que llamar parseInt(jQuery('#something').css('margin-left'), 10);devuelve el margen izquierdo como un entero.

Esto es lo que usa JSizes.

guigouz
fuente
3
Gracias por esto, odio tener que incluir complementos para pequeñas piezas de funcionalidad.
Brian
2
Ni siquiera necesita pasar la "raíz", ya que su valor predeterminado es 10.
Alexander Bird
55
Tenga en cuenta que parseInt puede devolver NaN (que a su vez hace que los cálculos basados ​​en esa variable fallen) - ¡agregue un cheque isNaN después! Caso de ejemplo: parseInt('auto', 10);( autoes válido margin-left).
Thomas
@sethAlexanderBird es correcto al afirmar que la raíz tendrá un valor predeterminado de 10, sin embargo, si la alineación de código es importante para usted (y probablemente debería serlo) jsLint y jsHint le graznarán si lo deja fuera.
Greg
30

¡NO cargue otra biblioteca solo para hacer algo que ya está disponible de forma nativa!

.css()Para empezar, jQuery's convierte% 'sy em a su equivalente en píxeles, y parseInt()eliminará 'px'el final de la cadena devuelta y lo convertirá en un entero:

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

Así es como puede obtener las dimensiones circundantes:

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

Tenga en cuenta que cada variable, paddingTopBottompor ejemplo, contiene la suma de los márgenes en ambos lados del elemento; es decir, paddingTopBottom == paddingTop + paddingBottom. Me pregunto si hay una manera de obtenerlos por separado. Por supuesto, si son iguales, puedes dividir por 2 :)

FireAphis
fuente
verdadero = incluir margen. +1000 internets
glifo
Esta es la mejor solución porque también funciona IE 7. Ver: stackoverflow.com/questions/590602/…
Leniel Maccaferri
9

Esta simple función lo hará:

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

Uso:

var padding = $('#myId').pixels('paddingTop');
mpen
fuente
3
no tiene en cuenta auto, inherity %los valores
Thomas
3
@Thomas: No es cierto. jsfiddle.net/nXyFN jQuery parece devolver el resultado en píxeles, siempre.
mpen
44
@ Mark jsfiddle.net/BNQ6S IE7: NaNdepende del navegador. Hasta donde yo sé, jQuery no se normaliza a .css()diferencia de .width()&.height()
Thomas
1
@Thomas: Interesante. La solución de Ian (mejor calificada) también tiene el mismo problema. La solución de Svinto es probablemente la mejor.
mpen
9

Parse int

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

devuelve 0 para 0px

a53-416
fuente
9

Simplemente puede tomarlos como con cualquier atributo CSS :

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

Puede configurarlos con un segundo atributo en el método css:

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

EDITAR: si solo necesita el valor de píxel, use parseInt(val, 10):

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

ok solo para responder la pregunta original:

puede obtener el relleno como un entero utilizable como este:

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

Si ha definido otra medida como px, simplemente reemplace "ems" con "px". parseInt interpreta el stringpart como un valor incorrecto, por lo que es importante reemplazarlo con ... nada.

EeKay
fuente
2

También puede extender el marco jquery usted mismo con algo como:

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

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

Agregando así una función en sus objetos jquery llamada margin (), que devuelve una colección como la función offset.

fx.

$("#myObject").margin().top
cralexns
fuente
2
Desafortunadamente, esto no le da los márgenes superior e izquierdo, sino más bien los márgenes verticales y horizontales totales
Code Commander el
Sin embargo, podría editarse utilizando la función parseInt en una de las otras soluciones para permitir una función de margen de aparición más uniforme
Brian
1

No use string.replace ("px", ""));

Utilice parseInt o parseFloat!

RubbelDeCatc
fuente
0

No para necro, pero hice esto que puede determinar los píxeles en función de una variedad de valores:

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

De esta manera, tenemos en cuenta el tamaño y el auto / herencia.

Nijikokun
fuente
Tenga en cuenta que parseInt()está mal, el ancho o la altura pueden ser puntos flotantes.
Alexis Wilke