Воссоздайте трехмерный эффект вращающейся призмы в веб-браузере

Я пытаюсь найти способ, как сделать этот 3D-переход, когда окно наводит на себя. Когда я смотрю на него, я знаю, что он сделан с использованием CSS 3D и эффектов параллакса. Есть ли уже готовый плагин jQuery или пример CSS3?

Любая помощь будет принята с благодарностью. Заранее благодарим за отзыв!

Что я пробовал до сих пор:

HTML

<div class="cube">
    <div class="flippety">
        <h1>Flippity</h1>
    </div>
    <div class="flop">
        <h2>Flop</h2>
    </div>
</div>

CSS

/* Set-up */
body {
    color: rgb(6, 106, 117);
    text-transform: uppercase;
    font-family: sans-serif;
    font-size: 100%;
    background: #F4F6F8;
    padding: 3em 0 0 0;
    line-height: 62px;
    -webkit-perspective: 1000px; /* <-NB */
}

/* Container box to set the sides relative to */
.cube {
    width: 30%;
    text-align: center;
    margin: 0 auto;

    height: 100px;
    -webkit-transition: -webkit-transform .33s;
    transition: transform .33s; /* Animate the transform properties */
    -webkit-transform-style: preserve-3d;
    transform-style: preserve-3d; /* <-NB */
}

/* The two faces of the cube */
.flippety,.flop {
    background: rgb(247, 247, 247);
    border: 1px solid rgba(147, 184, 189, .8);
    height: 98px;
}

/* Position the faces */
.flippety {
    -webkit-transform: translateZ(50px);
    transform: translateZ(50px);
    background-color: black;
}

.flop {
    -webkit-transform: rotateX(-90deg) translateZ(-50px);
    transform: rotateX(-90deg) translateZ(-50px);
    background-color: red;
}

/* Rotate the cube */
.cube:hover {
    -webkit-transform: rotateX(89deg);
    transform: rotateX(89deg); /* Text bleed at 90º */
}

Проблема в том, что когда я меняю положение коробки, анимация работает неправильно. И когда я меняю размер, при наведении мыши призма вращается, но часть передней грани все еще появляется, когда этого не должно быть.

Живая демонстрация

Ответы (2)

Проблема в том, что perspectiveустановлен на теле, поэтому все преобразования относятся к transform-originтелу (которое по умолчанию 50% 50%или в его середине).

Чтобы получить желаемый эффект, вы хотите сделать perspectiveотносительно промежуточного элемента, что вы можете сделать, поместив другую оболочку вокруг элемента. В итоге это будет выглядеть так :

<div class="cube">
    <div class="inner">
        <div class="flippety">
            <h1>Flippity</h1>
        </div>
        <div class="flop">
            <h2>Flop</h2>
        </div>
    </div>
</div>

с помощью CSS:

.cube {
    -webkit-perspective: 1000px;
}
.inner {
    transform-style: preserve-3d;
    transition: transform .33s;    
    height:100%;
}

/* Position the faces */
.flippety {
    transform: translateZ(50px);
}

.flop {
    transform: rotateX(-90deg) translateZ(-50px);
}

/* Rotate the cube */
.inner:hover {
    transform: rotateX(89.999deg); /* Text bleed at 90º */
}

Вы можете, конечно, обойти добавление другого контейнера, возясь с источником преобразования и используя дополнительный translateY, но использование дополнительного контейнера — правильный способ сделать это.

Примечание: с семантической точки зрения вы не должны использовать h1s внутри чего-то подобного. Они должны использоваться для заголовков страниц и не должны превышать 1 на страницу.

Вот версия с горизонтальным вращением, использующая только CSS.

http://jsfiddle.net/QMQLQ/