¿Por qué backface-visibility hidden no funciona en IE10 cuando la perspectiva se aplica a los elementos principales?


Ok, así que aquí hay otro fallo IE10. El problema es que la aplicación de perspectiva en los elementos principales rompe la configuración backface-visibility hidden. Por favor, vea este violín: http://jsfiddle.net/2y4eA

Cuando pasa el cursor sobre el cuadrado rojo, gira 180° en el eje x, y aunque la visibilidad de la cara posterior se establece en oculto, la cara posterior se muestra, al menos hasta que se alcanza el 180°, luego desaparece. Elimine la propiedad perspectiva, y verá que funciona como esperado, la cara posterior no es visible en absoluto, pero por supuesto el efecto 3d se pierde.

Es posible solucionar este problema aplicando perspectiva en la propiedad transform: http://jsfiddle.net/M2pyb Pero esto causará problemas en cojunction con transform-origin-z, cuando z se establece en cualquier otra cosa que no sea 0, todo se vuelve "escalado": http://jsfiddle.net/s4ndv así que desafortunadamente eso no es una solución.

La cara trasera-visibilty cosita es probaly un error? Si es así, ¿hay más trabajo que el que he mencionado?

Author: ndm, 2012-09-27

6 answers

Me topé con este problema técnico también y definitivamente es un problema técnico.

La solución es aplicar la transformación de perspectiva en el elemento hijo. He actualizado tu violín aquí: http://jsfiddle.net/jMe2c /

.item {
    backface-visibility: hidden;
    transform: perspective(200px) rotateX(0deg);
}
.container:hover .item {
    transform: perspective(200px) rotateX(180deg);
}

(Véase también la respuesta en https://stackoverflow.com/a/14507332/2105930 )

Creo que es porque en IE 10, el elemento padre 3d-properties no se propaga al elemento hijo. Esta es una característica no soportada conocida. Salida http://msdn.microsoft.com/en-us/library/ie/hh673529%28v=vs.85%29.aspx#the_ms_transform_style_property:

En este momento, Internet Explorer 10 no admite la palabra clave preserve-3d. Puede solucionar esto aplicando manualmente la transformación del elemento primario a cada uno de los elementos secundarios además de la transformación normal del elemento secundario.

Así que la solución recomendada por Microsoft es propagar sus propiedades 3d usted mismo, manualmente.

 28
Author: chowey,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:17:31

Luché durante horas. esta es la única solución crossbrowser que funcionó para mí: http://www.cssplay.co.uk/menu/css3-3d-card.html

 6
Author: torbonaut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-04-06 19:15:39

Una solución que me imagino es agregar una transición para la opacidad que tiene 0 tiempo y tiene un retraso de la mitad de su transición de perspectiva.

.container, .item {
    width: 200px;
    height: 200px;
    opacity:1;
}
.container {
    perspective: 200px;
}
.container:hover .item {
    transform: rotateX(180deg);
    opacity:0;
}
.item {
    background-color: #ff0000;
    backface-visibility: hidden;
    transition: transform 3000ms, opacity 0ms 1500ms;
}
 1
Author: Dan Ovidiu Boncut,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-03-07 14:08:37

Sugeriría dejar de luchar con IE con la propiedad perspective establecida en todos los elementos transformados y comenzar a probar el soporte para preserve-3d. Seguí a este tipo para expandir Modernizr con una prueba de propiedad: https://coderwall.com/p/qctclg?comment=This+was+awesome%21+And+exactly+what+i+needed.+Thanks%21+

De esa manera, es posible hacer un respaldo para la falta de implementación de transformaciones 3d de IE, y comenzar a jugar con las posibilidades más vanguardistas en el otro navegador.

De lo contrario IE hará que su código sea demasiado desordenado, y aún así no le dará las mismas posibilidades, como rotar objetos 3d multidimensionales.

..sólo mis 2 centavos.

 1
Author: Malibur,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-06-25 10:08:26

Implementé la solución propuesta por @ torbonaut y @chowey en este jsfiddle

Html

<div id='container'>
<div class='backhide bottom'>bottom</div>
<div class='backhide top'>top</div>
</div>

Css

  #container, .bottom, .top {
    width: 200px;
    height: 300px;
    position: absolute;
    -webkit-transition: 1.5s ease-in-out;
    -moz-transition: 1.5s ease-in-out;
    -ms-transition: 1.5s ease-in-out;
    -o-transition: 1.5s ease-in-out;
    transition: 1.5s ease-in-out;
  }

  .backhide{

    -moz-backface-visibility: hidden;
    -webkit-backface-visibility: hidden;
    backface-visibility: hidden;
  }

  #container:hover .bottom {
    -moz-transform: perspective(800px) rotateY(0);
    -webkit-transform: perspective(800px) rotateY(0);
    transform: perspective(800px) rotateY(0);
  }
  #container:hover .top {
    -webkit-transform: perspective(800px) rotateY(-180deg);
    -moz-transform: perspective(800px) rotateY(-180deg);
    transform: perspective(800px) rotateY(-180deg);
  }

  .bottom {
    background-color: #ff0000;
    -moz-transform: perspective(800px) rotateY(180deg);
    -webkit-transform: perspective(800px) rotateY(180deg);
    transform: perspective(800px) rotateY(180deg);
  }

  .top {
    background-color: #e0e0e0;


    -moz-transform: perspective(800px) rotateY(0deg);
    -webkit-transform: perspective(800px) rotateY(0deg);
    transform: perspective(800px) rotateY(0deg);

  }
 0
Author: Jon,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-09-28 21:16:05

Tengo una buena solución ilógica, probé todas las soluciones anteriores y ninguna funcionó. Sin embargo, un error lo hizo. Establezco la visibilidad de la cara posterior en visible cuando se voltea la tarjeta. funciona tanto en IE como en Chrome.

Funciona mejor en Chrome, IE está bien.

var flipcard = document.getElementsByClassName("flipcard");
var i;

for (i = 0; i < flipcard.length; i++) {
    flipcard[i].addEventListener("click", function() {
        this.classList.toggle("is-flipped");
    });
}
.card_scene {
    width: 180px;
    height: 234px;
    margin: 10px 5px;
    perspective: 600px;
    float:left;
  }

  .flipcard {
    height: 100%;
    transition: transform 1s;
    transform-style: preserve-3d;
    cursor: pointer;
    position: relative; 
  }

  .flipcard.is-flipped {
    transform: rotateY(180deg);
  }

  .flipcard.is-flipped .card__face {
    backface-visibility: visible;                        
}

 .card__face {
    position: absolute;
    max-width: 100%;
    max-height: 100%;
    line-height: 234px;
    backface-visibility: hidden;
  }
  
 

.card__face--front {
	transform: rotateY(0deg);
}

.card__face--back {
	background: white;
	transform: rotateY(-180deg);
	border: 1px solid #CCC; 
	width: 100%;
}

.cardtext {
	margin: 6px;
    font-size:14px;
    line-height: 1.2em;
    display: inline-block;
    width: 100%;
    white-space: pre;
}

.flipcard-breakfloat {
 clear: left;   
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<!-- start of flipcard tempalte -->
<div class="build-only">
<h2>question text here</h2>
<p>Flip the pictures to...</p>
<div>
<div class="card_scene">
<div class="flipcard">
<div class="card__face card__face--front"><picture class="card__image"><img width="180" height="234" id="yui_3_17_2_1_1534724749880_198" src="https://media.gettyimages.com/photos/world-heritage-listed-rainforest-in-dorrigo-national-park-new-south-picture-id936315116" /> </picture></div>
<div class="card__face card__face--back">
<p class="cardtext">** max width of feedback **<br />Add feedback text here use <br />shift+enter for line breaks. <br />don't use just use enter or <br />break will appear below  <br />iamge, and overlay the text. <br />note the class <br />".nsw-td-flipcard-breakfloat" <br />this breaks the float: left so <br /> following text appears <br />as normal <br />Image size is width: <br />"180" height: "234"</p>
</div>
</div>
</div>
<div class="card_scene">
<div class="flipcard">
<div class="card__face card__face--front"><picture class="card__image"> <img width="180" height="234" alt="" src="https://media.gettyimages.com/photos/lonely-single-tree-in-the-field-picture-id680917092" /> </picture></div>
<div class="card__face card__face--back">
<p class="cardtext">** max width of feedback ** <br />Add feedback text here use <br />shift+enter for line breaks. <br />don't use just use enter or <br />break will appear below  <br />iamge, and overlay the text. <br />note the class <br />".nsw-td-flipcard-breakfloat" <br />this breaks the float: left so <br /> following text appears <br />as normal <br />Image size is width: <br />"180" height: "234"</p>
</div>
</div>
</div>
<div class="card_scene">
<div class="flipcard">
<div class="card__face card__face--front"><picture class="card__image"> <img width="180" height="234" alt="" src="https://media.gettyimages.com/photos/old-tree-picture-id173501312" /> </picture></div>
<div class="card__face card__face--back">
<p class="cardtext">** max width of feedback ** <br />Add feedback text here use <br />shift+enter for line breaks. <br />don't use just use enter or <br />break will appear below  <br />iamge, and overlay the text. <br />note the class <br />".nsw-td-flipcard-breakfloat" <br />this breaks the float: left so <br /> following text appears <br />as normal <br />Image size is width: <br />"180" height: "234"</p>
</div>
</div>
</div>
</div>
<div class="flipcard-breakfloat"></div>
</div>
<!-- end of flipcard tempalte -->
<p></p>
<p></p>
 0
Author: Michael,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-08-23 01:52:17