nhận giá trị phần trăm của quy tắc CSS trong jQuery


98

Giả sử quy tắc như sau:

.largeField {
    width: 65%;
}

Có cách nào để lấy lại '65% ', chứ không phải giá trị pixel không?

Cảm ơn.

CHỈNH SỬA: Rất tiếc, việc sử dụng các phương thức DOM là không đáng tin cậy trong trường hợp của tôi, vì tôi có một biểu định kiểu nhập các biểu định kiểu khác và kết quả là tham số cssRules kết thúc bằng giá trị null hoặc không xác định .

Tuy nhiên, cách tiếp cận này sẽ hoạt động trong hầu hết các trường hợp đơn giản (một biểu định kiểu, nhiều khai báo biểu định kiểu riêng biệt bên trong thẻ head của tài liệu).


1
Tốt nhất là nên gieo dữ liệu này trên chính phần tử và sau đó theo dõi cách nó thay đổi trong tương lai.
Travis J

Câu trả lời:


51

Tôi e rằng không có cách nào được xây dựng sẵn. Bạn có thể làm điều gì đó như sau:

var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';

19
chỉ để được rõ ràng, điều này không cho bạn biết giá trị trong phong cách của bạn, nó mang lại cho bạn một giá trị tính
Anthony Johnston

2
@shevski nó hoạt động tốt, bạn phải thêm class="largeField"vào khoảng thời gian, hiện tại bạn đang chọn một tập hợp trống.
Adam Lassek

Tôi biết những gì không hoạt động trong đó và đó là lý do tại sao nó là một ví dụ ngược lại.
shevski

2
@shevski Ví dụ của tôi cung cấp giá trị được tính toán của một phần tử hiện có trên trang, như Anthony đã chỉ ra một năm trước. Ý kiến ​​của bạn là thừa.
Adam Lassek

@AdamLassek, Anthony không nói rằng nó tồn tại nhiều nhất.
shevski,

116

Cách dễ dàng nhất

$('.largeField')[0].style.width

// >>> "65%"

50
Chỉ cần lưu ý: điều này sẽ chỉ hoạt động với css được áp dụng trực tiếp trên phần tử (ví dụ style="width:65%":).
brianreavis

3
Tuyệt quá!! Để chỉ trả về các số: parseInt ($ ('. LargeField') [0] .style.width, 10);
Tiago

4
Tiago, bạn chỉ có thể sử dụng parseFloat ().
Gavin

Điều này chỉ hoạt động trong kiểu nội tuyến như @brianreavis đã nói.
Akansh

84

Điều này chắc chắn là có thể!

Đầu tiên bạn phải ẩn () phần tử cha. Điều này sẽ ngăn JavaScript tính toán pixel cho phần tử con.

$('.parent').hide();
var width = $('.child').width();
$('.parent').show();
alert(width);

Hãy xem ví dụ của tôi .

Bây giờ ... tôi tự hỏi liệu mình có phải là người đầu tiên phát hiện ra bản hack này không :)

Cập nhật:

Lót

element.clone().appendTo('body').wrap('<div style="display: none"></div>').css('width');

Nó sẽ để lại một phần tử ẩn trước </body>thẻ mà bạn có thể muốn .remove().

Xem ví dụ về một lớp lót .

Tôi cởi mở với những ý tưởng tốt hơn!


1
Đây phải là giải pháp được chấp nhận. Tôi cũng có thể xác nhận rằng nó phù hợp với tôi khi các câu trả lời khác không nhận được giá trị phần trăm được chỉ định ban đầu.
EricP

1
Để tránh nhấp nháy, hãy nhân bản con, ẩn phụ huynh, sau đó truy xuất chiều rộng. var clone = $ ('. con'). clone ();
user1491819

3
Cập nhật: function getCssWidth (childSelector) {return jQuery (childSelector) .parent (). Clone (). Hide (). Find (childSelector) .width (); } console.log ('child width:' + getCssWidth ('. child')) ;;
dùng1491819

1
Giải pháp tuyệt vời! Dưới đây là một tinh khiết-js tương đương với kịch bản jsfiddle.net/Sjeiti/2qkftdjd
Sjeiti

1
Nếu câu trả lời $ (...) [0] .style.width hoạt động, thì đó không phải là giải pháp được chấp nhận sao? Giải pháp này, trong khi thanh lịch, nhưng mắc phải một số thiếu sót về hiệu suất.
Mihai Danila

44

Bạn có thể truy cập document.styleSheetsđối tượng:

<style type="text/css">
    .largeField {
        width: 65%;
    }
</style>
<script type="text/javascript">
    var rules = document.styleSheets[0].rules || document.styleSheets[0].cssRules;
    for (var i=0; i < rules.length; i++) {
        var rule = rules[i];
        if (rule.selectorText.toLowerCase() == ".largefield") {
            alert(rule.style.getPropertyValue("width"));
        }
    }
</script>

8
+1 cách sử dụng phù hợp các phương thức DOM (đôi khi jQuery không phải là câu trả lời)
bobince

1
+1 Tôi ở đây với bạn cho chính xác. Tôi tò mò về cách mỗi trình duyệt hỗ trợ điều này, nhưng đây là câu trả lời đúng.
cgp

Hoạt động tốt trong các trường hợp đơn giản hơn, cả FF và IE7, nhưng không phải đối với tôi (xem EDIT ở trên).
montrealist

1
Bạn cũng đã thử chạy qua tất cả các bảng định kiểu chưa? Ví dụ của tôi chỉ sử dụng đầu tiên ( styleSheets[0]).
Gumbo

Xin lỗi nếu đây là một câu hỏi noob, nhưng làm thế nào sẽ for (var i=0; rules.length; i++)hoạt động? Không nênfor (var i=0; i<rules.length; i++)
sbichenko

18

Đã muộn, nhưng đối với những người dùng mới hơn, hãy thử điều này nếu kiểu css chứa phần trăm :

$element.prop('style')['width'];

Làm việc như một sự quyến rũ cho kích thước phông chữ css. $ element.prop ('style') ['font-size];
Jason

10

Một plugin jQuery dựa trên câu trả lời của Adams:

(function ($) {

    $.fn.getWidthInPercent = function () {
        var width = parseFloat($(this).css('width'))/parseFloat($(this).parent().css('width'));
        return Math.round(100*width)+'%';
    };

})(jQuery);

$('body').html($('.largeField').getWidthInPercent());​​​​​

Sẽ trả về '65% '. Chỉ trả về các số được làm tròn để hoạt động tốt hơn nếu bạn thích if (width == '65%'). Nếu bạn đã sử dụng câu trả lời trực tiếp của Adams, điều đó đã không hoạt động (tôi nhận được một cái gì đó giống như 64.93288590604027). :)


3

Được xây dựng dựa trên giải pháp tuyệt vời và đáng ngạc nhiên của timofey, đây là cách triển khai Javascript thuần túy:

function cssDimensions(element)
  var cn = element.cloneNode();
  var div = document.createElement('div');
  div.appendChild(cn);
  div.style.display = 'none';
  document.body.appendChild(div);
  var cs = window.getComputedStyle
    ? getComputedStyle(cn, null)
    : cn.currentStyle;
  var ret = { width: cs.width, height: cs.height };
  document.body.removeChild(div);
  return ret;
}

Hy vọng nó hữu ích cho ai đó.


một lỗi cú pháp, bạn quên {ở cuối dòng đầu tiên.
Akansh

chỉ giải pháp này hiển thị chính xác 'tự động' khi chiều rộng cho div không được đặt, jquery css ('chiều rộng') trả về '0px'. tất cả các câu trả lời khác không chính xác ...
Alexey Obukhov

1

Tôi gặp sự cố tương tự trong Lấy giá trị của biểu định kiểu toàn cục trong jQuery , cuối cùng tôi đã đưa ra giải pháp tương tự như trên .

Chỉ muốn liên kết chéo hai câu hỏi để những người khác có thể hưởng lợi từ những phát hiện sau này.


2
Câu hỏi của bạn và câu hỏi này đã được liên kết (xem thanh bên "Đã liên kết" ở bên phải) nhờ nhận xét của shesek về câu hỏi của bạn.
Chris Johnsen,

0

Bạn có thể đặt các kiểu bạn cần truy cập bằng jQuery vào:

  1. người đứng đầu tài liệu trực tiếp
  2. trong một bao gồm, tập lệnh phía máy chủ nào sau đó sẽ đưa vào đầu

Sau đó, có thể (mặc dù không nhất thiết phải dễ dàng) để viết một hàm js để phân tích cú pháp mọi thứ trong các thẻ kiểu trong phần đầu tài liệu và trả về giá trị bạn cần.


0

Bạn có thể sử dụng hàm css (width) để trả về chiều rộng hiện tại của phần tử.

I E.

var myWidth = $("#myElement").css("width");

Xem thêm: http://api.jquery.com/width/ http://api.jquery.com/css/


tại sao điều này được đánh dấu xuống? có một lỗi mở trên bug.jquery.com/ticket/4772 này , có vẻ như có một số điểm không nhất quán trong cách gọi này tùy thuộc vào việc bạn đặt kiểu nội tuyến hay trong một biểu định kiểu jsfiddle.net/boushley/MSyqR/2
Anthony Johnston

1
Tôi không thể nhận được% với điều này
nào đó

0

Không có gì trong jQuery và không có gì đơn giản ngay cả trong javascript. Lấy câu trả lời của timofey và chạy với nó, tôi đã tạo ra hàm này hoạt động để có được bất kỳ thuộc tính nào bạn muốn:

// gets the style property as rendered via any means (style sheets, inline, etc) but does *not* compute values
// domNode - the node to get properties for 
// properties - Can be a single property to fetch or an array of properties to fetch
function getFinalStyle(domNode, properties) {
    if(!(properties instanceof Array)) properties = [properties]

    var parent = domNode.parentNode
    if(parent) {
        var originalDisplay = parent.style.display
        parent.style.display = 'none'
    }
    var computedStyles = getComputedStyle(domNode)

    var result = {}
    properties.forEach(function(prop) {
        result[prop] = computedStyles[prop]
    })

    if(parent) {
        parent.style.display = originalDisplay
    }

    return result
}

0

Chuyển đổi từ pixel thành phần trăm bằng phép nhân chéo .

Thiết lập Công thức:

1.) (element_width_pixels / parent_width_pixels) = (element_width_percentage / 100)

2.) element_width_percentage = (100 * element_width_pixels) / parent_width_pixels

Mã thực tế:

<script>

   var $width_percentage = (100 * $("#child").width()) / $("#parent").width();

</script>
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.