2015-02-11 39 views
1

我想创建一个纺纱幻灯片,通过绕Z轴的一些图片,为我创造了这个:JavaScript的旋转格disapearing

function gira(clicked) { 
 
    //Definimos la transformación que queremos hacer del elemento 
 
    var angulo = 60 * (Math.PI/180); 
 
    var matgirder = [ 
 
     [Math.cos(angulo), 0, Math.sin(angulo), 0], 
 
     [0, 1, 0, 0], 
 
     [-Math.sin(angulo), 0, Math.cos(angulo), 0], 
 
     [0, 0, 0, 1] 
 
    ]; 
 
    //Obtenemos la matriz de estado de transformación del elemento 
 
    var posicion = $(clicked).css("transform"); 
 
    var values = posicion.match(/-?[\d\.]+/g); 
 
    var matrix = [ 
 
     [values[1], values[2], values[3], values[4]], 
 
     [values[5], values[6], values[7], values[8]], 
 
     [values[9], values[10], values[11], values[12]], 
 
     [values[13], values[14], values[15], values[16]] 
 
    ]; 
 
    //Multiplicamos la matriz de estado por la de transformación 
 
    var girada = []; 
 
    for (var i = 0; i < matrix.length; i++) { 
 
     girada[i] = []; 
 
     for (var j = 0; j < matgirder[0].length; j++) { 
 
      var sum = 0; 
 
      for (var k = 0; k < matrix[0].length; k++) { 
 
       sum += matrix[i][k] * matgirder[k][j]; 
 
      } 
 
      girada[i][j] = sum; 
 
     } 
 
    } 
 
    //Aplicamos la transformación al elemnto 
 
    $(clicked).css("transform", "matrix3d(" + girada + ")"); 
 
}
.contenedorcarrusel { 
 
    height: 10vw; 
 
    -webkit-perspective: 1100px; 
 
    -moz-perspective: 1100px; 
 
    -o-perspective: 1100px; 
 
    perspective: 1100px position: relative; 
 
} 
 
#carrusel { 
 
    width: 140px; 
 
    height: 100%; 
 
    position: relative; 
 
    margin: 0 auto; 
 
    -webkit-transform: translateZ(-288px); 
 
    -moz-transform: translateZ(-288px); 
 
    -o-transform: translateZ(-288px); 
 
    transform: translateZ(-288px); 
 
    -webkit-transform-style: preserve-3d; 
 
    -moz-transform-style: preserve-3d; 
 
    -o-transform-style: preserve-3d; 
 
    transform-style: preserve-3d; 
 
    -webkit-transition: -webkit-transform 1s; 
 
    -moz-transition: -moz-transform 1s; 
 
    -o-transition: -o-transform 1s; 
 
    transition: transform 1s; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
 
<div class="contenedorcarrusel" style="outline: 1px solid red;"> 
 
    <div id="carrusel"> 
 
     <div class="imagencar" id="foto1" style="background: hsla(0, 100%, 50%, 0.8); height: 100px; position: absolute; -webkit-transform: rotateY( 0deg) translateZ(200px); -moz-transform: rotateY(0deg) translateZ(200px); -o-transform: rotateY(0deg) translateZ(200px); transform: rotateY(0deg) translateZ(200px); width: 140px; z-index: -1000;" onClick="gira(this)"></div> 
 
    </div> 
 
</div>

它工作正常,但在某些点击时,div就会消失。 有人可以解释我吗?

+0

在Chrome中,OSX – digout 2015-02-11 08:40:43

+0

不消失,我想它在Firefox和Chrome,使用var安古洛= 60。如果更改角度,点击次数会发生变化,但在某个时间点会消失。无论如何感谢您的时间 – 2015-02-11 08:49:43

+0

它消失之前的最后一个状态具有天空数值(例如3.33066907387547e-16或-1.56319401867222e-13),它们会使下一个值错误并导致div消失。 – Spokey 2015-02-11 08:50:38

回答

2

好的,当数值接近0时,这是一个小数精度问题,通过添加.toFixed(6)来设置精度来解决。 W7 - 由于在他们两人之后4次点击消失Spokey用于察觉这

function gira(clicked) { 
 
    //Definimos la transformación que queremos hacer del elemento 
 
    var angulo = 60 * (Math.PI/180); 
 
    var matgirder = [ 
 
     [Math.cos(angulo), 0, Math.sin(angulo), 0], 
 
     [0, 1, 0, 0], 
 
     [-Math.sin(angulo), 0, Math.cos(angulo), 0], 
 
     [0, 0, 0, 1] 
 
    ]; 
 
    //Obtenemos la matriz de estado de transformación del elemento 
 
    var posicion = $(clicked).css("transform"); 
 
    var values = posicion.match(/-?[\d\.]+/g); 
 
    var matrix = [ 
 
     [values[1], values[2], values[3], values[4]], 
 
     [values[5], values[6], values[7], values[8]], 
 
     [values[9], values[10], values[11], values[12]], 
 
     [values[13], values[14], values[15], values[16]] 
 
    ]; 
 
    //Multiplicamos la matriz de estado por la de transformación 
 
    var girada = []; 
 
    for (var i = 0; i < matrix.length; i++) { 
 
     girada[i] = []; 
 
     for (var j = 0; j < matgirder[0].length; j++) { 
 
      var sum = 0; 
 
      for (var k = 0; k < matrix[0].length; k++) { 
 
       sum += matrix[i][k] * matgirder[k][j]; 
 
      } 
 
      girada[i][j] = sum.toFixed(6); 
 
     } 
 
    } 
 
    //Aplicamos la transformación al elemnto 
 
    $(clicked).css("transform", "matrix3d(" + girada + ")"); 
 
}
.contenedorcarrusel { 
 
    height: 10vw; 
 
    -webkit-perspective: 1100px; 
 
    -moz-perspective: 1100px; 
 
    -o-perspective: 1100px; 
 
    perspective: 1100px position: relative; 
 
} 
 
#carrusel { 
 
    width: 140px; 
 
    height: 100%; 
 
    position: relative; 
 
    margin: 0 auto; 
 
    -webkit-transform: translateZ(-288px); 
 
    -moz-transform: translateZ(-288px); 
 
    -o-transform: translateZ(-288px); 
 
    transform: translateZ(-288px); 
 
    -webkit-transform-style: preserve-3d; 
 
    -moz-transform-style: preserve-3d; 
 
    -o-transform-style: preserve-3d; 
 
    transform-style: preserve-3d; 
 
    -webkit-transition: -webkit-transform 1s; 
 
    -moz-transition: -moz-transform 1s; 
 
    -o-transition: -o-transform 1s; 
 
    transition: transform 1s; 
 
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script> 
 
<div class="contenedorcarrusel" style="outline: 1px solid red;"> 
 
    <div id="carrusel"> 
 
     <div class="imagencar" id="foto1" style="background: hsla(0, 100%, 50%, 0.8); height: 100px; position: absolute; -webkit-transform: rotateY( 0deg) translateZ(200px); -moz-transform: rotateY(0deg) translateZ(200px); -o-transform: rotateY(0deg) translateZ(200px); transform: rotateY(0deg) translateZ(200px); width: 140px; z-index: -1000;" onClick="gira(this)"></div> 
 
    </div> 
 
</div>