Come fare in modo che jQuery non arrotondi il valore restituito da .width ()?


94

Ho cercato in giro e non sono riuscito a trovarlo. Sto cercando di ottenere la larghezza di un div, ma se ha un punto decimale arrotonda il numero.

Esempio:

#container{
    background: blue;
    width: 543.5px;
    height: 20px;
    margin: 0;
    padding: 0;
}

Se lo faccio $('#container').width();restituirà 543 invece di 543,5. Come faccio a non arrotondare il numero e restituire il 543,5 completo (o qualunque sia il numero).


2
Perché hai larghezze in pixel decimali? Vengono comunque arrotondati a numeri interi. Non puoi avere mezzo pixel.
Moin Zaman

Perchè ti serve? Senza queste informazioni, questa domanda è inutile.
Juan Mendes

2
@JuanMendes Nel mio caso, su un display HiDPI, Chrome 38 calcola una larghezza della finestra non intera. Quindi, se $ .width arrotonda per eccesso, diciamo, 1250,6 a 1251, e faccio calcoli basati su 1251, ho problemi. L'arrotondamento per difetto non è un grosso problema.
JKS

Risposte:


197

Usa il nativo Element.getBoundingClientRectpiuttosto che lo stile dell'elemento. È stato introdotto in IE4 ed è supportato da tutti i browser:

$("#container")[0].getBoundingClientRect().width

Nota: per IE8 e versioni precedenti, vedere le note "Compatibilità browser" nei documenti MDN.


9
+1 Se stai impostando la larghezza di un altro elemento, assicurati di cambiarne la larghezza in questo modo: $ ("# altro"). Css ("width", $ ('# container'). Get (0) .getBoundingClientRect ( ) .width + "px"); Se usi jQuery width () il valore sarà arrotondato.
lepe

1
Secondo questa domanda simile le widthe heightproprietà non sono supportati in tutte le versioni di IE, per cui in alcuni casi, hanno bisogno di essere calcolato prima che possano essere utilizzati: stackoverflow.com/questions/11907514/...
flyingL123

Bello! stessa domanda per outerWidth (vero)? :) piccola osservazione: `In IE8 e sotto, l'oggetto DOMRect restituito da getBoundingClientRect () manca delle proprietà di altezza e larghezza. Inoltre, non è possibile aggiungere proprietà aggiuntive (incluse altezza e larghezza) a questi oggetti DOMRect.
TecHunter

5
Nota che getBoundingClientRect()calcola le dimensioni dopo aver applicato le trasformazioni CSS .
user1620220

Dopo il test ho scoperto che questo metodo non funziona per gli elementi nascosti ( display: none).
Jory Hogeveen

10

La risposta di Ross Allen è un buon punto di partenza, ma l'uso di getBoundingClientRect (). Width includerà anche il padding e la larghezza del bordo che non è il caso della funzione width di jquery :

L'oggetto TextRectangle restituito include il riempimento, la barra di scorrimento e il bordo, ma esclude il margine. In Internet Explorer, le coordinate del rettangolo di delimitazione includono i bordi superiore e sinistro dell'area client.

Se il tuo intento è ottenere il widthvalore con la precisione, dovrai rimuovere il padding e il bordo in questo modo:

var a = $("#container");
var width = a[0].getBoundingClientRect().width;

//Remove the padding width (assumming padding are px values)
width -= (parseInt(a.css("padding-left")) + parseInt(a.css("padding-right")));

//Remove the border width
width -= (a.outerWidth(false) - a.innerWidth());

Non la dovreste .replace("px", "")come parseIntdovrebbe rimuovere per voi.
Steve Schrab

Essendo tutta questa domanda sulla prevenzione dell'arrotondamento, sono perplesso dall'assunto esplicito qui che l'arrotondamento va bene per i valori di riempimento. Perché dovresti trattarlo in modo diverso rispetto ai valori di larghezza ?! parseFloat()Forse usi ?
phils

Allo stesso modo, innerWidth()essendo parte del problema originale, temo che il calcolo della larghezza del bordo qui funzioni anche su valori arrotondati.
phils

9

Volevo solo aggiungere la mia esperienza qui, anche se la domanda è vecchia: il consenso sopra sembra essere che l'arrotondamento di jQuery è effettivamente altrettanto buono come un calcolo non arrotondato, ma non sembra essere il caso in qualcosa che ho fatto .

Il mio elemento ha una larghezza fluida, in generale, ma il contenuto cambia dinamicamente tramite AJAX. Prima di cambiare il contenuto, blocco temporaneamente le dimensioni dell'elemento in modo che il mio layout non rimbalzi durante la transizione. Ho scoperto che usando jQuery in questo modo:

$element.width($element.width());

sta causando un po 'di curiosità, come se ci fossero differenze di pixel secondari tra la larghezza effettiva e la larghezza calcolata. (In particolare, vedrò una parola saltare da una riga di testo a un'altra, indicando che la larghezza è stata modificata, non solo bloccata.) Da un'altra domanda - Ottenere l'effettiva larghezza in virgola mobile di un elemento - Ho trovato out che window.getComputedStyle(element).widthrestituirà un calcolo non arrotondato. Quindi ho cambiato il codice sopra in qualcosa di simile

var e = document.getElementById('element');
$('#element').width(window.getComputedStyle(e).width);

E con QUEL codice - nessun rimbalzo divertente!Quell'esperienza sembra suggerire che il valore non arrotondato è davvero importante per il browser, giusto? (Nel mio caso, Chrome versione 26.0.1410.65.)


Il documento corrente per .css () di jQuery sottolinea che getComputedStyle () è chiamato runtimeStyle () i IE e afferma che uno dei vantaggi di .css () è questa interfaccia unificata.
norvegese

2

Puoi usare getComputedStyleper questo:

parseFloat(window.getComputedStyle($('#container').get(0)).width)

-1

Utilizzare quanto segue per ottenere una larghezza precisa:

var htmlElement=$('class or id');
var temp=htmlElement[0].style.width;

perché dovresti anche volere che jquery ottenga la tua larghezza calcolata se la imposti e la hai disponibile instyle.width
user151496
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.