2012-11-15 19 views
9

È possibile eseguire una DLT in CSS? Se è così, come viene realizzato? Non riesco a pensare a un modo usando solo transform: matrix ... Se questo non è possibile, quale sarebbe un approccio alternativo?Trasformazione lineare diretta nei CSS

L'effetto particolare che sto cercando di realizzare è layout di div in un modo simile a come Safari fa questo: enter image description here

+0

Non è possibile utilizzare jQuery? –

+0

Posso, ma sto considerando un'opzione di fallback. Come lo faresti in jQuery? –

+0

C'è un plug-in Carousel da qualche parte nella cronologia del mio browser che ha un effetto simile. Forse puoi replicarlo usando solo i CSS. Il problema principale è quello di dipendere dalle trasformazioni CSS, i vecchi browser (i.e IE) non saranno in grado di riprodurre questo effetto –

risposta

1

Qui è una risposta molto agitato e non generico alla vostra richiesta. http://jsfiddle.net/3t5SM/ Si potrebbe facilmente estenderlo per ottenere una soluzione generica molto migliore.

nel mio CSS,

#id1, #id4, #id7{   
-webkit-transform: rotateY(40deg); 
} 
#id3, #id6, #id9{   
-webkit-transform: rotateY(-40deg); 
} 
#id2, #id5, #id8{   
-webkit-transform: scale(0.94); 
} 

l'idea di base è quella di creare uno stile per ogni colonna (qui chiamo la id ma ancora una volta, sarebbe meglio avere uno stile per ogni colonna e definire le colonne come .left, .middle, .right, ecc)

io aggiornare il mio post stasera se ho il tempo di entrare nei dettagli :)


EDIT: come promessa, ecco una versione leggermente migliore. Ora è molto più generico e, a seconda delle dimensioni della tua finestra, otterrai il numero giusto di cubi. È ancora lontano dall'essere perfetto (potresti giocare con le dimensioni dei cubi per ottenere una sensazione di profondità migliore), ma in generale vedi che è possibile, anche dinamicamente :) ecco il violino: http://jsfiddle.net/P84qd/4/

di andare un po 'nei dettagli del javascript:

function dispatch(){ 
    var sizeOfImg = 150; 
    var windowWith = document.body.offsetWidth; 
    var widthRest = windowWith%sizeOfImg; 
    var nbSquareRow = Math.floor(windowWith/sizeOfImg); 
    dlt(nbSquareRow); 
    var marginVal = widthRest/(nbSquareRow+1); 
    var lineout = document.getElementById('lineout'); 
    lineout.style.paddingLeft = marginVal+'px'; 
    lineout.style.paddingTop = marginVal+'px'; 
    var square = document.getElementsByTagName('div'); 
    for(var i=0, length = square.length;i<length; i++){ 
     if(square[i].className === 'square'){ 
      square[i].style.marginRight = marginVal+'px'; 
      square[i].style.marginBottom = marginVal+'px';   
     }  
    } 
} 

dispatch(); 
window.onresize = function(e){dispatch();}; 

function dlt(nbSquareRow){ 
    var maxRotatDeg = 40; 
    var isEven=true; 
    if(nbSquareRow%2 == 0){ 
     var unityRotatDeg = maxRotatDeg/(nbSquareRow/2); 
    }else{ 
     var unityRotatDeg = maxRotatDeg/((nbSquareRow-1)/2); 
     isEven = false; 
    } 
    var middle = Math.floor(nbSquareRow/2); 
    var mySquares = document.getElementsByTagName('div'); 
    for(var j=0, sqleng = mySquares.length;j<sqleng; j++){ 
     if(mySquares[j].className == 'square'){ 
      var colNumb = (parseInt(mySquares[j].id)-1)%nbSquareRow; 
      var myMultiplier = (middle-colNumb); 
      if(isEven && myMultiplier<=0){ 
       myMultiplier--; 
      } 
      mySquares[j].style.webkitTransform = 'rotateY('+(unityRotatDeg*myMultiplier)+'deg)'; 
     } 
    } 
} 

la funzione dispatch è una semplice funzione che distribuirà i quadrati sulla tua pagina web con margini uguali (in alto, a sinistra, a destra, in basso). L'ho preso da 1. La funzione dlt calcola il numero di colonne e definisce la quantità di rotazione per ogni colonna (nel mio esempio il valore di rotazione massimo è 40). Il resto del codice sono puramente dei controlli matematici per farlo funzionare correttamente.

Per ottenere un risultato migliore, è necessario giocare con le dimensioni di ogni quadrato, ma attenzione perché la funzione dispatch deve anche conoscere la dimensione del quadrato per calcolare quanti quadrati sarà possibile visualizzare per riga. Ti lascio divertire con esso;)

+0

Fantastico, grazie! –

+0

ha aggiornato la mia risposta :) – leMoisela

+0

btw, si otterrebbe un risultato migliore se invece di seguire il mio codice e facendo semplice aggiunta di 'unityRotatDeg' hai fatto una specie di curva di Bézier per avere veramente la sensazione di profondità nella tua panoramica. (i cubetti sul bordo ruoterebbero molto di più, mentre i cubi vicino al centro cambieranno) – leMoisela

Problemi correlati