2013-10-30 12 views
5

Conosco il metodo di impostazione della trasformazione, ma voglio impostare la rotazione e mantenere altri come scala e inclinazione.Come esporre una trasformazione di stile dinamica usando Javascript?

Forse, possiamo scrivere una funzione come:

// A variable of element, not parameter. separate out it make more clear. 
var el = document.getElementById('el'); 
function setTransform (p_name, p_value) { 
    // how to write some code to set the el transform style... 
} 

Inoltre, ho un elemento:

<div id="el" style="transform: rotate(45deg) skew(45deg);"></div> 

E per noi la nostra funzione setTransform:

setTransform('rotate', '30deg'); 

spero l'elemento è questo:

<div id="el" style="transform: rotate(30deg) skew(45deg);"></div> 

Quindi la mia domanda è come scrivere il contenuto della funzione setTransform?

risposta

14

Nota: si dovrebbe usare skewX e/o skewY invece di skew. Vedi the MDN info here.

Sarebbe più facile per tenere traccia delle trasformazioni in una variabile:

var elRot, // the rotation 'counter' for the element 'el' 
    elScale, // the scale 'counter' for the element 'el' 
    elSkewX, // the skewX 'counter' for the element 'el' 
    elSkewY; // the skewY 'counter' for the element 'el' 

// initialize values 
elRot = 0; 
elScale = 1; 
elSkewX = 0; 
elSkewY = 0; 

o di un oggetto:

var elTranform = { 
    rot: 0, // the rotation 'counter' for the element 'el' 
    sca: 1, // the scale 'counter' for the element 'el' 
    skx: 0, // the skewX 'counter' for the element 'el' 
    sky: 0 // the skewY 'counter' for the element 'el' 
}; 

Così ora si può iniziare con la funzione (si continua a utilizzare var el per l'elemento), il primo passo è ottenere i valori, in modo da modificare gli argomenti assegnati alla funzione:

// use this with separate vars 
function setTransform (element, rotationArg, scaleArg, skewXArg, skewYArg) { 
    // how to write some code to set the el transform style... 
} 

// use this with the object 
function setTransform (element, elTransformArg) { 
    // how to write some code to set the el transform style... 
} 

Successivo avete ri-specificato nessuna altre trasformate che vengono 'soggiornano', nell'esempio si dà, lo skewX rimane 45deg:

function setTransform (element, rotationArg, scaleArg, skewXArg, skewYArg) { 
    // the brackets cause the string to be evaluated before being assigned 
    element.style.transform = ("rotate() scale() skewX() skewY()"); 
} 

o

function setTransform (element, elTransformArg) { 
    element.style.transform = ("rotate() scale() skewX() skewY()"); 
} 

Ora bisogna mettere gli argomenti nei la stringa:

function setTransform (element, rotationArg, scaleArg, skewXArg, skewYArg) { 
    element.style.transform = ("rotate(" + rotationArg + "deg) scale(" + scaleArg 
     + ") skewX(" + skewXArg + "deg) skewY(" + skewYArg + "deg)"); 
} 

o

function setTransform (element, elTransformArg) { 
    element.style.transform = ("rotate(" + elTransformArg.rot + "deg) scale(" 
     + elTransformArg.sca + ") skewX(" + elTransformArg.skx + "deg) skewY(" 
     + elTransformArg.sky + "deg)"); 
} 

un po 'disordinato, così si può mettere quella stringa in una variabile (questo sarà vantaggioso per i prefissi):

function setTransform (element, rotationArg, scaleArg, skewXArg, skewYArg) { 
    var transfromString = ("rotate(" + rotationArg + "deg) scale(" + scaleArg 
     + ") skewX(" + skewXArg + "deg) skewY(" + skewYArg + "deg)"); 

    // now attach that variable to each prefixed style 
    element.style.webkitTransform = transfromString; 
    element.style.MozTransform = transfromString; 
    element.style.msTransform = transfromString; 
    element.style.OTransform = transfromString; 
    element.style.transform = transfromString; 
} 

o

function setTransform (element, elTransformArg) { 
    var transfromString = ("rotate(" + elTransformArg.rot + "deg) scale(" 
     + elTransformArg.sca + ") skewX(" + elTransformArg.skx + "deg) skewY(" 
     + elTransformArg.sky + "deg)"); 

    // now attach that variable to each prefixed style 
    element.style.webkitTransform = transfromString; 
    element.style.MozTransform = transfromString; 
    element.style.msTransform = transfromString; 
    element.style.OTransform = transfromString; 
    element.style.transform = transfromString; 
} 

Ora chiamare la funzione:

setTransform(el, elRot, elScale, elSkewX, elSkewY); 

oppure

setTransform(el, elTransform); 

Per cambiare i valori, cambiate le variabili o valori dell'oggetto e chiamare:

elRot = 45; 
elSkewX = 30; 
setTransform(el, elRot, elScale, elSkewX, elSkewY); 

o

elTransform.rot = 45; 
elTransform.skx = 30; 
setTransform(el, elTransform); 

In questo modo è sufficiente modificare i valori 'contatore' per ogni trasformazione, e chiamare la funzione applicare la trasformazione. Come accennato in precedenza, è importante conservare tutte le trasformazioni che non vengono modificate poiché sostituisce semplicemente il precedente valore CSS per la trasformazione con quello nuovo. Fornire più valori significa che viene utilizzato solo l'ultimo (la parte C del CSS).

+0

Vorrei solo sottolineare che su quella pagina MDN c'è una nota che dice: "Gecko 14.0 rimosse il supporto sperimentale per skew(), ma è stato reintrodotto in Gecko 15.0 per motivi di compatibilità, in quanto non è standard e sarà probabilmente rimosso in futuro **, ** non ** usarlo. " –

1

Può essere seguito vi aiuterà a ...

el.style.webkitTransform = ""; 
el.style.MozTransform = ""; 
el.style.msTransform = ""; 
el.style.OTransform = ""; 
el.style.transform = ""; 
+1

nessun aiuto. Conosco il prefisso del venditore. Voglio solo ruotare e mantenere l'inclinazione e gli altri. Prego attentamente di leggere la mia domanda. – Tychio

+0

oh..probabilmente dovrete manipolare le stringhe attorno ad esso. – nik

+0

RegEx? Va bene se non hai altro modo. – Tychio

1

La migliore risposta assoluta qui sarebbe una vera API che ci consente di influire su qualsiasi valore esistente dello stile calcolato senza dover analizzare i valori. Una cosa del genere esiste in qualche forma abbandonata e non cross-browser con lo WebkitCSSMatrix API e l'equivalente "ufficiale" del W3C DOMMatrix. Ho visto discussioni su come riformattare e consolidare queste due API, ma non sembrano essere d'accordo sull'implementazione. Ecco uno shim per farlo funzionare cross-browser: CSSMatrix class from github user arian.

Come funziona è possibile passare la stringa di trasformazione calcolata (es .: "translsate3d(0px, 0px, 100px) scale(1.2) skew(2)") e restituisce un oggetto che è possibile manipolare con ruotare, trasformare, tradurre, inclinare le funzioni.Ogni funzione restituisce un'istanza esistente di se stessa con il nuovo valore manipolato e puoi semplicemente riapplicare il valore "toString" alla proprietà di stile dell'elemento.

un sacco di parole, ma qui è un esempio (Chrome e Safari solo per l'utilizzo WebkitCSSMatrix):

var computedStyle = window.getComputedStyle(document.querySelector('.btn')); 
 
var matrix = new WebKitCSSMatrix(computedStyle.transform); 
 

 
// Every second, we add +6 degrees of rotation, no need to read the initial value since WebkitCSSMatrix has parsed it for us 
 
window.setInterval(function(){ 
 
    matrix = matrix.rotate(6); 
 
    // matrix = matrix.translate(2, 0, 0); 
 
    // matrix = matrix.scale(1.8); 
 
    document.querySelector('.btn').style.transform = matrix.toString(); 
 
}, 1000);
body{ 
 
\t \t \t padding-top: 100px; 
 
\t \t \t text-align: center; 
 
\t \t } 
 

 
\t \t .btn{ 
 
\t \t \t text-transform: uppercase; 
 
\t \t \t border-radius:200%; 
 
\t \t \t border:1px solid #000; 
 
\t \t \t width: 2em; 
 
\t \t \t height: 2em; 
 
\t \t \t display: inline-block; 
 
\t \t \t text-align: center; 
 
\t \t \t line-height: 2em; 
 
\t \t \t text-decoration: none; 
 
\t \t \t font-family: sans-serif; 
 
\t \t \t color: #000; 
 
     
 
     // It is already rotated and scaled 
 
\t \t \t transition: transform 1000ms cubic-bezier(.28,.73,.31,1); 
 
     transform: rotate(45deg); 
 
     -webkit-transform: rotate(45deg); 
 
\t \t } 
 

 
\t \t .btn:hover{ 
 
\t \t \t background:#000; 
 
\t \t \t color:#fff; 
 
     
 
     transform: rotate(0deg) scale(1.5); 
 
\t \t }
<a class="btn" href="#">|</a>

Problemi correlati