You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CSS动画仅设置translateY为何改变translateX及解决方法

问题产生原因

CSS的transform是整体赋值的复合属性,不存在“只修改其中某一个变换值、其余值保留”的默认行为。你给.div设置的基础样式transform: translateX(-50%),会被动画关键帧中声明的transform: translateY(-10px)直接整体替换,导致原有X轴位移在动画过程中丢失,表现为X轴位置被异常修改。
另外你贴的基础样式代码存在笔误:.div选择器后缺失开括号{,修复后样式才会正常生效。

实现仅修改Y轴位移的方案

方案1:关键帧中补全所有transform值

在动画每个关键帧的transform声明里,把需要保留的X轴位移一并写上,保证动画过程中transform值始终包含原有X轴偏移:

.div {
    transform: translateX(-50%);
}

.fade-in {
    animation-name: fade-in;
    animation-duration: .2s;
}

.fade-out {
    animation-name: fade-out;
    animation-duration: .2s;
}

@keyframes fade-out {
    0% {
        opacity: 100%;
        transform: translateX(-50%);
    }
    100% {
        opacity: 0%;
        transform: translateX(-50%) translateY(-10px);
    }
}

@keyframes fade-in {
    0% {
        opacity: 50%;
        transform: translateX(-50%) translateY(-10px);
    }
    100% {
        opacity: 100%;
        transform: translateX(-50%);
    }
}

这种写法兼容性最好,所有支持CSS动画的浏览器都能正常运行。

方案2:使用独立变换属性

现代浏览器支持拆分的独立变换属性,你可以把X、Y轴位移通过translate属性单独声明,不同轴的位移不会互相覆盖,代码维护成本更低:

.div {
    /* 独立translate属性,第一个值为X轴偏移,第二个为Y轴偏移 */
    translate: -50% 0;
}

.fade-in {
    animation-name: fade-in;
    animation-duration: .2s;
}

.fade-out {
    animation-name: fade-out;
    animation-duration: .2s;
}

@keyframes fade-out {
    0% {
        opacity: 100%;
    }
    100% {
        opacity: 0%;
        /* 仅修改Y轴偏移值,X轴自动继承基础样式的-50% */
        translate: -50% -10px;
    }
}

@keyframes fade-in {
    0% {
        opacity: 50%;
        translate: -50% -10px;
    }
    100% {
        opacity: 100%;
        translate: -50% 0;
    }
}

注意:独立变换属性不支持IE浏览器,如果需要兼容老旧浏览器请选择方案1。

内容的提问来源于stack exchange,提问作者Edwin Slotboom

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 14:54:38