CSS过渡(transition)是指在CSS属性值发生变化时,浏览器平滑地从一个状态过渡到另一个状态的效果。默认情况下,过渡效果是从初始状态直接过渡到结束状态,但开发者可以通过多种方式控制过渡的方向和路径。
首先需要澄清:CSS标准中并没有一个名为transition-direction
的属性(这与CSS动画的animation-direction
不同)。这是一个常见的误解。
通过设置不同的初始和结束状态来改变过渡方向:
/* 默认方向:从左到右 */
.box {
transform: translateX(0);
transition: transform 0.5s ease;
}
.box:hover {
transform: translateX(100px);
}
/* 反转方向:从右到左 */
.box.reverse {
transform: translateX(100px);
}
.box.reverse:hover {
transform: translateX(0);
}
通过延迟开始时间可以创建"反向"效果:
.box {
width: 100px;
transition: width 0.5s ease 0.5s; /* 延迟0.5秒开始 */
}
.box:hover {
width: 200px;
transition: width 0.5s ease 0s; /* 立即开始 */
}
如果需要更精确的方向控制,可以使用CSS动画:
@keyframes slide {
from { transform: translateX(0); }
to { transform: translateX(100px); }
}
.box {
animation: slide 1s ease infinite alternate; /* alternate使动画来回播放 */
}
const box = document.querySelector('.box');
box.addEventListener('mouseenter', () => {
box.style.transition = 'transform 0.5s ease-out';
box.style.transform = 'translateX(100px)';
});
box.addEventListener('mouseleave', () => {
box.style.transition = 'transform 0.5s ease-in';
box.style.transform = 'translateX(0)';
});
通过transition-timing-function
可以控制过渡的速度曲线,间接影响过渡的"方向感":
.box {
transition: all 1s cubic-bezier(0.68, -0.6, 0.32, 1.6);
/* 自定义贝塞尔曲线可以创建弹性、反弹等效果 */
}
问题:为什么我的过渡效果没有反向?
问题:如何创建双向过渡(如悬停和离开时有不同效果)?
.box {
transition:
transform 0.3s ease-out,
opacity 0.3s ease-in;
}
.box:hover {
transform: scale(1.1);
opacity: 0.8;
transition:
transform 0.3s ease-in,
opacity 0.3s ease-out;
}
通过以上方法,你可以灵活控制CSS过渡的方向和效果,创建更丰富的交互体验。