이 글의 내용은 순수 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!