CSS переход - два направления?
Вот грубый пример, чтобы помочь показать, что я хотел бы: http://jsfiddle.net/GVaNv/
Мне было интересно, если есть в любом случае, чтобы сделать наложение transition
в слева, но затем уйти с правой стороны.
Таким образом, при наведении наложение появляется, как в примере, но вместо того, чтобы отступить назад влево, transition
с направо.
Это возможно? (не обязательно использовать transition
Я открыт для любого способа сделать это).
3 ответа
Вот простое решение, которое не требует больше HTML или JavaScript:
HTML-код:
<div class="box">
<div class="overlay">
Overlay
</div>
</div>
Код CSS:
.box {
height: 250px;
width: 250px;
background: aqua;
position: relative;
overflow: hidden;
}
.overlay {
position: absolute;
background-color: rgba(0, 0, 0, 0.5);
width: 100%;
color: white;
padding: 10px;
left: -270px;
margin-left: 520px;
bottom: 0;
transition: left 300ms linear, margin-left 300ms ease-out;
}
.box:hover .overlay {
left: 0;
margin-left: 0;
transition: left 300ms ease-out;
}
Это использует запас для анимации. Это работает следующим образом:
- Состояние покоя установлено справа от элемента с помощью поля (в то время как
left
расположен слева от элемента). - При наведении мы устанавливаем поле на
0
без анимации. Это позволяетleft
анимация происходит с левой стороны элемента. - После наведения мыши поле анимируется, чтобы перейти в исходное состояние с правой стороны элемента.
Я пытался добиться этого только с помощью CSS, включая добавление разметки div, как показано ниже. DEMO
HTML
<div class="box">
<div class="overlay">
Overlay
</div>
<div class="overlayFalse">
Overlay false
</div>
</div>
CSS
.box {
height: 250px;
width: 250px;
background: aqua;
position: relative;
overflow: hidden;
}
.overlay, .overlayFalse {
position: absolute;
background-color: rgba(0, 0, 0, 0.5);
width: 96%;
color: white;
padding: 2%;
right:-274px;
bottom: 0;
transition: right 300ms ease-out, left 300ms ease-out;
}
.overlayFalse{
opacity:0;
right:auto;
left:-274px;
}
.box:hover .overlay {
right:0;
opacity:0;
}
.box:hover .overlayFalse{
opacity:1;
left:0;
}
Возможно, вы можете использовать анимацию CSS3, используя одну для вставки, а другую для выдвижения:
@keyframes overlay-in {
from {
left: -999px;
}
to {
left: 0;
}
}
@keyframes overlay-out {
from {
left: 0;
}
to {
left: 999px;
}
}
Теперь вы можете применить overlay-in
анимация на :hover
и другой в определении нормального элемента:
.box .overlay {
/* other definitions ... */
animation-name: overlay-out;
animation-duration: 1000ms;
animation-fill-mode: none;
}
.box:hover .overlay {
animation-name: overlay-in;
animation-duration: 600ms;
animation-fill-mode: forwards;
}
Но есть одна проблема: анимация слайда будет воспроизводиться один раз при загрузке страницы. Я не могу найти способ предотвратить это без крошечного JavaScript, добавив класс в оверлей на первом mouseout
событие. Я сделал это таким образом в JSFiddle.
Но, разумеется, как только вам потребуется JavaScript, вы также можете использовать простые переходы. Но этот метод работает даже без JavaScript, если вы можете жить с анимацией, воспроизводимой при загрузке страницы.