Padding หรือค่ามาร์จิ้นเป็นพิกเซลเป็นจำนวนเต็มโดยใช้ jQuery


207

jQuery มีฟังก์ชั่น height () en width () ที่ส่งคืนความสูงหรือความกว้างเป็นพิกเซลเป็นจำนวนเต็ม ...

ฉันจะรับค่า padding หรือ margin ขององค์ประกอบเป็นพิกเซลและเป็นจำนวนเต็มโดยใช้ jQuery ได้อย่างไร

ความคิดแรกของฉันคือการทำต่อไปนี้:

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

แต่ถ้ามีการเว้นระยะห่างเป็น ems เช่นฉันจะรับค่าเป็นพิกเซลได้อย่างไร


เมื่อพิจารณาถึงปลั๊กอิน JSizes ที่ Chris Pebble แนะนำให้ฉันรู้ว่าเวอร์ชันของฉันเองนั้นเหมาะสมแล้ว :) jQuery คืนค่าเป็นพิกเซลเสมอดังนั้นการแยกวิเคราะห์เป็นจำนวนเต็มจึงเป็นวิธีแก้ปัญหา

ขอบคุณ Chris Pebble และ Ian Robinson


คุณกรุณาเลือกคำตอบจากคำตอบด้านล่างนี้ได้หรือไม่?
โหมด Wes

4
บันทึกไปยังคนในกระทู้นี้: เสมอระบุ Radix parseIntเมื่อคุณใช้ การอ้างอิง MDN: " radix int ระหว่าง 2 ถึง 36 ที่แสดงถึง radix (ฐานในระบบตัวเลขทางคณิตศาสตร์) ของสตริงที่กล่าวถึงข้างต้นระบุ 10 สำหรับระบบเลขฐานสิบระบุพารามิเตอร์นี้เสมอเพื่อกำจัดความสับสนของผู้อ่านและรับประกันพฤติกรรมที่คาดการณ์ได้การใช้งานที่แตกต่างกันจะให้ผลลัพธ์ที่แตกต่างกันเมื่อไม่ได้ระบุ Radix โดยปกติแล้วจะเป็นการกำหนดค่าเริ่มต้นให้เป็น 10 " ดู: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
......

คำตอบ:


226

คุณควรจะสามารถใช้ CSS ( http://docs.jquery.com/CSS/css#name ) คุณอาจต้องเจาะจงมากขึ้นเช่น "padding-left" หรือ "margin-top"

ตัวอย่าง:

CSS

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

JS

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

ผลลัพธ์ที่ได้คือ 10px

หากคุณต้องการรับค่าจำนวนเต็มคุณสามารถทำสิ่งต่อไปนี้:

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

5
ฉันไม่ได้ตรวจสอบว่าวิธีการ jQuery จริง ๆ แล้วส่งกลับคำต่อท้าย "px" หรือไม่ แต่JSizesปลั๊กอินจากคำตอบอื่น ๆ (ซึ่งฉันใช้โดยใช้) ส่งคืนจำนวนเต็มเมื่อส่งคืนค่าParseInt(...)เพียง FYI
Dan Herbert

12
FYI: jQuery เพิ่ม 'px' เพื่อให้โซลูชั่นของ Ian ทำงานและจะส่งคืนจำนวนเต็มเมื่อส่งผ่านไปยัง parseInt () - และไม่ต้องใช้ปลั๊กอิน:parseInt($('a').css('margin-top').replace('px', ''))
Peter Rust

56
parseInt เร็วกว่าการแทนที่ ('px', '') 49% สำหรับ chrome jsperf.com/replace-vs-parseint
ธนาคาร

17
หาก padding / margin ถูกแสดงเป็น em หรือ pt ใน CSS จะ.css()ยังคงส่งคืนค่าด้วย "px" ที่ส่วนท้ายหรือไม่
ingredients_15939

22
@ ingredients_15939 - ลองแล้วใช่ มันจะคำนวณค่าพิกเซลที่แท้จริงและส่งกลับด้วย px เช่นเดียวกับความกว้างชายแดน คำถามเก่า ๆ ที่ฉันรู้ แต่อย่างที่ไม่มีใครตอบคำถามของคุณฉันคิดว่าฉันจะทำมันเพื่อช่วยผู้มาที่อื่น ...
Whelkaholism

79

เปรียบเทียบความสูง / ความกว้างด้านนอกและด้านในเพื่อรับระยะขอบและการเติมเต็ม:

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

เคล็ดลับที่ดี! ช่วยฉันออก
Abe Petrillo

1
ฉันไม่ได้ตระหนักถึงความมีอยู่ภายนอก ขอบคุณมาก!
AlexMorley-Finch

6
โปรดจำไว้ว่า outerWidth / Height รวมความกว้างของเส้นขอบด้วย
electrichead

7
innertWidth / innerHeight ยังมีการเติมเต็มในการคำนวณเพื่อให้ได้ความกว้าง / ความสูงโดยไม่ต้องขยายคุณจำเป็นต้องใช้. bandwidth () และ. high () api.jquery.com/innerWidth api.jquery.com/width api.jquery.com/outerWidth
Andrew Ensley

2
that.outerHeight(true) - that.outerHeight()จะให้ระยะขอบแนวตั้งโดยรวมเพราะ outerHeight () จะรวมถึงช่องว่างภายในและเส้นขอบ แต่ไม่รวมระยะขอบ ดูapi.jquery.com/outerWidth/
Aximili

35

ฟังก์ชั่น parseInt มีพารามิเตอร์ "radix" ซึ่งกำหนดระบบตัวเลขที่ใช้ในการแปลงดังนั้นการโทรparseInt(jQuery('#something').css('margin-left'), 10);จะส่งคืนระยะขอบซ้ายเป็น Integer

นี่คือสิ่งที่ JSizes ใช้


3
ขอบคุณสำหรับสิ่งนี้ฉันเกลียดที่จะต้องมีปลั๊กอินสำหรับฟังก์ชั่นชิ้นเล็ก ๆ
Brian

2
คุณไม่จำเป็นต้องผ่าน "radix" เพราะมันเป็นค่าเริ่มต้นที่ 10
Alexander Bird

5
ระวังว่า parseInt สามารถคืน NaN (ซึ่งจะทำให้การคำนวณตามตัวแปรนั้นล้มเหลว) - เพิ่มการตรวจสอบ isNaN หลังจากนั้น! ตัวอย่างกรณี: parseInt('auto', 10);( autoถูกต้องmargin-left)
Thomas

@sethAlexanderBird คุณถูกต้องในการระบุว่า radix จะเริ่มต้นที่ 10 แต่ถ้ารหัส linting เป็นสิ่งสำคัญสำหรับคุณ (และมันควรจะเป็น) jsLint และ jsHint จะอวดคุณถ้าคุณปล่อยมันออกมา
Greg

30

โปรดอย่าไปโหลดไลบรารีอื่นเพื่อทำสิ่งที่มีอยู่แล้วโดยกำเนิด!

jQuery's .css()จะแปลง% และ em ของเป็นพิกเซลที่เทียบเท่าเพื่อเริ่มต้นด้วยและparseInt()จะลบ'px'ส่วนท้ายของสตริงที่ส่งคืนและแปลงเป็นจำนวนเต็ม:

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

นี่คือวิธีที่คุณจะได้รับมิติโดยรอบ:

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

paddingTopBottomตัวอย่างเช่นแต่ละตัวแปรมีผลรวมของระยะขอบทั้งสองด้านขององค์ประกอบ เช่นpaddingTopBottom == paddingTop + paddingBottom. ฉันสงสัยว่ามีวิธีแยกพวกเขาออกจากกันหรือไม่ แน่นอนถ้าพวกเขาเท่ากันคุณสามารถหารด้วย 2 :)


true = รวมส่วนต่าง +1000 internets
glyph

นี่เป็นทางออกที่ดีที่สุดเพราะยังใช้งานIE 7ได้ ดู: stackoverflow.com/questions/590602/…
Leniel Maccaferri

9

ฟังก์ชั่นที่เรียบง่ายนี้จะทำ:

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

การใช้งาน:

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

3
ไม่บัญชีสำหรับauto, inheritและ%ค่า
โทมัส

3
@Thomas: ไม่จริง jsfiddle.net/nXyFN jQuery ดูเหมือนจะส่งคืนผลลัพธ์เป็นพิกเซลเสมอ
mpen

4
@ Mark jsfiddle.net/BNQ6S IE7: NaNขึ้นอยู่กับเบราว์เซอร์ เท่าที่ฉันรู้ jQuery ไม่ได้ทำให้ปกติ.css()แตกต่างจาก.width()&.height()
Thomas

1
@Thomas: น่าสนใจ วิธีการแก้ปัญหาของเอียน (อันดับสูงสุด) มีปัญหาเดียวกันแล้ว วิธีแก้ปัญหาของ svinto น่าจะดีที่สุด
mpen


9

คุณสามารถคว้ามันได้ด้วยคุณสมบัติ CSS :

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

คุณสามารถตั้งค่าด้วยแอตทริบิวต์ที่สองในวิธี css:

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

แก้ไข: หากคุณต้องการเพียงแค่ค่าพิกเซลให้ใช้parseInt(val, 10):

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

3

ตกลงเพียงเพื่อตอบคำถามเดิม:

คุณสามารถรับช่องว่างภายในเป็นจำนวนเต็มที่ใช้งานเช่นนี้

var padding = parseInt ($ ("myId"). css ("padding-top"). แทนที่ ("ems", ""));

หากคุณได้กำหนดการวัดอื่นเช่น px ให้แทนที่ "ems" ด้วย "px" parseInt ตีความ stringpart ว่าเป็นค่าที่ไม่ถูกต้องดังนั้นจึงเป็นสิ่งสำคัญที่จะแทนที่ด้วย ... ไม่มีอะไร


2

คุณสามารถขยายกรอบ jquery ด้วยตัวเองดังนี้:

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

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

ดังนั้นการเพิ่มฟังก์ชั่นในวัตถุ jquery ของคุณที่เรียกว่า margin () ซึ่งจะส่งกลับคอลเลกชันเช่นฟังก์ชั่นชดเชย

FX

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

2
น่าเสียดายที่นี่ไม่ได้ให้ระยะขอบด้านบนและด้านซ้ายของคุณ แต่จะรวมระยะขอบแนวนอนและแนวนอนโดยรวม
โค้ดผู้บัญชาการ

อย่างไรก็ตามมันสามารถแก้ไขได้โดยใช้ฟังก์ชั่น parseInt ในหนึ่งในวิธีการแก้ปัญหาอื่น ๆ เพื่อให้ฟังก์ชั่นมาร์จิ้นปรากฏได้อย่างราบรื่นมากขึ้น
Brian




0

ไม่ใช่ไปที่ necro แต่ฉันทำสิ่งนี้ซึ่งสามารถกำหนดพิกเซลตามค่าที่หลากหลาย:

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

ด้วยวิธีนี้เราคำนึงถึงขนาดและ auto / สืบทอด


โปรดทราบว่าparseInt()ผิดความกว้างหรือความสูงสามารถเป็นจุดลอย
Alexis Wilke
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.