2012-06-27 8 views
24

Sto avendo un problema con ottenere la posizione di un div dopo rotate filtro viene applicato ad esso. Ho la posizione di una estremità, la sua altezza e l'angolo con cui viene ruotata, ma dopo aver controllato cosa fa effettivamente questo filtro su MDN ("[cos (angolo) sin (angolo) -sin (angolo) cos (angolo) 0 0] ") Ancora non so come romperlo.Come ottenere la posizione dell'elemento trasformato con css ruotare

Esempio:

enter image description here

Il div mi interessa è la linea tratteggiata. Il suo stile in quel momento era:

left: 80px; top: 12px; height: 69.5122px; width: 2px; -moz-transform: rotate(-1.21366rad);

(top/left descrivono la posizione del suo inizio.) Sto cercando di ottenere la posizione top/left della sua fine.

+0

dopo aver aggiornato la mia conoscenza matematica, mi è venuta in mente qualcosa di simile: var x = termin.top + Math.cos (angle) * div.height; var y = div.left + Math.sin (angolo) * div.height; Qualcuno può confermare se questa è la soluzione corretta? – owca

risposta

15

Per la tua domanda attuale e la conferma della richiesta di:

var x = termin.top + Math.cos(angle) * div.height; 
var y = div.left + Math.sin(angle) * div.height; 

La soluzione può essere trovata in questo altro SO Answer per un diversa domanda, Enhanced qui:

// return an object with full width/height (including borders), top/bottom coordinates 
var getPositionData = function(el) { 
    return $.extend({ 
     width: el.outerWidth(false), 
     height: el.outerHeight(false) 
    }, el.offset()); 
}; 

// get rotated dimensions 
var transformedDimensions = function(el, angle) { 
    var dimensions = getPositionData(el); 
    return { 
     width: dimensions.width + Math.ceil(dimensions.width * Math.cos(angle)), 
     height: dimensions.height + Math.ceil(dimensions.height * Math.cos(angle)) 
    }; 
}; 


Ecco uno interattivo jsFiddle che fornisce aggiornamenti in tempo reale per la funzione getPositionData();.
Sarete in grado di vedere i valori top e left alla fine della rotazione processo CSS3 che controlli.

Riferimento:     jsFiddle

Status Update: È possibile che questo jsFiddle grandi opere per 0-90deg e può essere approvato al momento per tutti gli angoli e le unità diverse, come rad, grad, and turn.

4

Prova utilizzando element.getBoundingClientRect()

Secondo MDN:

A partire dal Gecko 12.0 (12.0 Firefox/Thunderbird 12.0), l'effetto di CSS trasforma è considerato nel calcolo dell'elemento rettangolo di delimitazione.

+0

Sappiamo quali altri browser prendono in considerazione le trasformazioni con 'getBoundingClientRect'? La cosa più importante: a che punto IE? Funziona con IE9? –

+0

@JimboJonny [dal mio test] (https://jsfiddle.net/hhwrv5ov/) è sembra IE9 prende anche trasforma in considerazione (ma arrotonda i risultati a pixel interi). IE10 funziona come qualsiasi altro browser (non arrotonda i risultati). – pozs

Problemi correlati