jQuery에서 CSS 규칙의 백분율 값 가져 오기


98

규칙이 다음과 같다고 가정 해 보겠습니다.

.largeField {
    width: 65%;
}

픽셀 값이 아니라 어떻게 든 '65 % '를 되 찾는 방법이 있습니까?

감사.

편집 : 불행히도 다른 스타일 시트를 가져 오는 스타일 시트가 있고 결과적으로 cssRules 매개 변수가 null 또는 정의되지 않은 값으로 끝나기 때문에 내 경우에는 DOM 메서드를 사용하는 것이 신뢰할 수 없습니다 .

그러나이 방법은 대부분의 간단한 경우에서 작동합니다 (하나의 스타일 시트, 문서 의 head 태그 내부에 여러 개의 개별 스타일 시트 선언 ).


1
이 데이터를 요소 자체에 시드 한 다음 향후 어떻게 변경되는지 추적하는 것이 가장 좋습니다.
Travis J

답변:


51

내장 된 방법은 없습니다. 다음과 같이 할 수 있습니다.

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

19
단지 명확하게하기 위해, 이것은 당신에게 계산 된 값을 제공합니다, 당신에게 당신의 스타일의 값을 말하지 않는다
안토니 존스턴을

2
@shevski 잘 작동 class="largeField"하며 범위 에 추가 해야하며 현재 빈 세트를 선택하고 있습니다.
Adam Lassek

나는 그것이 작동하지 않는 것이 무엇인지 알고 있으며 그것이 반례 인 이유입니다.
shevski

2
@shevski 내 예제는 Anthony가 이미 1 년 전에 지적했듯이 페이지에있는 기존 요소의 계산 된 값을 제공합니다. 귀하의 의견은 불필요합니다.
Adam Lassek

@AdamLassek, Anthony는 그것이 가장 많이 존재한다고 말하지 않았습니다.
shevski 2012-01-31

116

가장 쉬운 방법

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

// >>> "65%"

50
참고 : 이것은 요소에 직접 적용된 CSS에서만 작동합니다 (예 :) style="width:65%".
brianreavis

3
큰!! 숫자 만 반환하려면 : parseInt ($ ( '. largeField') [0] .style.width, 10);
Tiago 2013 년

4
Tiago, parseFloat ()를 사용할 수 있습니다.
개빈

이것은 @brianreavis가 말한 것처럼 인라인 스타일에서만 작동합니다.
Akansh

84

이것은 확실히 가능합니다!

먼저 부모 요소를 hide ()해야합니다. 이렇게하면 자바 스크립트가 하위 요소의 픽셀을 계산하지 못합니다.

$('.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 2013

1
깜박임을 방지하려면 자식을 복제하고 부모를 숨긴 다음 너비를 검색합니다. var clone = $ ( '. child'). clone ();
user1491819

3
업데이트 : function getCssWidth (childSelector) {return jQuery (childSelector) .parent (). clone (). hide (). find (childSelector) .width (); } console.log ( 'child width :'+ getCssWidth ( '. child')) ;;
user1491819

1
굉장한 솔루션! 다음은 스크립트의 해당하는 순수 JS의 jsfiddle.net/Sjeiti/2qkftdjd
Sjeiti

1
$ (...) [0] .style.width 대답이 작동하면 허용되는 솔루션이 아니어야합니까? 이 솔루션은 우아하지만 성능상의 단점이 있습니다.
Mihai Danila

44

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 2009-04-14

FF와 IE7 모두 간단한 경우에 잘 작동하지만 나에게는 적합하지 않습니다 (위의 편집 참조).
몬트리올

1
모든 스타일 시트를 살펴 보셨나요? 내 예제는 첫 번째 ( styleSheets[0])를 사용했습니다 .
Gumbo

이것이 멍청한 질문이라면 미안하지만 어떻게 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

Adams 답변을 기반으로 한 jQuery 플러그인 :

(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 % '를 반환합니다. if (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의 너비가 설정되지 않은 경우 'auto'를 올바르게 표시하고 jquery css ( 'width')는 '0px'를 반환합니다. 모든 다른 답변 잘못된 ...
알렉세이 오 벅홉

1

jQuery에서 전역 스타일 시트 값 가져 오기 에서 비슷한 문제가 발생하여 결국 위와 동일한 솔루션을 생각해 냈습니다 .

다른 사람들이 나중에 발견 한 내용을 활용할 수 있도록 두 질문을 교차 연결하고 싶었습니다.


2
귀하의 질문과이 질문은 귀하의 질문에 대한 shesek의 의견으로 인해 이미 연결되어 있습니다 (오른쪽의 "연결됨"사이드 바 참조).
Chris Johnsen 2011-08-20

0

jQuery로 액세스하는 데 필요한 스타일을 다음 중 하나에 넣을 수 있습니다.

  1. 문서의 머리를 직접
  2. 포함, 서버 측 스크립트가 헤드에 넣습니다.

그런 다음 문서 헤드의 스타일 태그 내 모든 것을 구문 분석하고 필요한 값을 반환하는 js 함수를 작성하는 것이 가능해야합니다 (반드시 쉽지는 않음).


0

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 존스턴

1
나는이 함께 %를 얻을 캔트
someoneuseless

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
}

0

교차 곱셈을 사용하여 픽셀에서 백분율로 변환합니다 .

공식 설정 :

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>
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.