JavaScript實現(xiàn)一個前端會魔法的旋轉(zhuǎn)魔方相冊
效果圖
實現(xiàn)功能:
點擊下方圖片可翻轉(zhuǎn)到對應圖片
實現(xiàn)思路:
- 構(gòu)建盒子模型,完成html代碼編寫
- 設置樣式,利用transform3D做出魔方
- JS構(gòu)建事件
1. HTML篇
魔方中用<li>
標簽包含圖片,方便用<ul>
包裹,后面給ul添加3D模式便可進行翻折
比較簡單不過多講解,代碼如下:
2. CSS篇
2.1 基礎設置
清除樣式默認的內(nèi)外邊距,直接上代碼:
2.2 魔方樣式
主要是給父元素設置transform-style: preserver-3d;
,對所有l(wèi)i子元素進行3D轉(zhuǎn)換,后面便于用transform折疊這里用子絕父相的定位模式設定,是為了讓ul下的所有l(wèi)i都放在父元素ul框內(nèi)
也就是給每個li加定位——top: 0 ;
和 left: 0;
如果你設置的圖片的原本尺寸并不是一致,你需要給img強制設置寬高,這樣圖片會強制更改自身尺寸
transition屬性設置:
- 第一屬性值是選擇子元素的種類,all就是全部子元素
- 第二屬性值是持續(xù)時間
- 第三屬性值是速度變化曲線,這里用到的是貝塞爾曲線,這個無需過多關注,可以直接拿來用,值得說的是,第四個屬性值你可以理解為最遠達到距離,這里設置1.275就是魔方旋轉(zhuǎn)到達目的地后在轉(zhuǎn)個0.275,然后再回到目的地,這也是實現(xiàn)旋轉(zhuǎn)抖動的原理
代碼實現(xiàn)如下:
2.3 圖片折疊
- 前面其實已經(jīng)做好鋪墊,接下來我們只需要設置每個圖片各XY的翻轉(zhuǎn)角度,Z的位移,就可以組成魔方
- 如果不知道怎么回事的,可以再重溫一下transform的rotate屬性,簡單說明一下
rotateX
就是以X軸為對稱中翻轉(zhuǎn),朝上為正,朝下為負,Y同理 - 這里設置translateZ,簡單理解就是把頁面文檔流看作地面,這里設置圖片的高度, 全部設置為100px是為了讓圖片在一個高度,構(gòu)成封閉魔方
代碼實現(xiàn)如下:
2.4 圖片按鈕樣式
也就是實現(xiàn)下面效果
這一塊比較簡單,牛牛就不多做介紹,講一個文章出現(xiàn)過的知識點——background-size: contain;
該屬性會保持圖像的縱橫比并將圖像縮放成將適合背景定位區(qū)域的最大大小。
2.5 設置配合JS使用的翻轉(zhuǎn)樣式
這里需要 一定的理解能力,建議配合后面的JS代碼一起看
講一下具體思路:
- 當我們對下方圖片觸發(fā)點擊事件時,通過JS給魔方的ul加相對應類名,類名對應設置了transform樣式,也就實現(xiàn)了點擊觸發(fā)相對應的魔方旋轉(zhuǎn)
- 下面代碼的原理和上一節(jié)一致,不過需要注意的是,下面旋轉(zhuǎn)的對象是整個魔方,而上一節(jié)旋轉(zhuǎn)對象只是相對應的一張圖片而已。
3. JS篇
最關鍵的部分來了
- 首先我們需要知道,這塊JS代碼是用來為事件服務的,需要遵循三步就行:獲取變量、創(chuàng)建事件、回調(diào)函數(shù)
- 定義變量比較簡單,根據(jù)自己創(chuàng)建事件中需要什么,去獲取頁面對象
- 接下來我們需要實現(xiàn)當點擊下方圖片時,需要分辨是哪一張,我們可以看到在html篇中下方圖片的類名其實是跟2.5節(jié)需要設置的類名是相對應的
- 因此我們直接創(chuàng)建onclick事件,在回調(diào)函數(shù)中將點擊圖片的類名賦給我們的ul盒子,點擊哪個圖片,就執(zhí)行對應的翻轉(zhuǎn)
- 小實踐: 創(chuàng)建事件大家會不會覺得有些代碼重復贅余的感覺,其實我們可以把這個回調(diào)函數(shù)封裝起來,調(diào)用函數(shù)傳入序號即可實現(xiàn),感興趣的可以做一下,如果需要封裝代碼,可以在評論區(qū)留言,牛牛會找個時間更新一下
4. 完整代碼
4.1 html文件
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>旋轉(zhuǎn)魔方相冊</title> <style> *{ margin: 0; padding: 0; } body{ background-color: rgba(0, 0, 0, 0.8); } /* 魔方樣式設置部分 */ .square{ width: 200px; height: 200px; margin: 200px auto; margin-bottom: 100px; } ul{ position: relative; transform-style: preserve-3d; transition: all .7s cubic-bezier(0.175, 0.885, 0.32, 1.275); width: 100%; height: 100%; } li{ /* display: inline-block; */ position: absolute; top: 0; left: 0; list-style: none; width: 100%; height: 100%; border: 1px solid pink; } img{ width: 200px; height: 200px; } /* 初始位置 */ /* ul{ transform: translateZ(-100px) rotateX(-15deg) rotateY(15deg); } */ /* 折疊圖片,構(gòu)成魔方 */ ul li:nth-child(1) { transform: translateZ(100px); } ul li:nth-child(2) { transform: rotateY(180deg) translateZ(100px); } ul li:nth-child(3) { transform: rotateY(90deg) translateZ(100px); } ul li:nth-child(4) { transform: rotateY(-90deg) translateZ(100px); } ul li:nth-child(5) { transform: rotateX(90deg) translateZ(100px); } ul li:nth-child(6) { transform: rotateX(-90deg) translateZ(100px); } /* 下方是點擊目錄 */ .img_1{ background-image: url(2.jpeg); } .img_2{ background-image: url(1.jpeg); } .img_3{ background-image: url(3.jpeg); } .img_4{ background-image: url(4.jpeg); } .img_5{ background-image: url(5.jpeg); } .img_6{ background-image: url(6.jpeg); } span{ display: inline-block; width: 50px; height: 25px; background-size: contain; border: 1px solid white; } .toc{ width: 350px; margin: 0 auto; } /* 輔助JS塊樣式設置 */ .square .img_1 { transform: translateZ(-100px); } .square .img_2 { transform: translateZ(-100px) rotateX(-180deg) ; } .square .img_3 { transform: translateZ(-100px) rotateY(-90deg) ; } .square .img_4 { transform: translateZ(-100px) rotateY(90deg) ; } .square .img_5 { transform: translateZ(-100px) rotateX(-90deg) ; } .square .img_6 { transform: translateZ(-100px) rotateX(90deg) ; } </style> </head> <body> <!-- 魔方 --> <div class="square"> <ul class="s-img"> <li><img src="2.jpeg"></li> <li><img src="1.jpeg"></li> <li><img src="3.jpeg"></li> <li><img src="4.jpeg"></li> <li><img src="5.jpeg"></li> <li><img src="6.jpeg"></li> </ul> </div> <!-- 手動點擊旋轉(zhuǎn) --> <div class="toc"> <span class="img_1"></span> <span class="img_2"></span> <span class="img_3"></span> <span class="img_4"></span> <span class="img_5"></span> <span class="img_6"></span> </div> <!-- JS --> <script src="cube.js"> </script> </body> </html>
4.2 js文件
window.onload = function(){ //toc目錄設置 var toc_img = document.querySelector('.toc'); var square = document.querySelector('ul'); var p_img = square.classList; var img_button = toc_img.querySelectorAll('span'); var flage = ''; img_button[0].onclick = function(e) { flage = img_button[0].className; square.setAttribute('class', flage); } img_button[1].onclick = function(e) { flage = img_button[1].className; square.setAttribute('class', flage); } img_button[2].onclick = function(e) { flage = img_button[2].className; square.setAttribute('class', flage); } img_button[3].onclick = function(e) { flage = img_button[3].className; square.setAttribute('class', flage); } img_button[4].onclick = function(e) { flage = img_button[4].className; square.setAttribute('class', flage); } img_button[5].onclick = function(e) { flage = img_button[5].className; square.setAttribute('class',flage); } }
到此這篇關于JavaScript實現(xiàn)一個前端會魔法的旋轉(zhuǎn)魔方相冊的文章就介紹到這了,更多相關JavaScript魔方相冊內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
JS 截取字符串substr 和 substring方法的區(qū)別
JS 截取字符串substr 和 substring方法的區(qū)別,需要的朋友可以參考下,根據(jù)需要自行選擇。2009-10-10網(wǎng)站頁面自動跳轉(zhuǎn)實現(xiàn)方法PHP、JSP(上)
自動轉(zhuǎn)向,也叫自動重定向。自動跳轉(zhuǎn),指當訪問用戶登陸到某網(wǎng)站時,自動將用戶轉(zhuǎn)向其它網(wǎng)頁地址的一種技術。轉(zhuǎn)向的網(wǎng)頁地址可以是網(wǎng)站內(nèi)的其它網(wǎng)頁,也可以是其它網(wǎng)站。2010-08-08canvas實現(xiàn)簡易的圓環(huán)進度條效果
本文主要分享了canvas實現(xiàn)簡易的圓環(huán)進度條效果的實例,具有很好的參考價值,下面跟著小編一起來看下吧2017-02-02