CSSでジェットコースタースタイルのアニメーションを作成しようとしています。
「コースター」をループ段階でカーブさせる方法を知りたい。
私はすべてのCSSソリューションを探していますが、JavaScriptが少し必要な場合はそれで問題ありません。
これまでの私のコード:
#container {
width: 200px;
height: 300px;
margin-top: 50px;
position: relative;
animation: 10s infinite loop;
animation-timing-function: linear;
}
#coaster {
width: 100px;
height: 10px;
background: lightblue;
position: absolute;
bottom: 0;
left: 1px;
right: 1px;
margin: 0 auto;
}
@keyframes loop {
from {
margin-left: -200px;
}
30% {
margin-left: calc(50% - 75px);
transform: rotate(0deg);
}
60% {
margin-left: calc(50% - 125px);
transform: rotate(-360deg);
}
to {
transform: rotate(-360deg);
margin-left: 100%;
}
}
<div id="container">
<div id="coaster"></div>
</div>
以下のアプローチは多かれ少なかれ健全だと思います(ただし、この急いでの実装は完全ではないことに最初に同意するでしょう)。
ジェットコースターが<div>
で表される代わりに、border-bottom
の<div>
で表されます。
その境界線自体の同時アニメーションでは、border-bottom-left-radius
とborder-bottom-left-radius
が50%
に曲がり、その後0
に曲がります。
使用例:
#container {
width: 180px;
height: 180px;
position: relative;
animation: 10s loop-container linear infinite;
}
#coaster {
width: 180px;
height: 180px;
border-bottom: 10px solid lightblue;
position: absolute;
bottom: 0;
left: 1px;
right: 1px;
margin: 0 auto;
animation: 10s loop-coaster linear infinite;
}
@keyframes loop-container {
0% {
margin-left: -200px;
}
30% {
margin-left: calc(50% - 75px);
transform: rotate(0deg);
}
60% {
margin-left: calc(50% - 125px);
transform: rotate(-360deg);
}
100% {
transform: rotate(-360deg);
margin-left: 100%;
}
}
@keyframes loop-coaster {
30% {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
31% {
border-bottom-left-radius: 0;
border-bottom-right-radius: 25%;
}
35%, 55% {
border-bottom-left-radius: 50%;
border-bottom-right-radius: 50%;
}
59% {
border-bottom-left-radius: 25%;
border-bottom-right-radius: 0;
}
60% {
border-bottom-left-radius: 0;
border-bottom-right-radius: 0;
}
}
<div id="container">
<div id="coaster"></div>
</div>
自然には見えませんがborder-radius
を始めるのに良い方法のようです:
#container {
width: 200px;
height: 300px;
margin-top: 50px;
position: relative;
animation: 10s infinite loop;
animation-timing-function: linear;
}
#coaster {
width: 100px;
height: 10px;
background: lightblue;
position: absolute;
bottom: 0;
left: 1px;
right: 1px;
margin: 0 auto;
animation: 10s infinite coasterAnimation;
}
@keyframes loop {
from {
margin-left: -200px;
}
30% {
margin-left: calc(50% - 75px);
transform: rotate(0deg);
}
60% {
margin-left: calc(50% - 125px);
transform: rotate(-360deg);
}
to {
transform: rotate(-360deg);
margin-left: 100%;
}
}
@keyframes coasterAnimation {
29% {
border-radius: 0;
}
30% {
border-radius: 0 0 50% 50%;
}
59% {
border-radius: 0 0 50% 50%;
}
60% {
border-radius: 0;
}
70% {
border-radius: 0;
}
}
<div id="container">
<div id="coaster"></div>
</div>