寫業務程式碼經常會碰到要自己實現一些設計交給的小動畫,今天我們就來看下小喇叭那種類似倒過來的wifi圖示一樣的效果:
對於這個有幾種實現方案:
一種是直接把圖示.png檔案放在下面,然後再在上面覆蓋一層跟它弧度相似的圓形div,通過css的animation去控制那個覆蓋的div從左向右移動,從而實現出這種效果(其實還是有區別的,用div控制移動就會出現一個一個逐漸出現且,會同時消失的場景,而不是這種波浪式的遞推)
另外一種是把這個圖示切分成三塊,通過佈局調整每個小圖示的間距,然後通過js去控制每個小圖示的出現順序以及時間,這種方法的好處就是很靈活,而且程式碼編寫起來也比較直觀。
但是我們作為一個前端攻城獅不能老寫偏中後臺的邏輯程式碼,總得學會用css裝飾自己吧,更何況現在css3的出現,頁面的動畫變得可以像ppt一樣舒服了。所以我介紹下最後一種方式,就是用div塊去設定border然後再給div一個border-radius:50%,做出三個圓調整好位置,然後用一個矩形的div轉變角度去蓋住這三個圓,最後通過css3的animation去控制漸進漸出,從而實現上圖的效果!
話不多說上程式碼:
文末附上完整程式碼:
<!DOCTYPE html>
<meta charset="utf-8">
<html>
<head>
<title>微信語音樣式</title>
<style type="text/css">
*{
margin: 0;
padding: 0;
}
.box {
width: 120px;
height: 120px;
box-sizing: border-box;
position: relative;
margin: 50px auto;
}
.wifi-symbol {
width: 50px;
height: 50px;
box-sizing: border-box;
overflow: hidden;
transform: rotate(135deg);
}
.wifi-circle {
border: 5px solid #999999;
border-radius: 50%;
position: absolute;
}
.first {
width: 5px;
height: 5px;
background: #cccccc;
top: 45px;
left: 45px;
}
.second {
width: 25px;
height: 25px;
top: 35px;
left: 35px;
animation: fadeInOut 1s infinite 0.2s;.
}
.third {
width: 40px;
height: 40px;
top: 25px;
left: 25px;
animation: fadeInOut 1s infinite 0.4s;
}
@keyframes fadeInOut {
0% {
opacity: 0; /*初始狀態 透明度為0*/
}
100% {
opacity: 1; /*結尾狀態 透明度為1*/
}
}
</style>
</head>
<body>
<div class="box">
<div class="wifi-symbol">
<div class="wifi-circle first"></div>
<div class="wifi-circle second"></div>
<div class="wifi-circle third"></div>
</div>
</div>
</body>
</html>複製程式碼
方案二
微信語音播放動畫:
// html
<div class="voice">
<div class="bg voicePlay"></div>
</div>
複製程式碼
css3:
.voice{
padding-top: 12px;
padding-left: 10px;
margin: 100px auto;
height: 35px;
width: 150px;
background: #1bbc9b;
border-radius: 0 7px 7px;
}
.bg {
background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAGAAAAAYCAYAAAAF6fiUAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAyZpVFh0WE1MOmNvbS5hZG9iZS54bXAAAAAAADw/eHBhY2tldCBiZWdpbj0i77u/IiBpZD0iVzVNME1wQ2VoaUh6cmVTek5UY3prYzlkIj8+IDx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iIHg6eG1wdGs9IkFkb2JlIFhNUCBDb3JlIDUuNi1jMDY3IDc5LjE1Nzc0NywgMjAxNS8wMy8zMC0yMzo0MDo0MiAgICAgICAgIj4gPHJkZjpSREYgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj4gPHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9IiIgeG1sbnM6eG1wTU09Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9tbS8iIHhtbG5zOnN0UmVmPSJodHRwOi8vbnMuYWRvYmUuY29tL3hhcC8xLjAvc1R5cGUvUmVzb3VyY2VSZWYjIiB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iIHhtcE1NOkRvY3VtZW50SUQ9InhtcC5kaWQ6NzlFRDZDRDNENzlFMTFFNkJDN0NFMjA2QTFFRTRDQkIiIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6NzlFRDZDRDJENzlFMTFFNkJDN0NFMjA2QTFFRTRDQkIiIHhtcDpDcmVhdG9yVG9vbD0iQWRvYmUgUGhvdG9zaG9wIENDIDIwMTcgKFdpbmRvd3MpIj4gPHhtcE1NOkRlcml2ZWRGcm9tIHN0UmVmOmluc3RhbmNlSUQ9InhtcC5paWQ6MTAxQkEzQ0RENzM2MTFFNjgyMEI5MTNDRkQ0OTM5QUEiIHN0UmVmOmRvY3VtZW50SUQ9InhtcC5kaWQ6MTAxQkEzQ0VENzM2MTFFNjgyMEI5MTNDRkQ0OTM5QUEiLz4gPC9yZGY6RGVzY3JpcHRpb24+IDwvcmRmOlJERj4gPC94OnhtcG1ldGE+IDw/eHBhY2tldCBlbmQ9InIiPz4K4iKVAAACUUlEQVR42uSazytEURTHvTHjR4kaU8xsSDZSdmbjx4oSK8XGQrJlpSwYTSmxEWWhUIpsZK3kD7DRNBuSBZFCNjZ+JPKcV6ecXu/d3sy7595bc+vbfXPue5/749z77o83lm3bZYYFC8RZqAbQAigP2tXNj5aZF7gdkAZNk9+7WvnOCCgxRUCb9n/o1sk3pUH6QDHF/GNsoM+QeYfiy6qkFeLZDBb0GlTB4AAR/xXT9nXxZVa0WCekQd9Y0HOJjg3CHySviiZmfjO3AyIhnu0gBc0wjAIR/wLtW8z87aAOWAI9gqaYRoAff4ZUoi7EKCiUP462j4CdSCrfK4N1Ahpi6I0i/hPa50M4oFB+Dbm/SzXfL5MD4rUogxP8+Itozynm59E+q5ovyuQdHxphWh568XvR5kxq1SEn40L4e0XMA1L4EcEe7RTjLqYdqRf/gezQUwr5LxjXq+aLHPCFcTmTA7z4tutIQhXfLiJPKXyRA/oxzgW8v9DgxU+S62eF/ATGr6r5fg26Corj9RHD4Z0fvwfjS9CbQn4bxrfK+R6TyzxZNk260solTL4i/g3al10TsMXIryA72T7VfK8MnJO8X9CKy14lafXjxx8jFUsSeyUzfxhtPwHPoqTy/TJJMJzJiPgNpJdsuNJizPwztB/q4JtwHN2KW3sn3HuMOouR30l6bbsOvgkOyGIBnaPbRldalJl/h2knuvgmOKAWNAFKMUz4Iv4O6Z1xXXxTPxtazHy6khnVyS/Fb8IDpHGyuvmWgX9L4Q4toDnQFWhNN/9PgAEAR4w1ULjdCbEAAAAASUVORK5CYII=) right 0 no-repeat;
width: 24px;
height: 24px;
background-size: 400%;
}
.voicePlay {
animation-name: voicePlay;
animation-duration: 1s;
animation-direction: normal;
animation-iteration-count: infinite;
animation-timing-function: steps(3);
}
@keyframes voicePlay {
0% {
background-position: 0;
}
100% {
background-position: 100%;
}
}複製程式碼
方案3 ---
html5 audio
思路
關於播放動畫,這個很簡單,我們可以用css3的逐幀動畫來實現。關於逐幀動畫,我之前的文章也寫過:www.haorooms.com/post/zhuzhe…
圖片如下:
除了動畫之外,剩下的就是js對audio的控制了。
html5 audio
關於html5 audio標籤,有很多屬性,大家可以搜尋一下,例如preload、autoplay、loop、controls等等。讓其隱藏,我們可以新增一個隱藏引數,程式碼如下:
<audio preload="auto" hidden="true"><source src="mp3/Kalimba.mp3" type="audio/mpeg"></audio>複製程式碼
這樣,這個audio 就可以隱藏顯示,接下來我們就可以用js對其進行操作控制了。
audio常用方法
addTextTrack() 向音訊/視訊新增新的文字軌道
canPlayType() 檢測瀏覽器是否能播放指定的音訊/視訊型別
load() 重新載入音訊/視訊元素
play() 開始播放音訊/視訊
pause() 暫停當前播放的音訊/視訊複製程式碼
audio常用事件
事件對我們非常有用,可以通過判斷音訊是否載入完成,來進行動畫的操作,例如,我們點選錄音,先有一個載入loading動畫,然後在變成我們前面所講的逐幀動畫。
abort 當音訊/視訊的載入已放棄時
canplay 當瀏覽器可以播放音訊/視訊時
canplaythrough 當瀏覽器可在不因緩衝而停頓的情況下進行播放時
durationchange 當音訊/視訊的時長已更改時
emptied 當目前的播放列表為空時
ended 當目前的播放列表已結束時
error 當在音訊/視訊載入期間發生錯誤時
loadeddata 當瀏覽器已載入音訊/視訊的當前幀時
loadedmetadata 當瀏覽器已載入音訊/視訊的後設資料時
loadstart 當瀏覽器開始查詢音訊/視訊時
pause 當音訊/視訊已暫停時
play 當音訊/視訊已開始或不再暫停時
playing 當音訊/視訊在已因緩衝而暫停或停止後已就緒時
progress 當瀏覽器正在下載音訊/視訊時
ratechange 當音訊/視訊的播放速度已更改時
seeked 當使用者已移動/跳躍到音訊/視訊中的新位置時
seeking 當使用者開始移動/跳躍到音訊/視訊中的新位置時
stalled 當瀏覽器嘗試獲取媒體資料,但資料不可用時
suspend 當瀏覽器刻意不獲取媒體資料時
timeupdate 當目前的播放位置已更改時
volumechange 當音量已更改時
waiting 當視訊由於需要緩衝下一幀而停止複製程式碼
例如如下程式碼:
audio.onloadedmetadata = function () {
$(_this).removeClass("loading");
$(_this).addClass("playing");
}複製程式碼
當音訊檔案已經載入到瀏覽器之後,去除載入動畫,增加播放動畫。
js 操作音訊檔案播放暫停
如下程式碼可以控制audio播放還是暫停
var audio = document.getElementById('haorooms');
if(audio!==null){
//檢測播放是否已暫停.audio.paused 在播放器播放時返回false.
alert(audio.paused);
if(audio.paused) {
audio.play();//audio.play();// 這個就是播放
}else{
audio.pause();// 這個就是暫停
}
} 複製程式碼
當然也可以通過jquery輕鬆操作!
var audio = $(that).children("audio")[0];//獲取,這段程式碼直接從我們檔案中copy而來,可以直接寫$("audio")[0]
audio.load();//載入
audio.play();//播放
audio.pause();//暫停複製程式碼
值得注意的是,我們可以用定時器來讓語音播放結束之後,動畫去掉。
定時器可以用setTimeout來寫!關於setTimeout,可以看我之前的文章!
定時器是一個變數!
var second=$(that).data("second");//獲取音訊秒數
_this.dshiqi=setTimeout(function(){ //dshiqi是外層定義好的一個變數!
$(that).removeClass("playing");//播放完畢去除動畫
},second*1000)複製程式碼
記得在每次切換點選的時候,清除之前的定時器
clearTimeout(_this.dshiqi);複製程式碼
不清除定時器,來回點選錄音,會有問題!
上面就是對html5的audio實現高仿微信語音播放效果簡單總結,歡迎留言交流!
ps :好多朋友問有沒有demo,找了一下,發現只有一個很挫的靜態頁面,是之前用jquery寫的,大家將就著看下吧!
地址:resource.haorooms.com/softshow-29…