freeCodeCamp 番茄工作法计时器

目标:CodePen.io 上做一个类似于 http://codepen.io/FreeCodeCamp/full/VemPZX 的 APP.
规则 #1: 代码是开源的,你可以借鉴,但请不要抄袭。
规则 #2: 可以使用你喜爱的任何库来定制属于你自己的风格,实现下面的功能.
功能: 可以启动一个 25 分钟的番茄钟, 计时器将在 25 分钟后停止.
功能: 可以重置番茄钟的状态以便启动下一次计时.
功能: 可以为每个番茄钟自定义时长.

在简书上不少关于干货的文章都有介绍过番茄工作法,即设定固定的学习时间,在这段时间内心无旁骛的学习,再休息相应的时间,休息时间结束后继续学习。这就是番茄工作法,劳逸结合。
这边用angularjs的方式实现番茄工作法计时器的小实例:

  • session流逝的时间用绿颜色填充
  • break流逝的时间用红色填充
  • 单击计时器可以暂停计时器
  • 暂停状态才可以修改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;  //将分钟转换成秒
        $scope.originalTime = $scope.sessionLength;  //初始设置的session长度

        //将时间转换成时分秒的显示形式
        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){  //当处于非运行状态的时候,可以对原来设置的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 + '%';   //计算已经流逝的时间占总时间的百分比
            console.log($scope.fillHeight);
        }
    }
    });
</script>
</html>
session时间流逝.gif

break时间流逝.gif

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 161,780评论 4 369
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,424评论 1 305
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 111,397评论 0 254
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,576评论 0 218
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,997评论 3 295
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,945评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,107评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,850评论 0 208
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,625评论 1 250
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,804评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,285评论 1 265
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,613评论 3 261
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,291评论 3 242
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,164评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,963评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 36,096评论 2 285
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,886评论 2 278

推荐阅读更多精彩内容