freeCodeCamp 番茄工作法計時器

目標:CodePen.io 上做一個類似于 http://codepen.io/FreeCodeCamp/full/VemPZX 的 APP.
規(guī)則 #1: 代碼是開源的,你可以借鑒娄蔼,但請不要抄襲镣煮。
規(guī)則 #2: 可以使用你喜愛的任何庫來定制屬于你自己的風(fēng)格蹭沛,實現(xiàn)下面的功能.
功能: 可以啟動一個 25 分鐘的番茄鐘, 計時器將在 25 分鐘后停止.
功能: 可以重置番茄鐘的狀態(tài)以便啟動下一次計時.
功能: 可以為每個番茄鐘自定義時長.

在簡書上不少關(guān)于干貨的文章都有介紹過番茄工作法,即設(shè)定固定的學(xué)習(xí)時間锋八,在這段時間內(nèi)心無旁騖的學(xué)習(xí)掐暮,再休息相應(yīng)的時間稻轨,休息時間結(jié)束后繼續(xù)學(xué)習(xí)励翼。這就是番茄工作法蜈敢,勞逸結(jié)合。
這邊用angularjs的方式實現(xiàn)番茄工作法計時器的小實例:

  • session流逝的時間用綠顏色填充
  • break流逝的時間用紅色填充
  • 單擊計時器可以暫停計時器
  • 暫停狀態(tài)才可以修改session和break的值汽抚,否則不可以修改
<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>angularJS實例-番茄鐘</title>
    <style type="text/css">
        @import url(https://fonts.googleapis.com/css?family=Pacifico|Open+Sans:300);
        *{margin: 0;font-family:Open Sans,Arial; }
        html,body,main{height: 100%;overflow: hidden;background: #333333;}
        h1{display: block;background: #333333;margin:0 auto;color: white;text-align: center;font-family: 'Pacifico';font-size: 5em;}
        header{display: flex;justify-content: center;text-align: center;margin: 0 auto;color: #ffffff;text-transform: uppercase;padding: 20px;}
        header .session{font-size: .8rem;display: flex;}
        header .session .breakCtrl,header .session .sessionCtrl{display: inline;padding-left: 30px;padding-right: 30px;}
        header .session .minus,header .session .plus{background: #333333;color: #fff;border: none;cursor: pointer;font-size: 2rem;outline: none;}
        header .session .time{font-size: 2.5rem;padding-left: 10px;padding-right: 10px;}
        section{background: #333333;height: 100%;color: #fff;}
        section .title{text-align: center;line-height: 180px;font-size: 0.8em;}
        section .timer{margin:0 auto;text-align: center;width: 300px;height: 300px;font-size: 4em;border:2px solid #99cc00;border-radius: 50%;cursor: pointer;position: relative;z-index: 20;overflow: hidden;}
        section .timer:before{content: '';position:absolute;top: 0;bottom: 0;left: 0;right: 0;border-radius: 50%;z-index: 2;border: 4px solid #333333;}
        section .fill{content: '';position: absolute;background: #99cc00;bottom: 0;right: 0;left: 0;z-index: -1;}
    </style>
<script src="https://cdn.bootcss.com/angular.js/1.4.6/angular.min.js"></script>
</head>
<body>
    <h1>FreeCodeCamp</h1>
    <main ng-app="PomodoroApp" ng-controller="MainCtrl">
        <header>
            <div class="session">
                <!-- break length控制器 -->
                <div class="breakCtrl">
                    <p>break length</p>
                    <button class="minus" ng-click="breakLengthChange(-1)">-</button><span class="time">{{breakLength}}</span>
                    <button class="plus" ng-click="breakLengthChange(1)">+</button>
                </div>
                <!-- session length控制器 -->
                <div class="sessionCtrl">
                    <p>session length</p>
                    <button class="minus" ng-click="sessionLengthChange(-1)">-</button><span class="time">{{sessionLength}}</span>
                    <button class="plus" bg-click="sessionLengthChange(1)">+</button>
                </div>
            </div>
        </header>
        <section ng-click="toggleTimer()">
            <div class="timer">
                <p class="title">{{sessionName}}</p>
                <p>{{timeLeft}}</p><span class="fill" ng-style="{'height':fillHeight,'background':fillColor}"></span>
            </div>
        </section>
    </main>
</body>
<script type="text/javascript">                                                                                        
    var app = angular.module('PomodoroApp',[]);   //angularjs模塊初始化
    app.controller('MainCtrl',function($scope,$interval){
        $scope.breakLength = 5;  //breaklength初始化值為5 休息時間
        $scope.sessionLength = 25;  //sessionlength初始化值為25  工作時間
        $scope.timeLeft = $scope.sessionLength;   //剩余時間為sessionlength的長度
        $scope.fillHeight = '0%';    //一開始的填充高度為0
        $scope.sessionName = 'Session';   //計時器的名字為session 可以自己隨便定義
        $scope.currentTotal;

        var runTimer = false;  //標志是否在計時的布爾值
        var secs = 60 * $scope.sessionLength;  //將分鐘轉(zhuǎn)換成秒
        $scope.originalTime = $scope.sessionLength;  //初始設(shè)置的session長度

        //將時間轉(zhuǎn)換成時分秒的顯示形式
        function secondsToHms(d){  
            d = Number(d);
            var h = Math.floor(d/3600);
            var m = Math.floor(d%3600/60);
            var s = Math.floor(d%3600%60);
            return((h>0?h+":"+(m<10?"0":""):"")+m+":"+(s<10?"0":"")+s);;
        }

        //Change default session length  改變sessionlength的長度
        $scope.sessionLengthChange = function(time){
            if(!runTimer){  //當處于非運行狀態(tài)的時候抓狭,可以對原來設(shè)置的session大小進行加減
                if($scope.sessionName === 'Session'){
                    $scope.sessionLength += time;
                    if($scope.sessionLength < 1){
                        $scope.sessionLength = 1;
                    }
                    $scope.timeLeft = $scope.sessionLength;
                    $scope.originalTime = $scope.sessionLength;
                    secs = 60*$scope.sessionLength;
                }
            }
        }

        //Change default break length  改變breaklength的長度
        $scope.breakLengthChange = function(time){
            if(!runTimer){
                $scope.breakLength += time;
                if($scope.breakLength<1){
                    $scope.breakLength = 1;
                }
                if($scope.sessionName === 'Break!'){
                    $scope.timeLeft = $scope.breakLength;
                    $scope.originalTime = $scope.breakLength;
                    secs = 60 * $scope.breakLength;
                }
            }
        }

        $scope.toggleTimer = function(){
            if(!runTimer){   //如果正在運行中
                if($scope.currentName == 'Session'){
                    $scope.currentLength = $scope.sessionLength;
                }else{
                    $scope.currentLength = $scope.breakLength;
                }

                updateTimer();
                runTimer = $interval(updateTimer,1000);   //每秒更新一下時間
            }else{
                $interval.cancel(runTimer);  //取消runTimer,暫停
                runTimer = false;
            }
        }

        function updateTimer(){
            secs -= 1;  //以1s為單位進行時間更新
            if(secs <0){
                //countdown is finished

                //Play audio
                // Play audio
            // var wav = 'http://www.oringz.com/oringz-uploads/sounds-917-communication-channel.mp3';
            // var audio = new Audio(wav);
            // audio.play();

            //toggle break an session
            $scope.fillColor = '#333333';
            if($scope.sessionName === 'Break!'){
                $scope.sessionName = 'Session';
                $scope.currentLength = $scope.sessionLength;
                $scope.timeLeft = 60 * $scope.sessionLength;
                $scope.originalTime = $scope.sessionLength;
                secs = 60 * $scope.sessionLength;
            }else{
                $scope.sessionName = 'Break!';
                $scope.currentLength = $scope.breakLength;
                $scope.timeLeft = 60 * $scope.breakLength;
                $scope.originalTime = $scope.breakLength;
                secs = 60 * $scope.breakLength;
            }
        }else{
            if($scope.sessionName === 'Break!'){
                $scope.fillColor = '#ff4444';
            }else{
                $scope.fillColor = '#99cc00';
            }
            $scope.timeLeft = secondsToHms(secs);

            var denom = 60 * $scope.originalTime;
            var perc = Math.abs((secs / denom) * 100 -100);
            $scope.fillHeight = perc + '%';   //計算已經(jīng)流逝的時間占總時間的百分比
            console.log($scope.fillHeight);
        }
    }
    });
</script>
</html>
session時間流逝.gif

break時間流逝.gif

代碼github地址:https://github.com/Iris-mao/css-tricks/tree/master/Pomodoro-Clock

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末造烁,一起剝皮案震驚了整個濱河市否过,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌惭蟋,老刑警劉巖苗桂,帶你破解...
    沈念sama閱讀 211,743評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異告组,居然都是意外死亡煤伟,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,296評論 3 385
  • 文/潘曉璐 我一進店門木缝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來持偏,“玉大人,你說我怎么就攤上這事氨肌。” “怎么了酌畜?”我有些...
    開封第一講書人閱讀 157,285評論 0 348
  • 文/不壞的土叔 我叫張陵怎囚,是天一觀的道長。 經(jīng)常有香客問我桥胞,道長恳守,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,485評論 1 283
  • 正文 為了忘掉前任贩虾,我火速辦了婚禮催烘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘缎罢。我一直安慰自己伊群,他們只是感情好,可當我...
    茶點故事閱讀 65,581評論 6 386
  • 文/花漫 我一把揭開白布策精。 她就那樣靜靜地躺著舰始,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咽袜。 梳的紋絲不亂的頭發(fā)上丸卷,一...
    開封第一講書人閱讀 49,821評論 1 290
  • 那天,我揣著相機與錄音询刹,去河邊找鬼谜嫉。 笑死萎坷,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的沐兰。 我是一名探鬼主播哆档,決...
    沈念sama閱讀 38,960評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼僧鲁!你這毒婦竟也來了虐呻?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,719評論 0 266
  • 序言:老撾萬榮一對情侶失蹤寞秃,失蹤者是張志新(化名)和其女友劉穎斟叼,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體春寿,經(jīng)...
    沈念sama閱讀 44,186評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡朗涩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,516評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了绑改。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谢床。...
    茶點故事閱讀 38,650評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖厘线,靈堂內(nèi)的尸體忽然破棺而出识腿,到底是詐尸還是另有隱情,我是刑警寧澤造壮,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布渡讼,位于F島的核電站,受9級特大地震影響耳璧,放射性物質(zhì)發(fā)生泄漏成箫。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,936評論 3 313
  • 文/蒙蒙 一旨枯、第九天 我趴在偏房一處隱蔽的房頂上張望蹬昌。 院中可真熱鬧,春花似錦攀隔、人聲如沸皂贩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,757評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽先紫。三九已至,卻和暖如春筹煮,著一層夾襖步出監(jiān)牢的瞬間遮精,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,991評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留本冲,地道東北人准脂。 一個月前我還...
    沈念sama閱讀 46,370評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像檬洞,于是被迫代替她去往敵國和親狸膏。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,527評論 2 349

推薦閱讀更多精彩內(nèi)容