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


¿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"))

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

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.


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

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


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

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


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

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.


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

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




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.


Tenga en cuenta que parseInt()está mal, el ancho o la altura pueden ser puntos flotantes.
Alexis Wilke
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.