溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何使用CSS創(chuàng)建一個炫酷的球體動畫效果

發(fā)布時間:2022-02-28 15:13:21 來源:億速云 閱讀:162 作者:小新 欄目:web開發(fā)

這篇文章給大家分享的是有關如何使用CSS創(chuàng)建一個炫酷的球體動畫效果的內容。小編覺得挺實用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

  1.使用Jade和SCSS生成一個圓圈

  創(chuàng)建一個圓圈的第一步是生成所有組成圓圈的粒子。有了Jade,我們不用一個一個的寫出200個div。

  以下的代碼創(chuàng)建了一個容器.mommy和200個div:

  .mommy

  - for (var x = 0; x < 200; x++)

  div

  添加一點CSS確認一下200個div已經(jīng)生成:

  .mommy{

  border:1px solid black;

  }

  div{

  width: 4px;

  height: 4px;

  background:red;

  }

  正如下面你所看到的,我們生成了一個800px高的紅色方塊,它是由200個div組成的。

  接下來,我們要將這200個div分別定位在不同的位置組成一個圓圈,并通過SCSS來實現(xiàn)。

  在上面的CSS中還需要再添加一些設置,給所有的div設置絕對定位,并將它們向左和向上移動2px的距離,這樣div的中心點與容器的0,0坐標點就重合了。然后,我們設置容器為固定的寬高大小。

  .mommy{

  border:1px solid black;

  width: 400px;

  height: 400px;

  position: relative;

  }

  div{

  width: 4px;

  height: 4px;

  background:red;

  position: absolute;

  top: -2px;

  left: -2px;

  }

  通過SCSS,我們可以在for循環(huán)中為每一個div設置不同的位置,這樣就不必手動的一個一個去設置。首先創(chuàng)建一個變量,它的值等于div的個數(shù),這樣在后面如果要用到div的數(shù)量值時,直接引用這個變量就可以了。如果有一天需要改變成400個div,只需要在CSS中改變變量的值就可以了。

  $amount : 200;

  @for $i from 1 through $amount {

  //循環(huán)中的代碼

  }

  現(xiàn)在我們就可以在循環(huán)中改變每個div的坐標了,這需要一點點的數(shù)學計算。

  以下的函數(shù)就是生成圓圈的坐標點的計算公式:

  x = cos((index/amount)*(PI*2))*radius + radius;

  y = sin((index/amount)*(PI*2))*radius + radius;

  用SCSS來表示上面的公式就是:

  $x : cos(($i/$amount)*360deg)*200px + 200;

  $y : sin(($i/$amount)*360deg)*200px + 200;

  然后我們將通過公式計算得出的點坐標應用在每個div上:

  div:nth-child(#{$i}){

  transform: translate3d($x, $y,0px);

  }

  這是第一步生成的結果,雖然不是很漂亮,但是,嗯,你從零開始創(chuàng)造了一個圓圈!

  2.將圓圈變成一個球體

  現(xiàn)在我們有了一個用SCSS生成的圓圈,但是我們需要的是一個球體。圓圈是一個二維圖形,而球體是一個三維立體圖形。二維幾何圖形只有兩個軸:X軸和Y軸,而對于三維,又多了一個坐標軸:Z軸。這意味著我們還要計算每個div在Z軸上的位置坐標。幸運的是,已經(jīng)有成熟的公式幫助我們來定位球體上每個元素的位置,我不會詳細的介紹公式的原理(屬于數(shù)學范疇),我們只需要使用就可以了:

  &theta; : (index / amount) * 120;

  &delta; : (index / amount) * PI;

  x : radius * cos(&delta;) * cos(&theta;);

  y : radius * cos(&delta;) * sin(&theta;);

  z : radius * sin(&delta;);

  現(xiàn)在我們有了以上的函數(shù),它可以完全滿足我們的需求,我們把它插入到循環(huán)中。

  @for $i from 1 through $amount {

  $theta : ($i / $amount) * 120;

  $delta : ($i / $amount) * pi();

  $x : 200px * cos($delta) * cos($theta) + 200; //+200 to center our sphere in our 3D world

  $y : 200px * cos($delta) * sin($theta) + 200; //+200 to center our sphere in our 3D world

  $z : 200px * sin($delta);

  div:nth-child(#{$i}){

  transform: translate3d($x, $y,$z);

  }

  }

  下面就是生成的球體效果,正如你所看到的,所有的div都有重新有了新的位置,但是我們看到的好像仍然是平面效果,不是3D立體的。

  在CSS中有一個叫perspective的屬性,它允許我們?yōu)槿魏卧卦O置一個特定的透視值。在我們的例子中,我們希望在容器.mommy設置3D效果。并且還需要設置一個transform-style: preserve-3d;這樣所有的div就處于立體坐標系中了。

  現(xiàn)在我們可以看到所有div的大小都變得不一樣了。div距離“屏幕”的距離越遠,它就會越小,這意味著它們已經(jīng)處于立體坐標系中了!

  3.旋轉球體

  所有的div已經(jīng)就緒了,接下來我們就要看到最后的結果了。我們設置一個僅有一個關鍵幀的動畫效果:

  .mommy{

  [...]

  animation: rotation 10s linear infinite;

  }

  @keyframes rotation{

  to{

  transform:rotateY(360deg);

  }

  }

  你可能已經(jīng)注意到,有些div不是正面屏幕而是與屏幕成90&deg;時,它們就會消失看不到。為了防止這種情況的發(fā)生,我們需要給每個div一個反方向的旋轉,讓它們的正面始終面對屏幕顯示。

  我們要在div上應用一個反方向的旋轉,但是由于已經(jīng)應用了一個轉換,我們將利用偽元素,它將成為紅色的小方塊。這樣,div本身只需要提供定位作用就可以了,并且設置一個transform-style屬性,讓div處于3D環(huán)境中。

  div{

  [...]

  transform-style: preserve-3d;

  &:before{

  content:"";

  display: block;

  width: 4px;

  height:4px;

  background:red;

  animation: rotation 10s infinite linear reverse;

  }

  }

感謝各位的閱讀!關于“如何使用CSS創(chuàng)建一個炫酷的球體動畫效果”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,讓大家可以學到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權內容。

css
AI