а зачем через keyframes? обычный transition может анимировать opacity