iT邦幫忙

2022 iThome 鐵人賽

DAY 5
0
自我挑戰組

Do you wanna play? CSS game ぎりぎり系列 第 5

[Day 5] Loadinggg: 這30天Loading好重(?

  • 分享至 

  • xImage
  •  

Loading

滴..滴滴..滴滴滴,讀取完成!/images/emoticon/emoticon35.gif
今天我們來實作Day #4

我們在讀取網頁期間,常會看到不同的讀取畫面,雖然讀取有可能讓人厭煩,但看到漂亮的loading畫面,好像就輕鬆了些 ~ 那就讓我們開始吧!
CodePen: https://codepen.io/stevetanus/pen/OJZXZwW


1. HTML

<div class="frame">
  <div class="center">
    <div class="circle1"></div>
    <div class="circle2"></div>
    <div class="circle3"></div>
  </div>
</div>

這個作品需要三個圓圈圈,.circle1circle2circle3


2. SCSS(CSS)

.center

.frame {
  width: 400px;
  height: 400px;
  position: absolute;
  .center {
    position: absolute;
    top: 100px;
    left: 100px;
    ...}
}

我們將.center定位在.frame的(100,100)的位置。

.circle1

.circle1 {
  position: absolute;
  top: 85px;
  left: 85px;
  width: 30px;
  height: 30px;
  border-radius: 50%;
  z-index: 3;

因為.frame的寬度為400px,在.center往右往下推100px之下,我們在.circle1往右往下推85px,加上圓圈的半徑15px,剛好固定.circle1在畫布中心。z-index: 3(z3)使.circle1成為最上面的圓圈。

.circle2, .circle3

.circle2 {
  position: absolute;
  left: 75px;
  top: 75px;
  width: 50px;
  height: 50px;
  z-index: 2;
  ...}
.circle3 {
  position: absolute;
  width: 80px;
  height: 80px;
  top: 60px;
  left: 60px;
  z-index: 1;
  ...}

.circle2.circle3分別為半徑25px、半徑40px的圓圈,跟上面一樣的方法置中,z-index分別設為2跟1。
現在的圖形大概長成這樣:
https://ithelp.ithome.com.tw/upload/images/20220912/201521918zN7ZXkZbA.jpg

動畫 (box-shadow & scale)

在此作品中,三個圓圈的動畫大致相同,在box-shadowscale產生變化:

@keyframes jump-jump-1 {
  0%,
  70% {
    box-shadow: 2px 2px 3px 2px rgba(0, 0, 0, 0.2);
    transform: scale(0);
  }

  100% {
    box-shadow: 10px 10px 15px 0 rgba(0, 0, 0, 0.3);
    transform: scale(1);
  }
}

@keyframes jump-jump-2 {
  0%,
  40% {
    box-shadow: 2px 2px 3px 2px rgba(0, 0, 0, 0.2);
    transform: scale(0);
  }

  100% {
    box-shadow: 10px 10px 15px 0 rgba(0, 0, 0, 0.3);
    transform: scale(1);
  }
}

@keyframes jump-jump-3 {
  0%,
  10% {
    box-shadow: 2px 2px 3px 2px rgba(0, 0, 0, 0.2);
    transform: scale(0);
  }
  100% {
    box-shadow: 10px 10px 15px 0 rgba(0, 0, 0, 0.3);
    transform: scale(1);
  }
}

可以看到差別在於開始動畫的時刻,.circle1為70%,.circle2為40%,.circle3為10%,因此.circle3最先scale(1)且陰影放大,再來.circle2,最後.circle3

https://developer.mozilla.org/en-US/docs/Web/CSS/@keyframes

那要如何呈現反向的動畫呢? (animate-direction: alternate)

我們看到圓圈套用的動畫:

.circle1 {
  animation: jump-jump-1 2s $bezier infinite alternate;
  ...}
.circle2 {
  animation: jump-jump-2 2s $bezier infinite alternate;
  ...}
.circle3 {
  animation: jump-jump-3 2s $bezier infinite alternate;
  ...}

animation的最後都加上了alternate,這是animate-direction: alternate的縮寫,讓動畫正向跑完之後會反向進行,而infinite使得動畫會無限輪迴地進行(animation-iteration-count: infinite;)。

https://www.w3schools.com/css/css3_animations.asp

動畫速度

$bezier: cubic-bezier(0.21, 0.98, 0.6, 0.99);
https://cubic-bezier.com/#.21,.98,.6,.99
此動畫速度跟ease-in-out很像,中間快速變化,特別強調開始與結束的效果,配上alternate的屬性,使作品停留在滿圓圈的效果十分顯著。


打包帶走(take away)

CSS

目標 屬性
動畫方向 animation-direction: alternate
圓形置中 left, right (考量半徑)
動畫放大 box-shadow, scale

後記

今天是風雨交加的颱風天,就算提早了半小時出門,搭上了公車,卻還是感覺到交通比平常更為阻塞呢 ~ 下班後吃著麥當勞繼續寫文章。


上一篇
[Day 4] The Pyramide: 金字塔日落陰影動畫
下一篇
[Day 6] Statistic: 來呈現文章瀏覽數逐漸下滑的趨勢(>_<)
系列文
Do you wanna play? CSS game ぎりぎり30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

1
小哈片刻
iT邦研究生 4 級 ‧ 2022-09-12 21:01:59

很棒的範例!

謝謝你~~~

我要留言

立即登入留言