SS3旋轉圖標特效,常用在企業網站展示欄中,會應用到不同的特效來展現頁面的用戶體驗效果!
如下圖:鼠標移上去后會出現圖標旋轉背景色變幻效果
實現代碼
html結構:
css樣式:
至于圖標大家可以用自己平時積累的或者需求設計稿里面的,這里只是演示,不一定是跟你的需求圖標一樣的哈!
js代碼:
節實現了:
下一節計劃:
小demo已經寫好,不用擔心跳票啥的。
繼續上一節的內容,我們在繪制好播放器的雛形之后,就可以考慮將一些工具性質的方法封裝起來了,比如,我們多次用到dom和_center方法,不如將它們歸為一類,做為一個工具包來調用。
上代碼:
var utils = { _center : function(dom){ dom.style.position = 'absolute'; dom.style.top = '50%'; dom.style.left = '50%'; dom.style['margin-top'] = - dom.offsetHeight / 2 + 'px'; dom.style['margin-left'] = - dom.offsetWidth / 2 + 'px'; }, dom : function(id){ if(id.toString().indexOf('#') != -1) { id = id.replace('#',''); } return document.getElementById(id); }, }
然后我們就可以這樣調用了:
var musicDom = utils.dom('#music'); var musicIcon = utils.dom('#music-icon'); utils._center(musicDom); utils._center(musicIcon);
util是工具的意思,這樣是不是清晰多了呢?
然后進行js打包:
引入:
<script type="text/javascript" src="js/util.js"></script>
用閉包的形式將util包裹起來,再掛在window對象下面,以防止命名重復。一個簡單的工具包就這樣做好啦!
;(function(win){ var utils = { _center : function(dom){ dom.style.position = 'absolute'; dom.style.top = '50%'; dom.style.left = '50%'; dom.style['margin-top'] = - dom.offsetHeight / 2 + 'px'; dom.style['margin-left'] = - dom.offsetWidth / 2 + 'px'; }, dom : function(id){ if(id.toString().indexOf('#') != -1) { id = id.replace('#',''); } return document.getElementById(id); }, } win.utils = utils; })(window);
同時,我們把css也單獨整出去,不要放在頁面里,那樣會顯得頁面特別龐大,頁面應該整潔和精簡。當一個模子畫出來之后,我一般都會將css整出去。
.music { width: 200px; height:300px; background:#333; border-radius: 5px; box-shadow: 3px -3px 1px #666; position: relative; /*center方法已經將position設置為absolute了,這一行不起作用*/ } .music .screen { height:70%; width:96%; background: linear-gradient(#403d3d,65%,#5f5b5b); margin-left:2%; margin-top: 2%; position: relative; } .music .screen i { color:#fff; font-size: 88px; } .music .buttons i { color:#fff; font-size: 24px; margin-left: 28px; position: relative; top:25px; } .music .buttons i:hover { cursor: pointer; } .music .buttons { height:25%; width:96%; margin-left:2%; margin-top: 2%; }
<link rel="stylesheet" type="text/css" href="css/index.css"/>
這樣一來,頁面就簡潔多了!
接下來,讓我們愉快地開發功能吧!
1. 開始和暫停按鈕之間的切換
/* 獲取開始按鈕 */ var playDom = utils.dom('#play');
然后,給它綁定一個點擊事件
playDom.onclick = function(){ alert('play'); }
這說明綁定事件成功了。
將暫停按鈕加上去,默認是隱藏的。
上一節中出現了圖標編碼格式沖突的問題,因此我把iconfont的引入改成了下面的方式:
<i id='pause' class="iconfont icon-zanting" style="display:none"></i>
按鈕切換的邏輯代碼:
/* 獲取開始按鈕 */ var playDom = utils.dom('#play'); /* 獲取暫停按鈕 */ var pauseDom = utils.dom('#pause'); playDom.onclick = function(){ this.style.display = 'none'; pauseDom.style.display = 'inline'; } pauseDom.onclick = function(){ this.style.display = 'none'; playDom.style.display = 'inline'; }
效果(截屏效果一般,漸變色沒顯示,大伙先將就著看吧):
2. 音樂播放和暫停
還記得上一節封裝的musicBox對象嗎?
播放和暫停的核心方法是這樣的:
play : function(index){ this.musicDom.src = this.songs[index]; this.musicDom.play(); }, //暫停音樂 stop : function(){ this.musicDom.pause(); },
3. 代碼重構和歌曲切換的實現
今天,我對musicBox進行了一次簡單的重構,代碼如下:
var musicBox= { musicDom : null, //播放器對象 songs : [], //歌曲目錄,用數組來存儲 index : 0, //當前播放的歌曲索引 //初始化音樂盒 init : function(themeIndex){ this.musicDom = document.createElement('audio'); document.body.appendChild(this.musicDom); }, //添加一首音樂 add : function(src){ this.songs.push(src); }, //根據數組下標決定播放哪一首歌 play : function(){ this.musicDom.src = this.songs[this.index]; this.musicDom.play(); }, //暫停音樂 stop : function(){ this.musicDom.pause(); }, //下一首 next : function(){ var len = this.songs.length; //判斷是否是有效的索引 if((this.index + 1) >= 0 && this.index < len){ this.index ++; //如果已經是最后一首,就跳到第一首 if(this.index == len){ this.index = 0; } this.play(); } }, //上一首 prev : function(){ var len = this.songs.length; //判斷是否是有效的索引 if((this.index + 1) >= 0 && this.index < len){ //如果已經是第一首,就跳到最后一首 if(this.index == 0){ this.index = len; } this.index --; this.play(); } } }
不同點如下:
1.添加音樂索引index,取消了play方法的參數。
2.實現了上一首和下一首的邏輯代碼
3.默認音樂為第一首
順便添加了幾首音樂。
現在我們就來調用看看吧,當點擊播放按鈕的時候,就播放指定的歌曲。點擊暫停按鈕就停止播放。
4. 測試
var musicDom = utils.dom('#music'); var musicIcon = utils.dom('#music-icon'); utils._center(musicDom); utils._center(musicIcon); musicBox.init(); //初始化 musicBox.add('mp3/火影忍者主題曲.mp3'); musicBox.add('mp3/曲婉婷 - 我的歌聲里.mp3'); musicBox.add('mp3/夜空中最亮的星.mp3'); musicBox.add('mp3/班得瑞 - 雪之夢.mp3'); musicBox.add('mp3/超級好聽的龍貓輕音樂.mp3'); /* 獲取開始按鈕 */ var playDom = utils.dom('#play'); /* 獲取暫停按鈕 */ var pauseDom = utils.dom('#pause'); /* 獲取下一首按鈕 */ var nextDom = utils.dom('#next'); /* 獲取上一首按鈕 */ var prevDom = utils.dom('#prev'); //播放按鈕 playDom.onclick = function(){ this.style.display = 'none'; pauseDom.style.display = 'inline'; //播放音樂 musicBox.play(); } //暫停按鈕 pauseDom.onclick = function(){ this.style.display = 'none'; playDom.style.display = 'inline'; musicBox.stop(); } //下一首 nextDom.onclick = function(){ musicBox.next(); //當直接點擊下一首的時候,同時改變播放按鈕為暫停的樣式 playDom.style.display = 'none'; pauseDom.style.display = 'inline'; } //上一首 prevDom.onclick = function(){ musicBox.prev(); //當直接點擊下一首的時候,同時改變播放按鈕為暫停的樣式 playDom.style.display = 'none'; pauseDom.style.display = 'inline'; }
成功運行起來了,雖然有聲音,但是還看不出屏幕的變化,所以,接下來,我們做一點有趣的事情。
5. 隨著歌曲的播放,讓音樂圖標轉動起來
關于這個,就需要用到css3的一個知識點了,就是關鍵幀。因為不是專門開貼講解css3,所以這邊我就簡單說明一下了。
像這樣:
@keyframes move{ 0% {transform: rotate(0deg)} 100% {transform: rotate(360deg)} } .r { animation: move 1s linear infinite; }
簡單來說,就是我們定義了一個名字叫r的class,動畫效果采用名字叫move的關鍵幀。transform是轉換的意思,因為英文詞根trans就有從一個狀態變到另一個狀態的涵義,這是比較好理解的,而deg是角度的意思。
@keyframes move{ 0% {transform: rotate(0deg)} 100% {transform: rotate(360deg)} }
用以上這段代碼,我們制作了一個關鍵幀動畫,名字叫move,它將一個元素的位置從0度變化到360度,就是轉了一圈。
.r { animation: move 1s linear infinite; }
現在,我們給音樂圖標加上轉動樣式:
<i id='music-icon' class="iconfont icon-yinle r"></i>
在這里我去掉了該元素的定位方法,而繼續采用css的方式來居中。
.music .screen i { color:#fff; font-size: 88px; position: absolute; left: 50%; top : 50%; margin-left: -40px; margin-top: -48px; }
截圖原因,效果看起來不咋地,其實它的轉動是非常平滑的,我也不清楚為啥截圖后變成了這個樣子。
終于轉起來了,核心的操作就是給圖標添加一個css類而已。
現在,我們希望在點擊開始按鈕的時候,就轉動圖標。點擊暫停就移除轉動的css類。
先給util工具包擴展下面這幾個方法:
/*判斷dom元素是否擁有某個class類*/ hasClass : function(obj, cls) { return obj.className.match(new RegExp('(\\s|^)' + cls + '(\\s|$)')); }, /*給dom元素增加某個class類*/ addClass : function(obj, cls) { if (!this.hasClass(obj, cls)) obj.className += " " + cls; }, /*移除dom元素中的某個class類*/ removeClass : function(obj, cls) { if (this.hasClass(obj, cls)) { var reg = new RegExp('(\\s|^)' + cls + '(\\s|$)'); obj.className = obj.className.replace(reg, ' '); } }, /*該方法檢查每個元素中指定的類。如果不存在則添加類,如果已設置則刪除之。這就是所謂的切換效果。*/ toggleClass : function(obj,cls){ if(hasClass(obj,cls)){ removeClass(obj, cls); }else{ addClass(obj, cls); } }
6. 重寫后的按鈕事件
//播放按鈕 playDom.onclick = function(){ this.style.display = 'none'; pauseDom.style.display = 'inline'; utils.addClass(musicIcon,'r'); //播放音樂 musicBox.play(); } //暫停按鈕 pauseDom.onclick = function(){ this.style.display = 'none'; playDom.style.display = 'inline'; utils.removeClass(musicIcon,'r'); musicBox.stop(); } //下一首 nextDom.onclick = function(){ musicBox.next(); //當直接點擊下一首的時候,同時改變播放按鈕為暫停的樣式 playDom.style.display = 'none'; pauseDom.style.display = 'inline'; utils.addClass(musicIcon,'r'); } //上一首 prevDom.onclick = function(){ musicBox.prev(); //當直接點擊下一首的時候,同時改變播放按鈕為暫停的樣式 playDom.style.display = 'none'; pauseDom.style.display = 'inline'; utils.addClass(musicIcon,'r'); }
效果:
7. 顯示正在播放的音樂
.music .info { position: absolute; display: inline-block; width: 80%; height: 30px; left: 15px; top: 20px; text-align: center; color: #eee; font-family:黑體; font-size: 14px; } <div id='music' class='music'> <div class='screen'> <i id='music-icon' class="iconfont icon-yinle"></i> </div> <div class='buttons'> <i id='prev' class="iconfont icon-icon"></i> <i id='play' class="iconfont icon-bofanganniu"></i> <i id='pause' class="iconfont icon-zanting" style="display:none"></i> <i id='next' class="iconfont icon-icon1"></i> </div> <span id='info' class='info'></span> </div>
然后在musicBox對象中添加一個獲取歌曲信息的方法:
/*獲取當前歌曲的信息*/ getCurrentSong : function(){ var info = this.songs[this.index]; info = info.split('/')[1]; info = info.split('.')[0]; return '正在播放:' + info; }
然后,在按鈕的點擊事件中,只需要加上下面的代碼,即可獲取實時的歌曲信息啦!
先獲取信息欄:
/* 獲取歌曲的信息欄 */ var infoDom = utils.dom('#info');
改寫按鈕點擊的事件:
infoDom.innerHTML = ''; //先清空上一次的信息 infoDom.innerHTML = musicBox.getCurrentSong();//顯示當前的歌曲信息
效果:
這一節到此告一段落了,下一節,我們來做音軌。
悠閑的午后,品著剛泡好的茶
聽著美妙的音樂,也是一種享受吧。
享受編程的樂趣,懷著感恩的心去體會每一天生活中的細節。
轉地球功能實現主要借助于CSS動畫效果完成,通過移動地圖背景圖層,云彩圖層等,在視覺上呈現出旋轉地球效果。旋轉地球最終實現效果如下圖所示:
旋轉地球效果展示
旋轉地球效果實現主要借助于animation動畫屬性完成,在動畫關鍵之keyframe編寫時移動圖片坐標位置,實現背景地圖圖片位置移動。為體現移動效果,進一步定義了云彩與飛機,飛機居中固定,云彩與地球非同步移動,最終呈現出動態效果。本例所需核心技術主要描述如下:
1、flex布局
通過使用flex布局模式用于實現呈現動畫效果div在頁面居中顯示效果,核心代碼如下:
display: flex; //flex布局
justify-content: center;//水平居中
align-items: center;//垂直居中
2、before與after偽元素
在之前案例設計分析中,我們使用before與after等元素進行了案例設計,這兩個元素主要用于在頁面中生成虛擬的元素。本例中我們使用before在地球容器層前定義了用于存儲云彩的偽元素層。部分代碼如下:
.earth:before{
content: '';
width: 100%; //寬度
height: 100%; //高度
position: absolute; //絕對定位
background: url('cloud.png');//背景圖片
background-size: cover; //圖片放縮類型
opacity: 0.8; //透明度
border-radius: 50%; //圓角
animation:animate 18s linear infinite;//動畫
}
3、animation與keyframes
animation屬性與keyframes是實現CSS動畫的關鍵,本例中需要將地球圖片與云彩圖片分別進行動畫定義,最終呈現動畫效果,其中云彩動畫定義如下:
animation:animate 18s linear infinite;//動畫定義
@keyframes animate{ //關鍵幀定義
0%{ background-position: 0 0; }
100%{ background-position:807px 0; }
}
在明確本例設計思路與掌握所需技能基礎上,我們可以搜集素材完成本案例效果的制作與實現。
1、所需素材
主要所需素材包括地圖平面圖片,飛機圖標,云彩圖片等。素材如下圖所示:
圖片素材
2、頁面布局
本例頁面布局較為簡單,只需要一個div用于存儲地圖圖片資源,before元素用于存儲云朵,飛機素材可用img標記元素存儲。頁面body部分布局代碼如下:
<body>
<div class="earth">
<img src="plane.png">
</div>
</body>
3、CSS樣式編輯
CSS樣式編輯是本例核心,包括頁面布局的實現,偽元素的定義及動畫效果設計實現等,其中earth類、earth:before類與動畫設計時關鍵部分,核心代碼如下:
核心CSS定義
以上給出旋轉地球設計效果實現思路及核心相關技術,如需代碼分享,請評論區留言、關注并私信。本頭條號長期關注編程資訊分享;編程課程、素材、代碼分享及編程培訓。如果您對以上方面有興趣或代碼錯誤、建議與意見,可在評論區回復。更多程序設計相關教程及實例分享,期待大家關注與閱讀!
*請認真填寫需求信息,我們會在24小時內與您取得聯系。