Я пытаюсь найти способ, как сделать этот 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º */
}
Проблема в том, что когда я меняю положение коробки, анимация работает неправильно. И когда я меняю размер, при наведении мыши призма вращается, но часть передней грани все еще появляется, когда этого не должно быть.
Проблема в том, что 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
, но использование дополнительного контейнера — правильный способ сделать это.
Примечание: с семантической точки зрения вы не должны использовать h1
s внутри чего-то подобного. Они должны использоваться для заголовков страниц и не должны превышать 1 на страницу.
Вот версия с горизонтальным вращением, использующая только CSS.