>  기사  >  웹 프론트엔드  >  순수 CSS를 사용하여 블록 점프 애니메이션을 구현하는 방법(소스코드 첨부)

순수 CSS를 사용하여 블록 점프 애니메이션을 구현하는 방법(소스코드 첨부)

不言
不言원래의
2018-09-06 17:06:323375검색

이 글의 내용은 순수 CSS를 사용하여 블록 점프 애니메이션을 구현하는 방법에 관한 것입니다. (소스 코드 첨부) 도움이 필요한 친구들이 참고할 수 있기를 바랍니다.

효과 미리보기

순수 CSS를 사용하여 블록 점프 애니메이션을 구현하는 방법(소스코드 첨부)

소스 코드 다운로드

https://github.com/comehope/front-end-daily-challenges

코드 해석

dom을 정의하세요. 컨테이너에는 2개의 하위 요소가 포함됩니다. 각각 소녀 1명과 소년 그룹(4)을 나타내며, 각 span 요소는 사람 1명(사각형 1개)을 나타냅니다. span 元素代表 1 个人(1 个方块):

<figure>
    <span></span>
    <p>
        <span></span>
        <span></span>
        <span></span>
        <span></span>
    </p>
</figure>

居中显示:

body {
    margin: 0;
    height: 100vh;
    display: flex;
    align-items: center;
    justify-content: center;
}

定义容器尺寸和它的子元素布局:

.container {
    width: 8em;
    height: 1em;
    font-size: 35px;
    display: flex;
    justify-content: space-between;
}

画出 5 个方块,用边框作为辅助线帮助定位:

.container span {
    width: 1em;
    height: 1em;
    border: 1px dashed black; /* 辅助线 */
}

.boys {
    width: 6em;
    display: flex;
    justify-content: space-between;
}

用伪元素设置元素的样式,使它们变得柔和一些,为男生和男生填上不同的颜色,同时删掉上一步的辅助线:

.container span::before {    
    content: '';
    position: absolute;
    width: inherit;
    height: inherit;
    border-radius: 15%;
    box-shadow: 0 0 0.2em rgba(0, 0, 0, 0.3);
}

.girl::before {
    background-color: hotpink;
}

.boys span::before {
    background-color: dodgerblue;
}

使 4 个男生色块的颜色逐渐变淡,增加一点层次感:

.boys span:nth-child(1)::before {
    filter: brightness(1);
}

.boys span:nth-child(2)::before {
    filter: brightness(1.15);
}

.boys span:nth-child(3)::before {
    filter: brightness(1.3);
}

.boys span:nth-child(4)::before {
    filter: brightness(1.45);
}

接下来制作动画效果。

先增加女生移动的效果,同时颜色也做渐淡处理,后面其他动画的时间要保持一致,所以把动画时长设置为变量:

.container span {
    width: 1em;
    height: 1em;
    --duration: 3s;
}

.girl {
    animation: slide var(--duration) ease-in-out infinite;
}

@keyframes slide {
    from {
        transform: translateX(0);
        filter: brightness(1);
    }

    to {
        transform: translatex(calc(8em - (1em * 1.25)));
        filter: brightness(1.45);
    }
}

然后增加第 1 个男生跳开的动画效果,注意从 15% 到 35% 旋转的原点是在元素的正上方:

.boys span {
    animation: var(--duration) ease-in-out infinite;
}

.boys span:nth-child(1) {
    animation-name: jump-off-1;
}

@keyframes jump-off-1 {
    0%, 15% {
        transform: rotate(0deg);
    }

    35%, 100% {
        transform-origin: -50% center;
        transform: rotate(-180deg);
    }
}

参考第 1 个男生的动画效果,再增加另外 3 个男生跳开的动画效果,区别只是调整了关键帧的时间,依次后延 15% 的时间:

.boys span:nth-child(2) {
    animation-name: jump-off-2;
}

.boys span:nth-child(3) {
    animation-name: jump-off-3;
}

.boys span:nth-child(4) {
    animation-name: jump-off-4;
}

@keyframes jump-off-2 {
    0%, 30% {
        transform: rotate(0deg);
    }

    50%, 100% {
        transform-origin: -50% center;
        transform: rotate(-180deg);
    }
}

@keyframes jump-off-3 {
    0%, 45% {
        transform: rotate(0deg);
    }

    65%, 100% {
        transform-origin: -50% center;
        transform: rotate(-180deg);
    }
}

@keyframes jump-off-4 {
    0%, 60% {
        transform: rotate(0deg);
    }

    80%, 100% {
        transform-origin: -50% center;
        transform: rotate(-180deg);
    }
}

为第 1 个男生增加拟人的动画效果,这个效果写在 ::before 伪元素中,动画的过程是从正常到压扁、然后抻长、再压扁、最后恢复正常,注意从 25% 到 40% 的压扁变形,因为此时主元素已经翻个儿,所以 transform-origin 的原点和 从 5% 到 15% 的压扁变形的原点不一样:

.boys span::before {
    animation: var(--duration) ease-in-out infinite;
}

.boys span:nth-child(1)::before {
    filter: brightness(1);
    animation-name: jump-down-1;
}

@keyframes jump-down-1 {
    5% {
        transform: scale(1, 1);
    }

    15% {
        transform-origin: center bottom;
        transform: scale(1.3, 0.7);
    }

    20%, 25% {
        transform-origin: center bottom;
        transform: scale(0.8, 1.4);
    }

    40% {
        transform-origin: center top;
        transform: scale(1.3, 0.7);
    }

    55%, 100% {
        transform: scale(1, 1);
    }
}

参考第 1 个男生 ::before 伪元素的动画效果,再增加另外 3 个男生拟人的动画效果,区别只是调整了关键帧的时间,依次后延 15% 的时间:

.boys span:nth-child(2)::before {
    animation-name: jump-down-2;
}

.boys span:nth-child(3)::before {
    animation-name: jump-down-3;
}

.boys span:nth-child(4)::before {
    animation-name: jump-down-4;
}

@keyframes jump-down-2 {
    20% {
        transform: scale(1, 1);
    }

    30% {
        transform-origin: center bottom;
        transform: scale(1.3, 0.7);
    }

    35%, 40% {
        transform-origin: center bottom;
        transform: scale(0.8, 1.4);
    }

    55% {
        transform-origin: center top;
        transform: scale(1.3, 0.7);
    }

    70%, 100% {
        transform: scale(1, 1);
    }
}

@keyframes jump-down-3 {
    35% {
        transform: scale(1, 1);
    }

    45% {
        transform-origin: center bottom;
        transform: scale(1.3, 0.7);
    }

    50%, 55% {
        transform-origin: center bottom;
        transform: scale(0.8, 1.4);
    }

    70% {
        transform-origin: center top;
        transform: scale(1.3, 0.7);
    }

    85%, 100% {
        transform: scale(1, 1);
    }
}

@keyframes jump-down-4 {
    50% {
        transform: scale(1, 1);
    }

    60% {
        transform-origin: center bottom;
        transform: scale(1.3, 0.7);
    }

    65%, 70% {
        transform-origin: center bottom;
        transform: scale(0.8, 1.4);
    }

    85% {
        transform-origin: center top;
        transform: scale(1.3, 0.7);
    }

    100%, 100% {
        transform: scale(1, 1);
    }
}

至此,女生从左侧移动到右侧的动画效果已经完成。
把所有动画属性都加上 alternate

.girl {
    animation: slide var(--duration) ease-in-out infinite alternate;
}

.boys span {
    animation: var(--duration) ease-in-out infinite alternate;
}

.boys span::before {
    animation: var(--duration) ease-in-out infinite alternate;
}
중앙 표시:

rrreee

컨테이너 크기와 하위 항목의 레이아웃 정의 요소 :

rrreee

테두리를 보조선으로 사용하여 5개의 사각형을 그려 위치 지정을 돕습니다.

rrreee의사 요소를 사용하여 요소의 스타일을 지정하여 더 부드럽게 만들고 남자아이와 여자아이를 위해 다른 색상으로 채우고 상단을 삭제합니다. -보조선 단계: rrreee

네 소년의 컬러 블록의 색상을 점차적으로 연하게 만들고 약간의 레이어링 추가:

rrreee 다음으로 애니메이션 효과를 만듭니다.

먼저 소녀가 움직이는 효과를 추가하고 색상도 희미해지게 합니다. 다른 애니메이션의 타이밍은 일관성이 있어야 하므로 애니메이션 지속 시간을 변수로 설정하세요.

rrreee

그런 다음 첫 번째 소년이 점프하는 애니메이션 효과를 추가하세요. 15%에서 35%까지의 회전 원점은 요소 바로 위에 있습니다. 🎜rrreee🎜 첫 번째 소년의 애니메이션 효과를 참조한 다음 다른 3명의 소년이 점프하는 애니메이션 효과를 추가하세요. 키 프레임의 시간을 순서대로 조정하려면 시간의 15% 지연: 🎜rrreee🎜 첫 번째 소년에게 의인화 애니메이션 효과를 추가하세요. 이 효과는 ::before 의사 요소에 작성됩니다. 애니메이션 과정은 노멀에서 스쿼시, 늘이기, 편평화, 최종적으로는 평탄화 변형에 주의하세요. 이때 주요 요소가 뒤집어졌기 때문에 원점이 됩니다. transform-origin과 5%에서 15%의 찌그러짐과 변형의 원점이 다릅니다: 🎜rrreee🎜 첫 번째 소년의 ::before애니메이션 효과 참조 > 의사 요소, 그리고 소년의 다른 3가지 의인화 애니메이션 효과를 추가합니다. 차이점은 단지 조정일 뿐입니다. 키 프레임 시간이 15% 지연됩니다. 🎜rrreee🎜이 시점에서 소녀의 애니메이션 효과는 왼쪽에서 왼쪽으로 이동합니다. 권리가 완료되었습니다. 🎜모든 애니메이션 속성에 alternate 매개변수를 추가하면 모든 애니메이션이 앞뒤로 실행되어 오른쪽에서 왼쪽으로 돌아가는 효과를 얻을 수 있습니다. 🎜rrreee🎜완료되었습니다! 🎜🎜관련 추천: 🎜🎜🎜순수 CSS를 사용하여 고리 회전 환상의 애니메이션 효과를 얻는 방법(소스 코드 첨부)🎜🎜🎜🎜순수 CSS를 사용하여 나비 표본의 표시 프레임 효과를 얻는 방법🎜🎜🎜🎜

위 내용은 순수 CSS를 사용하여 블록 점프 애니메이션을 구현하는 방법(소스코드 첨부)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.