原生js實(shí)現(xiàn)簡單的Ripple按鈕
效果如圖

Jietu20170323-165850-HD.gif
準(zhǔn)備食材(html部分)
<ul id="nav">
<li>
<a href='#'>
<span>首頁</span>
<span class="circle"></span>
</a>
</li>
<li>
<a href='#'>
<span>我的</span>
<span class="circle"></span>
</a>
</li>
<li>
<a href='#'>
<span>更多</span>
<span class="circle"></span>
</a>
</li>
</ul>
典型的菜單li布局,里面的span.circle表示的是觸摸彈出的小圓圈。
準(zhǔn)備輔料 (css部分)
#nav {
display: flex;
}
#nav li {
position: relative;
overflow: hidden;
flex: 1;
}
li a {
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
}
.circle{
position: absolute;
background: rgba(86,187,247,.1);
width: 1px;
height: 1px;
top:50%;
left: 50%;
border-radius: 50%;
}
.circle.act{
animation: navCircle .4s;
}
@keyframes navCircle
{
from {transform: scale(0);border-radius: 50%;}
to {transform:scale(200);border-radius: 50%;}
}
我的思路是這樣的,給li相對定位,給小圓圈絕對定位,再給小圓圈添加動畫navCircle,采用css3的縮放使其變大,至于為什么是200倍和.4s呢,經(jīng)過測試這樣更人性化,其余的倍數(shù)你們也可以試試。
大火烹飪 (js部分)
var li = document.getElementById('nav').querySelectorAll('li');
var circle = document.getElementById('nav').querySelectorAll('.circle');
for(var i=0,len = li.length;i<len;i++){
((i)=>{
li[i].addEventListener('click',(e)=>{
circle[i].setAttribute('class','circle act');
circle[i].setAttribute('style','top:'+e.layerY+'px;left:'+e.layerX+'px');
});
li[i].addEventListener('touchend',()=>{
circle[i].setAttribute('class','circle');
})
})(i)
}
代碼很簡單,相信大家也猜到了,點(diǎn)擊li的時候給小圓圈添加class 'act',并且設(shè)置小圓圈的起始位置,監(jiān)聽觸摸結(jié)束的時候,取消class 'act',有人肯定要問了,為什么你不用touchstart呢,唉,因?yàn)闆]有layerY這個屬性,找了半天都沒找到啊。
友情提示!touchend僅支持移動端
結(jié)束
做這個部分是因?yàn)槲覀儼沧縜pp里面有這個功能,所以我就想看看h5怎么做,開始的思路是讓寬度和高度隨著時間變大,但是實(shí)現(xiàn)了之后感覺性能不好,所以才想到了直接增加倍數(shù)唄,于是這個功能變完美誕生了,開始享用這份套餐把 !