web前端入門到實(shí)戰(zhàn):使用CSS創(chuàng)建一個(gè)炫酷的球體動(dòng)畫效果

一個(gè)純CSS實(shí)現(xiàn)的球體動(dòng)畫效果:

經(jīng)過研究上面的效果實(shí)現(xiàn)起來大致可以分為五個(gè)步驟膘侮,下面就來一一介紹士鸥。

1.使用Jade和SCSS生成一個(gè)圓圈

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

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

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

添加一點(diǎn)CSS確認(rèn)一下200個(gè)div已經(jīng)生成:

.mommy{
  border:1px solid black;
}
div{
  width: 4px;
  height: 4px;
  background:red;
}
專門建立的學(xué)習(xí)Q-q-u-n: 731771211侍郭,分享學(xué)習(xí)方法和需要注意的小細(xì)節(jié),不停更新最新的教程和學(xué)習(xí)技巧
(從零基礎(chǔ)開始到前端項(xiàng)目實(shí)戰(zhàn)教程掠河,學(xué)習(xí)工具亮元,全棧開發(fā)學(xué)習(xí)路線以及規(guī)劃)

正如下面你所看到的,我們生成了一個(gè)800px高的紅色方塊唠摹,它是由200個(gè)div組成的爆捞。

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

在上面的CSS中還需要再添加一些設(shè)置,給所有的div設(shè)置絕對(duì)定位藕赞,并將它們向左和向上移動(dòng)2px的距離成肘,這樣div的中心點(diǎn)與容器的0,0坐標(biāo)點(diǎn)就重合了斧蜕。然后双霍,我們?cè)O(shè)置容器為固定的寬高大小。

.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)中為每一個(gè)div設(shè)置不同的位置店煞,這樣就不必手動(dòng)的一個(gè)一個(gè)去設(shè)置蟹演。首先創(chuàng)建一個(gè)變量,它的值等于div的個(gè)數(shù)顷蟀,這樣在后面如果要用到div的數(shù)量值時(shí)酒请,直接引用這個(gè)變量就可以了。如果有一天需要改變成400個(gè)div鸣个,只需要在CSS中改變變量的值就可以了羞反。

$amount : 200;
@for $i from 1 through $amount {
  //循環(huán)中的代碼
}

現(xiàn)在我們就可以在循環(huán)中改變每個(gè)div的坐標(biāo)了,這需要一點(diǎn)點(diǎn)的數(shù)學(xué)計(jì)算囤萤。

以下的函數(shù)就是生成圓圈的坐標(biāo)點(diǎn)的計(jì)算公式:

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;

然后我們將通過公式計(jì)算得出的點(diǎn)坐標(biāo)應(yīng)用在每個(gè)div上:

div:nth-child(#{$i}){
    transform: translate3d($x, $y,0px);
}

這是第一步生成的結(jié)果昼窗,雖然不是很漂亮,但是涛舍,嗯澄惊,你從零開始創(chuàng)造了一個(gè)圓圈!

2.將圓圈變成一個(gè)球體

現(xiàn)在我們有了一個(gè)用SCSS生成的圓圈富雅,但是我們需要的是一個(gè)球體掸驱。圓圈是一個(gè)二維圖形,而球體是一個(gè)三維立體圖形没佑。二維幾何圖形只有兩個(gè)軸:X軸和Y軸毕贼,而對(duì)于三維,又多了一個(gè)坐標(biāo)軸:Z軸蛤奢。這意味著我們還要計(jì)算每個(gè)div在Z軸上的位置坐標(biāo)鬼癣。幸運(yùn)的是,已經(jīng)有成熟的公式幫助我們來定位球體上每個(gè)元素的位置啤贩,我不會(huì)詳細(xì)的介紹公式的原理(屬于數(shù)學(xué)范疇)待秃,我們只需要使用就可以了:

θ : (index / amount) * 120;
δ : (index / amount) * PI;
x : radius * cos(δ) * cos(θ);
y : radius * cos(δ) * sin(θ);
z : radius * sin(δ);

現(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);
  }
}
專門建立的學(xué)習(xí)Q-q-u-n: 731771211,分享學(xué)習(xí)方法和需要注意的小細(xì)節(jié)痢掠,不停更新最新的教程和學(xué)習(xí)技巧
(從零基礎(chǔ)開始到前端項(xiàng)目實(shí)戰(zhàn)教程,學(xué)習(xí)工具嘲恍,全棧開發(fā)學(xué)習(xí)路線以及規(guī)劃)

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

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

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

3.旋轉(zhuǎn)球體

所有的div已經(jīng)就緒了颓遏,接下來我們就要看到最后的結(jié)果了徐矩。我們?cè)O(shè)置一個(gè)僅有一個(gè)關(guān)鍵幀的動(dòng)畫效果:

.mommy{
  [...]
  animation: rotation 10s linear infinite; 
}
@keyframes rotation{
  to{
    transform:rotateY(360deg);
  }
}

你可能已經(jīng)注意到,有些div不是正面屏幕而是與屏幕成90°時(shí)叁幢,它們就會(huì)消失看不到滤灯。為了防止這種情況的發(fā)生,我們需要給每個(gè)div一個(gè)反方向的旋轉(zhuǎn)曼玩,讓它們的正面始終面對(duì)屏幕顯示鳞骤。

我們要在div上應(yīng)用一個(gè)反方向的旋轉(zhuǎn),但是由于已經(jīng)應(yīng)用了一個(gè)轉(zhuǎn)換演训,我們將利用偽元素弟孟,它將成為紅色的小方塊。這樣样悟,div本身只需要提供定位作用就可以了拂募,并且設(shè)置一個(gè)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; 
  }
}
專門建立的學(xué)習(xí)Q-q-u-n: 731771211陈症,分享學(xué)習(xí)方法和需要注意的小細(xì)節(jié),不停更新最新的教程和學(xué)習(xí)技巧
(從零基礎(chǔ)開始到前端項(xiàng)目實(shí)戰(zhàn)教程震糖,學(xué)習(xí)工具录肯,全棧開發(fā)學(xué)習(xí)路線以及規(guī)劃)

塔達(dá)!CSS球體的效果就這樣做好了吊说!

4.更炫的球體

在以上代碼的基礎(chǔ)上论咏,我們發(fā)散思維,可以做出更加炫酷的球體效果:

想要學(xué)習(xí)以上所有球體動(dòng)畫的代碼可以加入到我們的學(xué)習(xí)群颁井。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末厅贪,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子雅宾,更是在濱河造成了極大的恐慌养涮,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異贯吓,居然都是意外死亡懈凹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門悄谐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來介评,“玉大人,你說我怎么就攤上這事尊沸⊥” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵洼专,是天一觀的道長(zhǎng)棒掠。 經(jīng)常有香客問我,道長(zhǎng)屁商,這世上最難降的妖魔是什么烟很? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮蜡镶,結(jié)果婚禮上雾袱,老公的妹妹穿的比我還像新娘。我一直安慰自己官还,他們只是感情好芹橡,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著望伦,像睡著了一般林说。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上屯伞,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天腿箩,我揣著相機(jī)與錄音,去河邊找鬼劣摇。 笑死珠移,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的末融。 我是一名探鬼主播钧惧,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼勾习!你這毒婦竟也來了垢乙?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤语卤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粹舵,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡钮孵,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了眼滤。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片巴席。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖诅需,靈堂內(nèi)的尸體忽然破棺而出漾唉,到底是詐尸還是另有隱情,我是刑警寧澤堰塌,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布赵刑,位于F島的核電站,受9級(jí)特大地震影響场刑,放射性物質(zhì)發(fā)生泄漏般此。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一牵现、第九天 我趴在偏房一處隱蔽的房頂上張望铐懊。 院中可真熱鬧,春花似錦瞎疼、人聲如沸科乎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽茅茂。三九已至,卻和暖如春竿裂,著一層夾襖步出監(jiān)牢的瞬間玉吁,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工腻异, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留进副,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓悔常,卻偏偏與公主長(zhǎng)得像影斑,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子机打,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容