pobierz wartość procentową reguły CSS w jQuery

98

Powiedzmy, że reguła jest następująca:

.largeField {
    width: 65%;
}

Czy istnieje sposób, aby jakoś odzyskać „65%”, a nie wartość piksela?

Dzięki.

EDYCJA: Niestety używanie metod DOM jest zawodne w moim przypadku, ponieważ mam arkusz stylów, który importuje inne arkusze stylów, w wyniku czego parametr cssRules kończy się wartością null lub undefined .

Takie podejście zadziałałoby jednak w najprostszych przypadkach (jeden arkusz stylów, wiele oddzielnych deklaracji arkuszy stylów w tagu head dokumentu).

montrealista
źródło
1
Najlepiej byłoby wysiać te dane na samym elemencie, a następnie śledzić, jak zmieni się on w przyszłości.
Travis J

Odpowiedzi:

51

Obawiam się, że nie ma wbudowanej drogi. Możesz zrobić coś takiego:

var width = ( 100 * parseFloat($('.largeField').css('width')) / parseFloat($('.largeField').parent().css('width')) ) + '%';
Adam Lassek
źródło
19
żeby było jasne, to nie mówi ci wartości w twoim stylu, daje ci obliczoną wartość
Anthony Johnston,
2
@shevski działa dobrze, musisz dodać class="largeField"do zakresu, aktualnie wybierasz pusty zestaw.
Adam Lassek
Wiem, co w tym nie działa i dlatego jest to kontrprzykład.
szewski
2
@shevski mój przykład podaje obliczoną wartość istniejącego elementu na stronie, na co Antoni wskazał już rok temu. Twoje komentarze są zbędne.
Adam Lassek
@AdamLassek, Anthony nie powiedział, że istnieje większość.
szewski
116

Najłatwiejszy sposób

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

// >>> "65%"
redexp
źródło
50
Uwaga: zadziała to tylko z CSS zastosowanym bezpośrednio na elemencie (np style="width:65%".).
brianreavis
3
Wspaniały!! Aby zwrócić same liczby: parseInt ($ ('. LargeField') [0] .style.width, 10);
Tiago,
4
Tiago, możesz po prostu użyć parseFloat ().
Gavin
Działa to tylko w stylizacjach wbudowanych, jak powiedział @brianreavis.
Akansh
84

Jest to jak najbardziej możliwe!

Najpierw musisz ukryć () element nadrzędny. Zapobiegnie to obliczaniu pikseli przez JavaScript dla elementu podrzędnego.

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

Zobacz mój przykład .

Teraz ... zastanawiam się, czy jako pierwszy odkryję ten hack :)

Aktualizacja:

Jednowierszowy

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

Pozostawi ukryty element przed </body>tagiem, co możesz chcieć .remove().

Zobacz przykład jednej linii .

Jestem otwarty na lepsze pomysły!

timofey.com
źródło
1
To powinno być przyjęte rozwiązanie. Mogę również potwierdzić, że działa to u mnie, gdy inne odpowiedzi nie mają pierwotnie przypisanej wartości procentowej.
EricP
1
Aby uniknąć migotania, sklonuj dziecko, ukryj rodzica, a następnie pobierz szerokość. var clone = $ ('. child'). clone ();
user1491819
3
Aktualizacja: funkcja getCssWidth (childSelector) {return jQuery (childSelector) .parent (). Clone (). Hide (). Find (childSelector) .width (); } console.log ('child width:' + getCssWidth ('. child')) ;;
user1491819
1
Świetne rozwiązanie! Oto odpowiednik skryptu w formacie
Sjeiti
1
Jeśli odpowiedź $ (...) [0] .style.width działa, to czy nie powinno to być akceptowane rozwiązanie? To rozwiązanie, choć eleganckie, ma pewne wady wydajności.
Mihai Danila
44

Dostęp do document.styleSheetsobiektu można było uzyskać :

<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>
Gumbo
źródło
8
+1 prawidłowe użycie metod DOM (czasem jQuery nie jest odpowiedzią)
bobince
1
+1 Jestem tu z tobą dla dokładności. Jestem ciekawy, jak każda przeglądarka to obsługuje, ale to jest właściwa odpowiedź.
cgp,
Działa dobrze w prostszych przypadkach, zarówno FF, jak i IE7, ale nie dla mnie (patrz EDYCJA powyżej).
montrealist
1
Czy próbowałeś również przejrzeć wszystkie arkusze stylów? W moim przykładzie użyto tylko first ( styleSheets[0]).
Gumbo
Przepraszam, jeśli to jest pytanie noob, ale jak by to for (var i=0; rules.length; i++)działało? Nie powinno byćfor (var i=0; i<rules.length; i++)
sbichenko
18

Późno, ale dla nowszych użytkowników, spróbuj tego, jeśli styl css zawiera procent :

$element.prop('style')['width'];
ddanon
źródło
Działał jak urok dla rozmiaru czcionki CSS. $ element.prop ('style') ['rozmiar czcionki];
Jason
10

Wtyczka jQuery oparta na odpowiedzi Adamsa:

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

Zwróci „65%”. Zwraca tylko zaokrąglone liczby, aby działały lepiej, jeśli lubisz if (szerokość == '65%'). Jeśli użyłbyś odpowiedzi Adamsa bezpośrednio, to nie zadziałało (mam coś takiego jak 64.93288590604027). :)

Leonard Pauli
źródło
3

Opierając się na doskonałym i zaskakującym rozwiązaniu timofey, oto implementacja czystego 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;
}

Mam nadzieję, że to komuś pomoże.

Gregory Magarshak
źródło
błąd składni, zapomniałeś {na końcu pierwszej linii.
Akansh
tylko to rozwiązanie poprawnie pokazuje „auto”, gdy szerokość elementu div nie jest ustawiona, jquery css („szerokość”) zwraca „0px”. wszystkie inne odpowiedzi są niepoprawne ...
Alexey Obukhov
1

Mam podobny problem z pobieraniem wartości globalnego arkusza stylów w jQuery , ostatecznie znalazłem to samo rozwiązanie, co powyżej .

Chciałem tylko połączyć te dwa pytania, aby inni mogli skorzystać z późniejszych ustaleń.

Horst Walter
źródło
2
Twoje pytanie i to są już połączone (patrz pasek boczny „Połączone” po prawej stronie) na podstawie komentarza sheseka do Twojego pytania.
Chris Johnsen,
0

Możesz umieścić style, do których potrzebujesz dostępu z jQuery w:

  1. bezpośrednio nagłówek dokumentu
  2. w dołączeniu, który skrypt po stronie serwera umieszcza w nagłówku

Wtedy powinno być możliwe (choć niekoniecznie łatwe) napisanie funkcji js, która przeanalizuje wszystko w tagach stylu w nagłówku dokumentu i zwróci potrzebną wartość.

wheresrhys
źródło
0

Możesz użyć funkcji css (width), aby zwrócić bieżącą szerokość elementu.

to znaczy.

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

Zobacz też: http://api.jquery.com/width/ http://api.jquery.com/css/

user267867
źródło
dlaczego jest to zaznaczone? na tym bugs.jquery.com/ticket/4772 jest otwarty błąd , wygląda na to , że jest pewna niespójność w wywoływaniu tego w zależności od tego, czy umieścisz swój styl w tekście,
Anthony Johnston
1
Nie mogę uzyskać% z tym
ktoś bezużyteczny
0

Nie ma nic w jQuery i nic prostego nawet w javascript. Biorąc odpowiedź timofey i działając z nią, stworzyłem tę funkcję, która działa, aby uzyskać dowolne właściwości:

// 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
}
BT
źródło
0

Konwertuj z pikseli na procent za pomocą mnożenia krzyżowego .

Konfiguracja formuły:

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

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

Rzeczywisty kod:

<script>

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

</script>
Zachary Horton
źródło