รับค่าเปอร์เซ็นต์ของกฎ CSS ใน jQuery


99

สมมติว่ากฎมีดังนี้:

.largeField {
    width: 65%;
}

มีวิธีเอาคืน '65% 'บ้างไหมและไม่ใช่ค่าพิกเซล?

ขอบคุณ.

แก้ไข:แต่น่าเสียดายที่ใช้วิธีการ DOM จะไม่น่าเชื่อถือในกรณีของฉันที่ฉันมีสไตล์ชีตซึ่งการนำเข้าสไตล์ชีตอื่น ๆ และเป็นผลให้cssRulesพารามิเตอร์ปลายขึ้นกับทั้งnullหรือไม่ได้กำหนดค่า

อย่างไรก็ตามวิธีนี้จะใช้ได้ผลในกรณีที่ตรงไปตรงมาที่สุด (สไตล์ชีตเดียวการประกาศสไตล์ชีตแยกกันหลายรายการภายในแท็กหัวของเอกสาร)


1
จะเป็นการดีที่สุดที่จะสร้างข้อมูลนี้ในองค์ประกอบนั้นเองแล้วติดตามว่าจะเปลี่ยนแปลงอย่างไรในอนาคต
Travis J

คำตอบ:


51

ไม่มีทางในตัวฉันกลัว คุณสามารถทำสิ่งนี้:

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

19
เพื่อให้ชัดเจนสิ่งนี้ไม่ได้บอกคุณค่าในสไตล์ของคุณ แต่จะให้ค่าที่คำนวณได้
Anthony Johnston

2
@shevski ใช้งานได้ดีคุณต้องเพิ่มลงclass="largeField"ในช่วงขณะนี้คุณกำลังเลือกชุดว่าง
Adam Lassek

ฉันรู้ว่าอะไรไม่ได้ผลและนั่นคือเหตุผลว่าทำไมมันถึงเป็นตัวอย่าง
shevski

2
@shevski ตัวอย่างของฉันให้ค่าที่คำนวณได้ขององค์ประกอบที่มีอยู่ในหน้าดังที่ Anthony ได้ชี้ให้เห็นเมื่อปีที่แล้ว ความคิดเห็นของคุณไม่จำเป็น
Adam Lassek

@AdamLassek, Anthony ไม่ได้บอกว่ามันมีอยู่จริงมากที่สุด
shevski

116

วิธีที่ง่ายที่สุด

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

// >>> "65%"

51
หมายเหตุ: สิ่งนี้จะใช้ได้เฉพาะกับ css ที่ใช้กับองค์ประกอบโดยตรงเท่านั้น (เช่นstyle="width:65%")
brianreavis

3
เยี่ยมมาก !! หากต้องการส่งคืนเพียงตัวเลข: parseInt ($ ('. largeField') [0] .style.width, 10);
Tiago

4
Tiago คุณสามารถใช้ parseFloat () ได้
Gavin

สิ่งนี้ใช้ได้เฉพาะกับการจัดแต่งทรงผมแบบอินไลน์ตามที่ @brianreavis กล่าว
Akansh

84

เป็นไปได้แน่นอนที่สุด!

ก่อนอื่นคุณต้องซ่อน () องค์ประกอบหลัก วิธีนี้จะป้องกันไม่ให้ JavaScript คำนวณพิกเซลสำหรับองค์ประกอบลูก

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

เห็นของฉัน ตัวอย่างเช่น

ตอนนี้ ... ฉันสงสัยว่าฉันจะค้นพบแฮ็คนี้ก่อนไหม :)

อัปเดต:

หนึ่งในสายการบิน

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

มันจะทิ้งองค์ประกอบที่ซ่อนไว้ก่อนหน้าไฟล์ </body>.remove()แท็กซึ่งคุณอาจต้องการ

ดูไฟล์ ตัวอย่างซับเดียว

ฉันเปิดรับแนวคิดที่ดีกว่า!


1
นี่ควรเป็นทางออกที่ได้รับการยอมรับ ฉันสามารถยืนยันได้ด้วยว่าคำตอบอื่น ๆ ไม่ได้รับค่าเปอร์เซ็นต์ที่กำหนดไว้ในตอนแรก
EricP

1
เพื่อหลีกเลี่ยงการกะพริบให้โคลนเด็กซ่อนพาเรนต์จากนั้นดึงความกว้าง var clone = $ ('. child'). clone ();
user1491819

3
อัปเดต: ฟังก์ชัน getCssWidth (childSelector) {return jQuery (childSelector) .parent (). clone (). hide (). find (childSelector) .width (); } console.log ('child width:' + getCssWidth ('. child')) ;;
user1491819

1
ทางออกที่ยอดเยี่ยม! นี่คือ pure-js ที่เทียบเท่ากับสคริปต์jsfiddle.net/Sjeiti/2qkftdjd
Sjeiti

1
ถ้าคำตอบ $ (... ) [0] .style.width ใช้งานได้ก็ไม่น่าจะเป็นทางออกที่ยอมรับได้ โซลูชันนี้ในขณะที่สวยงาม แต่ก็ประสบปัญหาด้านประสิทธิภาพบางประการ
Mihai Danila

45

คุณสามารถเข้าถึงdocument.styleSheetsวัตถุ:

<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 การใช้วิธี DOM อย่างเหมาะสม (บางครั้ง jQuery ไม่ใช่คำตอบ)
bobince

1
+1 ฉันอยู่กับคุณเพื่อความถูกต้อง ฉันสงสัยว่าแต่ละเบราว์เซอร์สนับสนุนสิ่งนี้อย่างไร แต่นี่คือคำตอบที่ถูกต้อง
cgp

ทำงานได้ดีในกรณีที่ง่ายกว่าทั้ง FF และ IE7 แต่ไม่ใช่สำหรับฉัน (ดูแก้ไขด้านบน)
montrealist

1
คุณเคยลองใช้สไตล์ชีททั้งหมดด้วยหรือไม่? ตัวอย่างของฉันเพิ่งใช้ครั้งแรก ( styleSheets[0])
Gumbo

ขออภัยหากนี่เป็นคำถาม noob แต่จะได้for (var i=0; rules.length; i++)ผลอย่างไร? มันไม่ควรจะเป็นfor (var i=0; i<rules.length; i++)
sbichenko

18

ช่วงปลาย แต่สำหรับผู้ใช้ใหม่ให้ลองทำเช่นนี้หากสไตล์ css มีเปอร์เซ็นต์ :

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

ใช้งานได้อย่างมีเสน่ห์สำหรับขนาดตัวอักษร css $ element.prop ('style') ['font-size];
Jason

10

ปลั๊กอิน jQuery ตามคำตอบของ 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());​​​​​

จะคืนค่า '65% ' ส่งคืนเฉพาะตัวเลขที่ปัดเศษเท่านั้นเพื่อให้ทำงานได้ดีขึ้นหากคุณต้องการ (width == '65%') หากคุณจะใช้คำตอบของ Adams โดยตรงนั่นไม่ได้ผล (ฉันมีบางอย่างเช่น 64.93288590604027) :)


3

จากโซลูชันที่ยอดเยี่ยมและน่าประหลาดใจของ Timofey นี่คือการใช้งาน Javascript ที่แท้จริง:

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

หวังว่าจะเป็นประโยชน์กับใครบางคน


ข้อผิดพลาดทางไวยากรณ์คุณลืม{ในตอนท้ายของบรรทัดแรก
Akansh

เฉพาะโซลูชันนี้เท่านั้นที่แสดง 'อัตโนมัติ' อย่างถูกต้องเมื่อไม่ได้ตั้งค่าความกว้างสำหรับ div jquery css ('width') จะส่งกลับ '0px' คำตอบอื่น ๆ ทั้งหมดไม่ถูกต้อง ...
Alexey Obukhov

1

ฉันมีปัญหาที่คล้ายกันในการรับค่าของสไตล์ชีทส่วนกลางใน jQueryในที่สุดฉันก็หาวิธีแก้ปัญหาเดียวกันกับด้านบนการแก้ปัญหาเดียวกับข้างต้น

แค่ต้องการเชื่อมโยงคำถามทั้งสองข้อเพื่อให้ผู้อื่นได้รับประโยชน์จากการค้นพบในภายหลัง


2
คำถามของคุณและคำถามนี้เชื่อมโยงกันแล้ว (ดูแถบด้านข้าง“ ลิงก์” ทางด้านขวา) โดยอาศัยความคิดเห็นของ shesek ในคำถามของคุณ
Chris Johnsen

1

แปลงจากพิกเซลเป็นเปอร์เซ็นต์โดยใช้การคูณไขว้แปลงจากพิกเซลสัดส่วนการใช้บัญญัติไตรยางศ์

การตั้งค่าสูตร:

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

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

รหัสจริง:

<script>

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

</script>

0

คุณสามารถใส่สไตล์ที่คุณต้องการเข้าถึงด้วย jQuery ใน:

  1. ส่วนหัวของเอกสารโดยตรง
  2. ในการรวมซึ่งสคริปต์ฝั่งเซิร์ฟเวอร์จะใส่ไว้ในส่วนหัว

จากนั้นควรเป็นไปได้ (แม้ว่าจะไม่ใช่เรื่องง่าย) ในการเขียนฟังก์ชัน js เพื่อแยกวิเคราะห์ทุกอย่างภายในแท็กสไตล์ในส่วนหัวเอกสารและส่งคืนค่าที่คุณต้องการ


0

ไม่มีอะไรใน jQuery และไม่มีอะไรตรงไปตรงมาแม้แต่ในจาวาสคริปต์ จากคำตอบของ Timofey และดำเนินการกับมันฉันสร้างฟังก์ชันนี้ขึ้นมาเพื่อให้ได้คุณสมบัติที่คุณต้องการ:

// 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
}

-1

คุณสามารถใช้ฟังก์ชัน css (width) เพื่อส่งกลับความกว้างปัจจุบันขององค์ประกอบ

กล่าวคือ.

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

ดูเพิ่มเติมที่: http://api.jquery.com/width/ http://api.jquery.com/css/


เหตุใดจึงถูกทำเครื่องหมายลง มีข้อผิดพลาดเปิดอยู่ในbugs.jquery.com/ticket/4772นี้ดูเหมือนว่าจะมีความไม่สอดคล้องกันในการเรียกสิ่งนี้ขึ้นอยู่กับว่าคุณใส่สไตล์ของคุณแบบอินไลน์หรือในสไตล์ชีตjsfiddle.net/boushley/MSyqR/2
Anthony Johnston

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