ottieni il valore percentuale della regola CSS in jQuery


98

Diciamo che la regola è la seguente:

.largeField {
    width: 65%;
}

C'è un modo per recuperare in qualche modo il '65% 'e non il valore del pixel?

Grazie.

EDIT: Sfortunatamente l'utilizzo dei metodi DOM non è affidabile nel mio caso, poiché ho un foglio di stile che importa altri fogli di stile, e di conseguenza il parametro cssRules finisce con un valore nullo o undefined .

Questo approccio, tuttavia, funzionerebbe nei casi più semplici (un foglio di stile, più dichiarazioni separate del foglio di stile all'interno del tag head del documento).


1
Sarebbe meglio seminare questi dati sull'elemento stesso e quindi tenere traccia di come cambierà in futuro.
Travis J

Risposte:


51

Non esiste un modo integrato, temo. Puoi fare qualcosa del genere:

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

19
giusto per essere chiari, questo non ti dice il valore nel tuo stile, ti dà un valore calcolato
Anthony Johnston

2
@shevski funziona bene, devi aggiungere class="largeField"allo span, attualmente stai selezionando un set vuoto.
Adam Lassek

So cosa non funziona ed è per questo che è un controesempio.
Shevski

2
@shevski il mio esempio fornisce un valore calcolato di un elemento esistente nella pagina, come Anthony ha già sottolineato un anno fa. I tuoi commenti sono superflui.
Adam Lassek

@AdamLassek, Anthony non ha detto che esista di più.
Shevski

116

Il modo più semplice

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

// >>> "65%"

50
Solo una nota: questo funzionerà solo con CSS applicato direttamente sull'elemento (es style="width:65%".).
brianreavis

3
Grande!! Per restituire solo i numeri: parseInt ($ ('. LargeField') [0] .style.width, 10);
Tiago

4
Tiago, puoi semplicemente usare parseFloat ().
Gavin

Funziona solo nello stile in linea, come ha detto @brianreavis.
Akansh

84

Questo è decisamente possibile!

Devi prima nascondere () l'elemento genitore. Ciò impedirà a JavaScript di calcolare i pixel per l'elemento figlio.

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

Guarda il mio esempio .

Ora ... mi chiedo se sono il primo a scoprire questo trucco :)

Aggiornare:

One-liner

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

Lascerà un elemento nascosto prima del </body>tag, cosa che potresti desiderare .remove().

Guarda un esempio di one-liner .

Sono aperto a idee migliori!


1
Questa dovrebbe essere la soluzione accettata. Posso anche confermare che funziona per me dove le altre risposte non ottengono il valore percentuale originariamente assegnato.
EricP

1
Per evitare lo sfarfallio, clona il bambino, nascondi il genitore, quindi recupera la larghezza. var clone = $ ('. child'). clone ();
user1491819

3
Aggiornamento: funzione getCssWidth (childSelector) {return jQuery (childSelector) .parent (). Clone (). Hide (). Find (childSelector) .width (); } console.log ('child width:' + getCssWidth ('. child')) ;;
user1491819

1
Ottima soluzione! Ecco un equivalente puro-js dello script jsfiddle.net/Sjeiti/2qkftdjd
Sjeiti

1
Se la risposta $ (...) [0] .style.width funziona, non dovrebbe essere quella la soluzione accettata? Questa soluzione, sebbene elegante, presenta alcuni difetti di prestazioni.
Mihai Danila

44

Puoi accedere document.styleSheetsall'oggetto:

<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 corretto utilizzo di metodi DOM (talvolta jQuery non è la risposta)
bobince

1
+1 Sono qui con te per la precisione. Sono curioso di sapere come ogni browser lo supporta, ma questa è la risposta giusta.
cgp

Funziona bene nei casi più semplici, sia FF che IE7, ma non per me (vedi EDIT sopra).
montrealist

1
Hai provato anche a scorrere tutti i fogli di stile? Il mio esempio ha usato solo il primo ( styleSheets[0]).
Gumbo

Scusa se questa è una domanda noob, ma come for (var i=0; rules.length; i++)funzionerebbe? Non dovrebbe esserefor (var i=0; i<rules.length; i++)
sbichenko

18

In ritardo, ma per gli utenti più recenti, prova questo se lo stile CSS contiene una percentuale :

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

Ha funzionato come un fascino per la dimensione del carattere CSS. $ element.prop ('style') ['font-size];
Jason

10

Un plugin jQuery basato sulla risposta di 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());​​​​​

Restituirà '65% '. Restituisce solo numeri arrotondati per funzionare meglio se ti piace if (width == '65%'). Se avessi usato la risposta di Adams direttamente, non avrebbe funzionato (ho ottenuto qualcosa come 64.93288590604027). :)


3

Basandosi sull'eccellente e sorprendente soluzione di timofey, ecco una pura implementazione 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;
}

Spero sia utile a qualcuno.


un errore di sintassi, hai dimenticato {alla fine della prima riga.
Akansh

solo questa soluzione mostra correttamente 'auto' quando la larghezza per div non è impostata, jquery css ('width') restituisce '0px'. tutte le altre risposte errate ...
Alexey Obukhov


0

Puoi inserire gli stili a cui devi accedere con jQuery in:

  1. il capo del documento direttamente
  2. in un include, quale script lato server poi mette in testa

Quindi dovrebbe essere possibile (anche se non necessariamente facile) scrivere una funzione js per analizzare tutto all'interno dei tag di stile nell'intestazione del documento e restituire il valore necessario.


0

È possibile utilizzare la funzione css (larghezza) per restituire la larghezza corrente dell'elemento.

cioè.

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

Vedi anche: http://api.jquery.com/width/ http://api.jquery.com/css/


perché questo è segnato? c'è un bug aperto su questo bugs.jquery.com/ticket/4772 , sembra che ci sia qualche incongruenza nel chiamarlo a seconda che tu metta il tuo stile in linea o in un foglio di stile jsfiddle.net/boushley/MSyqR/2
Anthony Johnston

1
Non riesco a ottenere% con questo
qualcuno inutile

0

Non c'è niente in jQuery e niente di semplice anche in javascript. Prendendo la risposta di timofey e correndo con essa, ho creato questa funzione che funziona per ottenere tutte le proprietà che desideri:

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

Converti da pixel a percentuale utilizzando la moltiplicazione incrociata .

Configurazione della formula:

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

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

Il codice effettivo:

<script>

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

</script>
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.