Material Design的按鈕,漣漪效果

寫在前面:
這是一篇菜鳥的學習筆記褪尝,記錄效果實現過程闹获,沒有考慮安全、兼容河哑、性等問題避诽。供新手參考,也希望前輩們指點璃谨。

這個漣漪效果是在這篇博客的指導下完成的沙庐。

編寫過程記錄:

寫個漣漪效果真的折騰了好幾天。唉佳吞,畢竟沒有系統學過js拱雏、jquery、css底扳。這個過程中的@KeyFrames也是摸索了幾天铸抑,遇到各種低級錯誤。

大體思路:

漣漪效果實際上就是一個擴展開的圓形div衷模。鼠標點擊按鈕記錄其坐標鹊汛,通過相關計算得出產生漣漪的div坐標菇爪。然后將該div放置好后開啟展開動畫如此而已。

效果描述:

直接看動畫吧柒昏。

waves.gif

Waves鏈接展示

代碼要點:

  • 用這個方法來得到鼠標點擊坐標:
$(".waves").mousedown(function(e) {})
  • 得到當前按鈕的漣漪div:
var wavesDiv = box.find("div");
  • css3動畫的定義:
@keyframes animation-definition {  
        from{  
            transform: scale(0.1);  
            opacity: 1;
        }  
        
        to{  
            transform: scale(2); /*因為漣漪的大小為標簽的最長邊,為了保證點擊標簽邊緣時熙揍,漣漪也能覆蓋整個標簽职祷,scale值最小應為2*/
            opacity: 0;         
        } 
    }  
  • 將動畫“當作”css樣式
.waves-effect-animation{
        animation: animation-definition 1s ease-out;  
        /*兼容各大瀏覽器*/
        -moz-animation: animation-definition 1s ease-out;  
        -webkit-animation: animation-definition 1s ease-out;  
        -o-animation: animation-definition 1s ease-out;  
    }
  • js中使用動畫
//設置漣漪div樣式,準備播放動畫
        wavesDiv.css({
            width: wH,
            height: wH,
            left: nX,
            top: nY
        }).addClass("waves-effect-animation");//播放動畫

完整代碼:

<html>
<head>
<meta charset="utf-8">
<script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/2.1.4/jquery.min.js"></script>
<script type="text/javascript">
$(document).ready(function(){

    $(".waves").mousedown(function(e) {
    
        var box = $(this);
        
        
        var wavesDiv = box.find("div");
        
        //第一次沒有漣漪div届囚,動態(tài)生成
        if(wavesDiv[0] == null){
            var div = "<div class='waves-effect'></div>";
            box.append(div);
            wavesDiv = box.find("div");
        }
        
    
        //設置按鈕樣式為’waves-effect‘即去掉動畫樣式’waves-effect-animation‘
        wavesDiv[0].className = 'waves-effect';
        
        //計算漣漪坐標(折算成左上角坐標而非中心點)有梆,漣漪大小(取外標簽最長邊)
        var wH = box.width() > box.height() ? box.width() : box.height();
        var iX = e.pageX - box.offset().left;
        var iY = e.pageY - box.offset().top;
        var nX = iX - wH/2;
        var nY = iY - wH/2;

        //設置漣漪div樣式意系,準備播放動畫
        wavesDiv.css({
            width: wH,
            height: wH,
            left: nX,
            top: nY
        }).addClass("waves-effect-animation");//播放動畫
    });
});
</script>
<style>
    .waves{
        box-shadow: 0 2px 5px 0 rgba(0,0,0,0.16),0 2px 10px 0 rgba(0,0,0,0.12);
        border-radius: 3px;
        display: inline-block;
        outline:none;
        border:0;
        overflow: hidden;
        position:relative;
        opacity: 0.9;
        text-align:center;
    }
    .waves:hover{
        opacity: 1;
        box-shadow: 0 3px 6px 0 rgba(0,0,0,0.20),0 3px 12px 0 rgba(0,0,0,0.16);
    }
    
    .waves-effect{
        border-radius: 100%;
        background-color:#D8D8D8;
        left: 20px;
        top: 20px;
        transform: scale(0);
        width: 10px;
        height: 10px;
        position:absolute;

    }
    
    .waves-effect-animation{
        animation: animation-definition 1s ease-out;  
        /*兼容各大瀏覽器*/
        -moz-animation: animation-definition 1s ease-out;  
        -webkit-animation: animation-definition 1s ease-out;  
        -o-animation: animation-definition 1s ease-out;  
    }
    @keyframes animation-definition {  
        from{  
            transform: scale(0.1);  
            opacity: 1;
        }  
        
        to{  
            transform: scale(2); /*因為漣漪的大小為標簽的最長邊泥耀,為了保證點擊標簽邊緣時,漣漪也能覆蓋整個標簽蛔添,scale值最小應為2*/
            opacity: 0;         
        } 
    }    
</style>

</head>
<body>
    <b>不需要加p標簽</b>
    <br/>
    <br/>

    <button class="waves" style="width: 125px;height: 40px;background-color: #27C4B4;color: white"> 
        Button1
    </button>
    <button class="waves" style="width: 125px;height: 40px;background-color: #EE6E73;color: white"> 
        Button2
    </button>
    <br/><br/>
    <b>需要加p標簽<b>
    <br/>
    <br/>
    <div class="waves" style="width: 125px;height: 40px;background-color: #311B92;color: white">
        <p style="line-height:40px; display:inline;">Div</p>
    </div>
    <a href="#" class="waves" style="width: 125px;height: 40px;background-color: #FF9800;color: white">
        <p style="line-height:40px; display:inline;">A</p>
    </a>
    <span class="waves" style="width: 125px;height: 40px;background-color: #607D8B;color: white">
        <p style="line-height:40px; display:inline;">Span</p>
    </span>
</body>
</html>

后續(xù)內容:

  • 目前只有button使用該樣式最方便(一開始也是只為button而寫的)痰催,至于div、a迎瞧、span等標簽顯示文字還需要嵌套一個p標簽
  • 為了方便重復使用夸溶,還需要將css、js提取出來

更新
分離html凶硅、css缝裁、js代碼。查看更新內容足绅,可移步Maves實例代碼



更新捷绑,2016.10.6
本次更新使用了類以及單例模式重構代碼,更新內容如下


只附上js文件更新部分氢妈,其他可移步Toast示例代碼:

$(document).ready(function(){

    $(".mmd-waves").mousedown(function(e) {
        var m = new MavesClass();
        m.showWaves(this,e);
    });
});
//漣漪類粹污,使其相對獨立
function MavesClass(){
    if(MavesClass.instance !== undefined){
        return MavesClass.instance;
    }
    MavesClass.instance = this;
    
    this.showWaves = function(_this,e){
        box = $(_this);
        wavesDiv = box.find("div");
        //第一次沒有漣漪div,動態(tài)生成
        if(wavesDiv[0] == null){
            var div = "<div class='mmd-waves-effect'></div>";
            box.append(div);
            wavesDiv = box.find("div");
        }
        

        //設置按鈕樣式為’waves-effect‘即去掉動畫樣式’waves-effect-animation‘
        wavesDiv[0].className = 'mmd-waves-effect';
        
        //計算漣漪坐標(折算成左上角坐標而非中心點)允懂,漣漪大胁蘖(取外標簽最長邊)
        var wH = box.width() > box.height() ? box.width() : box.height();
        var iX = e.pageX - box.offset().left;
        var iY = e.pageY - box.offset().top;
        var nX = iX - wH/2;
        var nY = iY - wH/2;

        //設置漣漪div樣式,準備播放動畫
        wavesDiv.css({
            width: wH,
            height: wH,
            left: nX,
            top: nY
        }).addClass("mmd-waves-effect-animation");//播放動畫
    }
}

附上源碼:

Maves示例代碼

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末蕾总,一起剝皮案震驚了整個濱河市粥航,隨后出現的幾起案子,更是在濱河造成了極大的恐慌生百,老刑警劉巖递雀,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異蚀浆,居然都是意外死亡缀程,警方通過查閱死者的電腦和手機搜吧,發(fā)現死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來杨凑,“玉大人滤奈,你說我怎么就攤上這事×寐” “怎么了蜒程?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伺帘。 經常有香客問我昭躺,道長,這世上最難降的妖魔是什么伪嫁? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任领炫,我火速辦了婚禮,結果婚禮上张咳,老公的妹妹穿的比我還像新娘帝洪。我一直安慰自己,他們只是感情好脚猾,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布碟狞。 她就那樣靜靜地躺著,像睡著了一般婚陪。 火紅的嫁衣襯著肌膚如雪族沃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天泌参,我揣著相機與錄音脆淹,去河邊找鬼。 笑死沽一,一個胖子當著我的面吹牛盖溺,可吹牛的內容都是我干的。 我是一名探鬼主播铣缠,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼烘嘱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蝗蛙?” 一聲冷哼從身側響起蝇庭,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎捡硅,沒想到半個月后哮内,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡壮韭,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年北发,在試婚紗的時候發(fā)現自己被綠了纹因。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡琳拨,死狀恐怖瞭恰,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情狱庇,我是刑警寧澤寄疏,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站僵井,受9級特大地震影響,放射性物質發(fā)生泄漏驳棱。R本人自食惡果不足惜批什,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望社搅。 院中可真熱鬧驻债,春花似錦、人聲如沸形葬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽笙以。三九已至淌实,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間猖腕,已是汗流浹背拆祈。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留倘感,地道東北人放坏。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像老玛,于是被迫代替她去往敵國和親淤年。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內容

  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color蜡豹,font麸粮,text-align,li...
    wzhiq896閱讀 1,754評論 0 2
  • 選擇qi:是表達式 標簽選擇器 類選擇器 屬性選擇器 繼承屬性: color镜廉,font豹休,text-align,li...
    love2013閱讀 2,315評論 0 11
  • 寫在前面:這是一篇菜鳥的學習筆記桨吊,記錄效果實現過程威根,而沒有考慮安全凤巨、兼容、性等問題洛搀。供新手參考敢茁,也希望前輩們指點。...
    im宇閱讀 3,448評論 0 4
  • Optional(可選值類型) optional是在swift中引入的新的數據類型留美,它的特點就是可選值彰檬。顧名思義就...
    Devbrave閱讀 387評論 0 2
  • 我還是會想念 想念我們曾經在一起的日子 記得你寫字永遠都是個球形 口字你一直都是畫圈 小學初中高中大學 我們一直都...
    迷了路的小孩閱讀 207評論 0 0