Đệm hoặc giá trị lề theo pixel dưới dạng số nguyên bằng jQuery


207

jQuery có các hàm height () en width () trả về chiều cao hoặc chiều rộng tính bằng pixel dưới dạng số nguyên ...

Làm cách nào tôi có thể nhận được giá trị đệm hoặc giá trị lề của một phần tử bằng pixel và dưới dạng số nguyên bằng jQuery?

Ý tưởng đầu tiên của tôi là làm như sau:

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

Nhưng nếu phần đệm được đưa ra trong ví dụ như vậy, làm thế nào tôi có thể nhận được giá trị bằng pixel?


Nhìn vào plugin JSizes được đề xuất bởi Chris Pebble tôi nhận ra rằng phiên bản của riêng tôi là đúng :). jQuery trả về giá trị luôn bằng pixel, vì vậy chỉ cần phân tích cú pháp thành số nguyên là giải pháp.

Cảm ơn Chris Pebble và Ian Robinson


Bạn có thể vui lòng chọn một câu trả lời trong số các câu trả lời dưới đây không?
Wes Modes

4
Một lưu ý cho những người trong chủ đề này: luôn chỉ định cơ số khi bạn sử dụng parseInt. Trích dẫn MDN: " radix Một int từ 2 đến 36 đại diện cho cơ số (cơ sở trong các hệ thống số toán học) của chuỗi đã đề cập ở trên. Chỉ định 10 cho hệ thống số thập phân. Luôn chỉ định tham số này để loại bỏ sự nhầm lẫn của người đọc và để đảm bảo hành vi có thể dự đoán được Việc triển khai khác nhau tạo ra kết quả khác nhau khi cơ số không được chỉ định, thường mặc định giá trị là 10. " Xem: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/
mẹo

Câu trả lời:


226

Bạn sẽ có thể sử dụng CSS ( http://docs.jquery.com/CSS/css#name ). Bạn có thể phải cụ thể hơn, chẳng hạn như "padding-left" hoặc "margin-top".

Thí dụ:

CSS

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

Mã não

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

Kết quả là 10px.

Nếu bạn muốn lấy giá trị nguyên, bạn có thể làm như sau:

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

5
Tôi chưa kiểm tra xem phương thức jQuery có thực sự trả về hậu tố "px" hay không, tuy nhiên, JSizesplugin từ câu trả lời khác (mà tôi đã kết thúc sử dụng) trả về một số nguyên khi giá trị trả về được chuyển vào ParseInt(...), chỉ là FYI.
Dan Herbert

12
FYI: jQuery không thêm 'px', vì vậy giải pháp của Ian hoạt động và cũng sẽ trả về một số nguyên khi được chuyển vào parseInt () - và nó không yêu cầu plugin:parseInt($('a').css('margin-top').replace('px', ''))
Peter Rust

56
parseInt nhanh hơn thay thế ('px', '') 49% trên chrome jsperf.com/replace-vs-parseint
Ngân hàng

17
Nếu phần đệm / lề được thể hiện dưới dạng em hoặc pt trong CSS, cuối cùng .css()vẫn trả về giá trị với "px" chứ?
thành

22
@ thành phần_15939 - Chỉ cần thử nó và có; nó tính toán giá trị pixel thực tế và trả về với px. Tương tự cho chiều rộng đường viền. Tôi biết câu hỏi cũ, nhưng vì không ai trả lời câu hỏi của bạn, tôi nghĩ tôi sẽ làm điều đó để giúp những người đến sau khác ...
Whelkaholism

79

So sánh chiều cao / chiều rộng bên ngoài và bên trong để có được tổng lề và phần đệm:

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

mẹo tuyệt vời! Giúp tôi ra
Abe Petrillo

1
tôi đã không nhận ra bên ngoài Hightight Existed. Cảm ơn rât nhiều!
AlexMorley-Finch

6
Tuy nhiên, hãy nhớ rằng ngoàiWidth / Chiều cao bao gồm cả chiều rộng đường viền
electrichead

7
innertWidth / InternalHeight cũng bao gồm phần đệm trong tính toán của họ, để có được chiều rộng / chiều cao mà không cần phần đệm, bạn cần sử dụng. thong () và .height (). api.jquery.com/innerWidth api.jquery.com/ thong api.jquery.com/outerWidth
Andrew

2
that.outerHeight(true) - that.outerHeight()sẽ đưa ra tổng số lề dọc, bởi vì ngoàiHeight () sẽ bao gồm phần đệm và đường viền nhưng không bao gồm lề. Xem api.jquery.com/outerWidth/ .
Aimumili

35

Chức năng parseInt có một "cơ số" tham số trong đó xác định các hệ thống số sử dụng trên chuyển đổi, cho nên gọi parseInt(jQuery('#something').css('margin-left'), 10);trở về lề trái như một Integer.

Đây là những gì mà JSizes sử dụng.


3
Cảm ơn vì điều này, tôi ghét phải bao gồm các plugin cho các phần nhỏ của chức năng.
Brian

2
Bạn thậm chí không cần phải vượt qua "cơ số" vì nó mặc định là 10.
Alexander Bird

5
Xin lưu ý rằng parseInt có thể trả về NaN (sau đó lần lượt thực hiện các phép tính dựa trên biến đó) - thêm kiểm tra isNaN sau đó! Ví dụ trường hợp: parseInt('auto', 10);( autolà hợp lệ margin-left).
Thomas

@sethAlexanderBird chính xác của bạn khi tuyên bố rằng cơ số sẽ mặc định là 10, tuy nhiên nếu việc linting mã là quan trọng đối với bạn (và có lẽ nó nên) jsLint và jsHint sẽ vặn vẹo bạn nếu bạn bỏ nó đi.
Greg

30

Xin đừng tải thư viện khác chỉ để làm một cái gì đó vốn đã có sẵn!

jQuery .css()chuyển đổi% 's và em thành pixel của chúng tương đương với bắt đầu bằng và parseInt()sẽ loại bỏ 'px'phần cuối của chuỗi được trả về và chuyển đổi nó thành một số nguyên:

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

Đây là cách bạn có thể có được các dimentions xung quanh:

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

Hãy chú ý rằng mỗi biến, paddingTopBottomví dụ, chứa tổng các lề trên cả hai mặt của phần tử; ví dụ paddingTopBottom == paddingTop + paddingBottom. Tôi tự hỏi nếu có một cách để có được chúng một cách riêng biệt. Tất nhiên, nếu chúng bằng nhau, bạn có thể chia cho 2 :)


đúng = bao gồm lề. +1000 internets
glyph

Đây là giải pháp tốt nhất vì nó cũng hoạt động IE 7. Xem: stackoverflow.com/questions/590602/
Mạnh

9

Hàm đơn giản này sẽ làm điều đó:

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

Sử dụng:

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

3
không tính đến auto, inherit%giá trị
Thomas

3
@Thomas: Không đúng. jsfiddle.net/nXyFN jQuery dường như luôn trả về kết quả bằng pixel.
mpen

4
@ Mark jsfiddle.net/BNQ6S IE7: NaN, nó phụ thuộc vào trình duyệt. Theo như tôi biết thì jQuery không bình thường hóa .css()không giống như .width()&.height()
Thomas

1
@Thomas: Thú vị. Giải pháp của Ian (được xếp hạng hàng đầu) cũng có cùng một vấn đề. giải pháp của Svinto có lẽ là tốt nhất.
mở

9

Phân tích cú pháp

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

trả về 0 cho 0px


9

Bạn chỉ có thể lấy chúng như với bất kỳ thuộc tính CSS nào :

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

Bạn có thể đặt chúng với thuộc tính thứ hai trong phương thức css:

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

EDIT: Nếu bạn chỉ cần giá trị pixel, hãy sử dụng parseInt(val, 10):

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

3

ok chỉ để trả lời câu hỏi ban đầu:

bạn có thể lấy phần đệm dưới dạng số nguyên có thể sử dụng như thế này:

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

Nếu bạn đã xác định một phép đo khác như px, chỉ cần thay thế "ems" bằng "px". parseInt diễn giải chuỗi thành một giá trị sai vì vậy điều quan trọng là thay thế nó bằng ... không có gì.


2

Bạn cũng có thể tự mở rộng khung jquery bằng một cái gì đó như:

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

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

Do đó, thêm một hàm trên các đối tượng jquery của bạn được gọi là lề (), trả về một bộ sưu tập như hàm bù.

fx.

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

2
Thật không may, điều này không mang lại cho bạn tỷ suất lợi nhuận cao nhất và bên trái, mà thay vào đó là tỷ suất lợi nhuận toàn phần và tổng số ngang
Bộ chỉ huy mã

Tuy nhiên, nó có thể được chỉnh sửa bằng hàm parseInt trong một trong các giải pháp khác để cho phép hàm lề xuất hiện liền mạch hơn
Brian

1

Đừng sử dụng string.replace ("px", ""));

Sử dụng parseInt hoặc parseFloat!




0

Không phải là hoại tử nhưng tôi đã thực hiện điều này có thể xác định pixel dựa trên nhiều giá trị khác nhau:

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

Bằng cách này, chúng tôi tính đến kích thước và tự động / kế thừa.


Lưu ý parseInt()là sai, chiều rộng hoặc chiều cao có thể là các điểm nổi.
Alexis Wilke
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.