人與人之間都是具有彈性的,好人就會被凹一下(='X'=),同事:「诶你用完囉,今天進度幫我一下好不好~」
今天我們來實作Day #18
CodePen: https://codepen.io/stevetanus/pen/QWraKpp
<div class="frame">
<div class="top"></div>
<div class="ball"></div>
<div class="bottom"></div>
<div class="ellipse">
<div class="grey"></div>
<div class="green"></div>
</div>
</div>
.top
是上面的灰色背景,.bottom
是下面的綠色背景,.ball
是我自己加上去的球,打算隨著介面的彈性彈上去,.ellipse
內有兩個橢圓,分別是.grey
和.green
。
$green: #37d493;
$grey: #444;
$speed: 5s; // 動畫時間
$e-width: 420px; // 橢圓的寬
$e-w-offset: -10px; // 寬度的抵銷,使寬420px的橢圓置中
$e-height: 400px; // 橢圓的高
.top {
position: absolute;
width: 100%;
height: 200px; // 下半
top: 0;
left: 0;
background: $grey;
}
.bottom {
@extend .top;
top: 50%; // 下半
background: $green;
}
.ellipse {
position: absolute;
z-index: 2;
width: $e-width; // 420px
height: $e-height; // 400px
top: 0;
left: $e-w-offset; // -10px
transform-style: preserve-3d; // tfs為快捷鍵
animation: elastic $speed ease-in-out infinite;
將橢圓設為3D屬性,使得背面的背景色可以看到,再將.grey
跟.green
分別設成正面和背面,加上動畫elastic
的旋轉效果。
.grey {
position: absolute;
width: $e-width;
height: $e-height;
background: $grey;
backface-visibility: hidden; // bf為快捷鍵
border-radius: 50%;
z-index: 2;
rotate: x 0deg;
}
.green {
@extend .grey;
background: $green;
z-index: 1;
rotate: x 180deg; // 以X軸為軸心旋轉180度,來到背面
}
.grey
的z-index
較大,所以將backface-visibility
設為隱藏,使得背面的.green
可以顯現。
.ball {
blur: 10px;
position:relative;
width:100px;
height:100px;
border-radius:50%;
top:100px;
left:150px;
background: rgb(9,21,233);
background: linear-gradient(90deg, $green 0%, rgba(84,111,191,1) 100%);
z-index:3;
animation: ball 5s ease-in-out infinite;
}
z-index
設為3高過於.grey
和.green
,加上ball
的動畫,透過top
跟left
的屬性調整位置,隨著介面而移動。
@keyframes elastic {
0% {
rotate: x 90deg;
}
... // 旋轉角度越來越小,正面背景灰色逐漸往下。
65% {
rotate: x 30deg; // 下到底點,猛力回彈
}
70% {
rotate: x 130deg;
}
75% {
rotate: x 60deg;
}
80% {
rotate: x 110deg;
}
85% {
rotate: x 80deg;
}
90% {
rotate: x 97deg;
}
95% {
rotate: x 87deg;
}
100% {
rotate: x 90deg;
}
}
elastic介面70%~100%的彈跳幅度趨緩,回到rotate: x 90deg
的原點。
@keyframes ball {
0% {
top:100px;
left:150px;
}
... // 0% ~ 65% 球逐漸下滑,從0deg逐漸旋轉到180deg
65% {
top:274px;
left:150px;
}
// 猛力回彈,旋轉停止並從180開始轉向0deg
70% {
top:-200px;
left:150px;
rotate: 180deg;
}
90% {
top:-100px;
left:150px;
}
100% {
top:100px;
left:150px;
}
}
配合elastic
和ball
的動畫後,產生以下的作品
CSS
目標 | 屬性 |
---|---|
彈性介面 | 寬度大於.frame 的3d橢圓形,裡面有前面和後面的背景色(rotate x: 180deg ),配合z-index 跟backface-visibility |
彈性動畫 | rotate x 屬性的調整 |
彈跳球 | top 屬性配合動畫調整 |
第20天,感謝各位的觀看~咱們明天見!