三分鐘學(xué)會(huì)用 js + css3 打造酷炫3D相冊(cè)

中秋節(jié)馬上就要到來了,這是一個(gè)很有意義的節(jié)日挪略,意味這團(tuán)圓和美滿历帚。

為此,我也特別準(zhǔn)備了一個(gè)案例

中秋主題的3D旋轉(zhuǎn)相冊(cè)

Paste_Image.png

如圖杠娱,這是通過Javascript和css3來實(shí)現(xiàn)的挽牢。整個(gè)案例只有不到80行代碼,我希望通過這個(gè)案例摊求,讓正處于迷茫期的js初學(xué)者感受到學(xué)習(xí)的樂趣禽拔。我會(huì)盡可能講得詳細(xì),不需要你對(duì)css和js有多么高深的理解,你也可以跟著一步步做出來睹栖。如果你是為了討女票開心硫惕,那么也完全可以把圖片換成對(duì)方的照片,在某個(gè)特別的時(shí)刻給對(duì)方一個(gè)驚喜哦 ~

css3的強(qiáng)大使得網(wǎng)頁的展示變得空前得豐富起來野来,再配合簡(jiǎn)單的js代碼恼除,就可以實(shí)現(xiàn)這個(gè)效果。好了梁只,話不多說缚柳,讓我們開始吧。

1. 頁面模板
<!doctype html>
<html lang="en">
 <head>
  <meta charset="UTF-8" />
  <title>中秋節(jié)快樂</title>
  <style>
    
  </style>
 </head>
 <body>
  
 </body>

 <script>

 </script>
</html>

** 1.1 <meta charset="UTF-8" />** :這句話的含義是搪锣,設(shè)置網(wǎng)頁編碼為utf-8秋忙,確保中文可以正常顯示。

1.2.<title>中秋節(jié)快樂</title> :設(shè)置網(wǎng)頁的標(biāo)題构舟。

就是它:


Paste_Image.png

1.3.<style> </style> : 在style里面可以編寫css樣式灰追,所謂的css就是相當(dāng)于給dom元素披上了一層美麗的外衣。

1.4.<body> </body> : 在body區(qū)域里面添加dom元素狗超,也就是一個(gè)網(wǎng)頁的主題框架弹澎。比如div,p努咐,a標(biāo)簽等苦蒿,就是放在這個(gè)部分的。

1.5.<script> </script> :這是js腳本區(qū)域渗稍,單純的說佩迟,就是為了動(dòng)態(tài)地控制body區(qū)域里面的標(biāo)簽元素。之所以放在body的下面竿屹,是為了保證瀏覽器先把所有的dom元素都渲染完畢报强,才進(jìn)行js操作。

2.調(diào)背景色

在style塊里面給整個(gè)頁面渲染成黑色調(diào)

*{padding:0px;margin:0px;} /*這是為了消除默認(rèn)dom元素的內(nèi)外邊距拱燃,使得我們寫css的時(shí)候更精確*/
body{background:#000;}

#######000是純黑色


Paste_Image.png

#######F00是純紅色


Paste_Image.png

#######0F0是純綠色
Paste_Image.png

#######00F是純藍(lán)色


Paste_Image.png

順便提一下秉溉,#FFF肯定就是純白色了。

在本案例中碗誉,我們將背景色設(shè)置為純黑色召嘶。

3.制作3D相框

我們我們畫一個(gè)id為photos的div作為相框來裝載所有的圖片史简。

<div id="photos"></div>

這句話一寫夸溶,頁面上啥也沒有,div連寬度和高度都沒有稀并,這個(gè)時(shí)候蝴蜓,我們就要用css來給div添加一件美麗的外衣了碟绑。

#photos{
    width:110px;            /*寬度*/
    height:180px;          /*高度*/
    border:1px solid #ccc;  /*加一個(gè)灰色邊框*/
    margin:160px auto;     /*水平居中俺猿,高度距離頂部100px*/
}
Paste_Image.png

這樣還是平面的效果,沒有3D的感覺格仲,如果你不相信押袍,我們可以用transform屬性讓它沿著Y軸起來,看看是不是3D的凯肋。

transform:rotateY(0deg);

這句話表示將div盒子沿著Y軸旋轉(zhuǎn)0度谊惭。

讓我們用谷歌瀏覽器打開(或者其他瀏覽器,不要太老就行)侮东,打開調(diào)試模式(大部分瀏覽器都是直接按一下F12就可以了)圈盔,進(jìn)入這樣的界面。

按一下這里的箭頭悄雅,就可以查看dom元素了驱敲。


Paste_Image.png

把鼠標(biāo)滑到div上,點(diǎn)擊宽闲。


Paste_Image.png

然后右邊就會(huì)出來這樣的界面众眨,里面有這個(gè)div所有的樣式。


Paste_Image.png

我們找到 transform:rotateY(0deg); 這一行容诬,然后可以動(dòng)態(tài)地改變它的值娩梨,我們點(diǎn)幾下,選中 0deg 這幾個(gè)字览徒,再按鍵盤上的向上箭頭狈定,就會(huì)這樣:

rotate.gif

哇,轉(zhuǎn)起來了习蓬,好神奇纽什!

我當(dāng)初知道有這么個(gè)名堂的時(shí)候,心里就特別興奮友雳。

這還是2D的稿湿,沒有3D效果铅匹,如何添加3D效果呢?

我們加上這兩個(gè)屬性押赊,

transform-style:preserve-3d;/*設(shè)置3d環(huán)境*/
perspective:800px;      /*設(shè)置景深為800px*/

所謂的景深, 簡(jiǎn)單說來包斑,就是對(duì)好焦的范圍流礁。它能決定是把背景模糊化來突出拍攝對(duì)象,還是拍出清晰的背景罗丰。我看到網(wǎng)上是這么說的神帅,喜歡攝影的朋友應(yīng)該很了解。

為了突出效果萌抵,我們添加一張圖片找御,順便給圖片加上一點(diǎn)倒影效果元镀。

<div id="photos">
    ![](img/1.jpg)
</div>
#photos img{
    width:100%;
    height:100%;
    position:absolute;
    box-shadow:0 0 8px #eaeaea;
    box-shadow: 1px -1px 6px #666;
    border-radius:4px;
    -webkit-box-reflect:below 3px -webkit-linear-gradient(top,rgba(0,0,0,0) 40%,rgba(0,0,0,0.5));
    cursor:pointer;
}

效果:

rotate.gif

看起來有點(diǎn)效果了吧。

我一共準(zhǔn)備了8張圖片霎桅,現(xiàn)在將剩余的圖片也添加進(jìn)來栖疑。

<div id="photos">
    ![](img/1.jpg)
    ![](img/2.jpg)
    ![](img/3.jpg)
    ![](img/4.jpg)
    ![](img/5.jpg)
    ![](img/6.jpg)
    ![](img/7.jpg)
    ![](img/8.jpg)
</div>

到目前為止,所有的圖片都是疊在一起的滔驶,我們思考如何將他們分散開來遇革,圍城一圈呢?

4.將圖片散開,圍成一圈

在3維坐標(biāo)中揭糕,不僅有X軸萝快,Y軸,還有Z軸著角。我們首先要明白Z軸是什么概念揪漩,Y軸是左右旋轉(zhuǎn),上面已經(jīng)演示過了雇寇,不難想到X軸應(yīng)該就是上下旋轉(zhuǎn)氢拥,那么Z軸呢?

我們先把倒影去掉锨侯,看起來清楚些嫩海。

/*-webkit-box-reflect:below 3px -webkit-linear-gradient(top,rgba(0,0,0,0) 40%,rgba(0,0,0,0.5));*/

好,讓我們來一探究竟:

rotate.gif

哇囚痴,原來如此叁怪!

Z軸就是垂直于橫切面的一條軸!

我們現(xiàn)在不需要繞著Z軸旋轉(zhuǎn)深滚,試試讓相冊(cè)沿著Z軸移動(dòng)一段距離如何?

translateZ可以幫我們實(shí)現(xiàn)這一個(gè)效果奕谭。

回到正題。

我們的目的是讓所有的圖片分散開來痴荐,那么第一步就是讓每一張圖片均勻地根據(jù)Y軸轉(zhuǎn)過一個(gè)角度血柳。這個(gè)角度是多少呢?

一圈是360度生兆,除以圖片的張數(shù)难捌,就是每一張圖片轉(zhuǎn)過的角度了。

我們用js來實(shí)現(xiàn):

var photosDom = document.getElementById('photos');
//獲取圖片數(shù)組
var images = photosDom.getElementsByTagName('img'); 
//獲取圖片數(shù)量
var len = images.length;        
//計(jì)算每張圖片按Y軸旋轉(zhuǎn)的角度 
var deg = Math.floor(360 / len);                    
for(var i = 0; i < len;i++){
    images[i].style = 'transform : rotateY(' + deg * i + 'deg)'; //deg前面不要加空格
}

代碼是比較明了的鸦难,就是一個(gè)除法運(yùn)算根吁,然后給每一張圖片增加一個(gè)旋轉(zhuǎn)樣式即可。

效果:

Paste_Image.png

可見合蔽,每一張圖片都轉(zhuǎn)過了一定的角度击敌。

也就是說,這個(gè)時(shí)候拴事,每張圖片的Z軸都不一樣了沃斤!

如果你還是覺得有難度圣蝎,沒關(guān)系,我們拿其中一張圖片來舉例衡瓶,讓它沿著它自己的Z軸向外移動(dòng)捅彻。然后你就明白了。

for(var i = 0; i < len;i++){
    images[i].style = 'transform : rotateY(' + deg * i + 'deg)'; //deg前面不要加空格

    if(i == 1){
        images[i].style = 'transform : rotateY(' + deg * i + 'deg) translateZ(300px)';
    }
}
Paste_Image.png

顯而易見了鞍陨,就是這么回事步淹,那么解決方案自己就出來了,我們只需要在每一張圖片根據(jù)Y軸旋轉(zhuǎn)的時(shí)候诚撵,就讓它沿著Z軸“飄”出來就可以啦缭裆!

距離稍微大一點(diǎn),就380px吧寿烟。

for(var i = 0; i < len;i++){
    images[i].style = 'transform : rotateY(' + deg * i + 'deg) translateZ(380px)'; //deg前面不要加空格
}
Paste_Image.png

這樣有點(diǎn)太水平了澈驼,我們讓整個(gè)相冊(cè)往下一點(diǎn),達(dá)到一種稍微有點(diǎn)俯視的效果筛武。讓相冊(cè)根據(jù)X軸往下移動(dòng)個(gè)10px就可以了哦缝其。

transform:rotateX(-10deg);
Paste_Image.png

這樣效果就出來了。

5.繪制透明酷炫底盤

本案例中徘六,在相冊(cè)底部内边,還有一個(gè)透明的底盤,現(xiàn)在我們開始實(shí)現(xiàn)這個(gè)效果待锈。

<div id="photos">
    ![](img/1.jpg)
    ![](img/2.jpg)
    ![](img/3.jpg)
    ![](img/4.jpg)
    ![](img/5.jpg)
    ![](img/6.jpg)
    ![](img/7.jpg)
    ![](img/8.jpg)
    <div></div>
</div>

其實(shí)漠其,它就是一個(gè)放在photos里面的div。我們通過定位布局和css3特性就可以實(shí)現(xiàn)了竿音。

上代碼:

#photos div{
    width:1200px;
    height:1200px;
    border-radius:50%;
    position:absolute;
    top:102%;
    left:50%;
    margin-left:-600px;
    margin-top:-600px;
    transform:rotateX(90deg);
    background:-webkit-radial-gradient(center center,600px 600px,rgba(158,158,222,0.5),rgba(0,0,0,0));
}

top屬性是一點(diǎn)點(diǎn)調(diào)出來的和屎,你也可以用瀏覽器的調(diào)試模式一點(diǎn)點(diǎn)來調(diào)整高度。

效果:

Paste_Image.png
6.自動(dòng)旋轉(zhuǎn)

最后一步春瞬,還是由js代碼來收尾柴信,我們使用js的定時(shí)器setInterval,每隔30毫秒就讓整個(gè)相冊(cè)轉(zhuǎn)過一個(gè)非常小的角度就行了宽气。

var x = 0;
setInterval(function(){
    photosDom.style.transform = "rotateX(-10deg) rotateY("+ (x++) * 0.2 +"deg)";
},30);

代碼應(yīng)該還是比較明了的随常。

最終效果就出來了:

rotate.gif

今天做了一點(diǎn)小修改,我把photos的margin由之前的100px auto變?yōu)?60px auto了抹竹。

從效果來看线罕,相冊(cè)在旋轉(zhuǎn)的過程中止潮,會(huì)有一定的偏移窃判,雖然我個(gè)人覺得這樣的效果也挺有趣的,不過喇闸,如果你不希望它的位置發(fā)生偏移的話袄琳,只需要在photos外邊在逃一層div询件,然后把景深移到外層div就ok啦。

本章結(jié)束 ...

剽悍一小兔唆樊,電氣自動(dòng)化畢業(yè)宛琅。
參加工作后對(duì)計(jì)算機(jī)感興趣,深知初學(xué)編程之艱辛逗旁。
希望將自己所學(xué)記錄下來嘿辟,給初學(xué)者一點(diǎn)幫助。

最后片效,也預(yù)祝大家中秋節(jié)快樂红伦,家庭幸福,美滿淀衣。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末昙读,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子膨桥,更是在濱河造成了極大的恐慌蛮浑,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,482評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件只嚣,死亡現(xiàn)場(chǎng)離奇詭異沮稚,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)册舞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,377評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門壮虫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人环础,你說我怎么就攤上這事囚似。” “怎么了线得?”我有些...
    開封第一講書人閱讀 152,762評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵饶唤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我贯钩,道長(zhǎng)募狂,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,273評(píng)論 1 279
  • 正文 為了忘掉前任角雷,我火速辦了婚禮祸穷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘勺三。我一直安慰自己雷滚,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,289評(píng)論 5 373
  • 文/花漫 我一把揭開白布吗坚。 她就那樣靜靜地躺著祈远,像睡著了一般呆万。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上车份,一...
    開封第一講書人閱讀 49,046評(píng)論 1 285
  • 那天谋减,我揣著相機(jī)與錄音,去河邊找鬼扫沼。 笑死出爹,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的缎除。 我是一名探鬼主播以政,決...
    沈念sama閱讀 38,351評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼伴找!你這毒婦竟也來了盈蛮?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,988評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤技矮,失蹤者是張志新(化名)和其女友劉穎抖誉,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體衰倦,經(jīng)...
    沈念sama閱讀 43,476評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袒炉,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,948評(píng)論 2 324
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了樊零。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片我磁。...
    茶點(diǎn)故事閱讀 38,064評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖驻襟,靈堂內(nèi)的尸體忽然破棺而出夺艰,到底是詐尸還是另有隱情,我是刑警寧澤沉衣,帶...
    沈念sama閱讀 33,712評(píng)論 4 323
  • 正文 年R本政府宣布郁副,位于F島的核電站,受9級(jí)特大地震影響豌习,放射性物質(zhì)發(fā)生泄漏存谎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,261評(píng)論 3 307
  • 文/蒙蒙 一肥隆、第九天 我趴在偏房一處隱蔽的房頂上張望既荚。 院中可真熱鬧,春花似錦栋艳、人聲如沸恰聘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,264評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽憨琳。三九已至,卻和暖如春旬昭,著一層夾襖步出監(jiān)牢的瞬間篙螟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,486評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工问拘, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遍略,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,511評(píng)論 2 354
  • 正文 我出身青樓骤坐,卻偏偏與公主長(zhǎng)得像绪杏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子纽绍,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,802評(píng)論 2 345

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

  • 關(guān)于css3變形 CSS3變形是一些效果的集合蕾久,比如平移、旋轉(zhuǎn)拌夏、縮放和傾斜效果僧著,每個(gè)效果都被稱作為變形函數(shù)(Tra...
    hopevow閱讀 6,317評(píng)論 2 13
  • 1、屬性選擇器:id選擇器 # 通過id 來選擇類名選擇器 . 通過類名來選擇屬性選擇器 ...
    Yuann閱讀 1,619評(píng)論 0 7
  • 看了很多視頻障簿、文章盹愚,最后卻通通忘記了,別人的知識(shí)依舊是別人的站故,自己卻什么都沒獲得皆怕。此系列文章旨在加深自己的印象,因...
    DCbryant閱讀 1,854評(píng)論 0 4
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫西篓、插件愈腾、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,024評(píng)論 4 62
  • 親愛的奶奶: 您有沒有想我岸ヌ病?沒見面有些時(shí)日了寸爆,孫女我特別想念您礁鲁。您知道嗎,每次在學(xué)校北門看到年紀(jì)跟您差不多的...
    心樹暖陽閱讀 381評(píng)論 0 0