网页版番茄时钟的制作——Pomodoro Clock

番茄时钟的功能想必大家都熟悉,简单点说就是工作时间+休息时间。
该网页就实现了这两个功能,可以自定义工作时间与休息时间,且允许暂停。

先放张效果图:
这里写图片描述
效果演示:戳我进入演示
解释一下,session length表示工作时长,break length表示休息时长,若要看div填充效果则建议将session length改成1来观看,效果比较明显。

下面附上代码,里面关键部分有较详细的注释,可以直接粘贴拿去直接运行的。

html

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>PomodoroClock</title>

    <link rel="stylesheet" type="text/css" href="http://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css">
    <link href="https://fonts.googleapis.com/css?family=Bitter|Sedgwick+Ave+Display" rel="stylesheet">
    <link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
    <h1>Yinyou PomodoroClock</h1>

    <div class="main">
        <div class="control">
            <div class="break">
            <p>BREAK LENGTH</p>
                <i class="fa fa-minus-square-o" aria-hidden="true" id="break-minus"></i>
                <span id="break-length">5</span>
                <i class="fa fa-plus-square-o" aria-hidden="true" id="break-plus"></i>
            </div>
            <div class="length">
            <p>SESSION LENGTH</p>
                <i class="fa fa-minus-square-o" aria-hidden="true" id="session-minus"></i>
                <span id="session-length">25</span>
                <i class="fa fa-plus-square-o" aria-hidden="true" id="session-plus"></i>
            </div>
        </div>
        <div class="clock">
            <h2 id="show-title">Session</h2>
            <h2 id="show-time">25:00</h2>
            <span id="per"></span>

        </div>
    </div>

<script src='http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js'></script>
<script type="text/javascript" src="js/clock.js"></script>
</body>
</html>

css

*{
    margin: 0;
    padding: 0;
}
html,body{
    height: 100%;
    width: 100%;
    background-color: #cb4042;
    overflow: hidden;
}
h1{
    text-align: center;
    margin-top: 5%;
    color: #fff;
    font-family: 'Sedgwick Ave Display', cursive;
}

.main{
    margin-top: 5%;
    position: relative;
    left: 50%;
    transform: translateX(-50%);
    width: 100%;
    height: 70%;
    text-align: center;
}

.control{
    width: 100%;
    display: flex;
    text-align: center;
    justify-content: center;
}

.break{
    display: inline;
    padding: 0 30px; 
}
.length{
    display: inline;
    padding: 0 30px;
}
span{
    font-size: 2em;
    color: #fff;
    font-family: 'Bitter', serif;
}
.fa{
    font-size: 1.4em;
    color: #fff;
    cursor: pointer;
    margin: 0 10px;
}

.control p{
    color: #b5caa0;
}

.clock{
    width: 300px;
    height: 300px;
    border-radius: 50%;
    border:4px solid #a8d8b9;
    text-align: center;
    position: relative;
    left: 50%;
    transform: translateX(-50%);
    margin-top: 30px;
    cursor: pointer;
    z-index: 20;
    overflow: hidden;
}

.clock:before{
    content: '';
    position: absolute;
    border:4px solid #cb4042;
    border-radius: 50%;
    top: 0;
    left: 0;
    right: 0;
    bottom: 0;
}

.clock h2{
    font-family: 'Bitter', serif;
    font-size: 2.5em;
    margin-top: 80px;
    color: #fff;
}

#per{
    margin: 0;
    position: absolute;
    bottom: 0;
    right: 0;
    left: 0;
    height: 0%;
    width: 100%;
    background-color: #b5caa0; 
    /* background-color: #3f2b36; */
    z-index: -1;
}

js

$(document).ready(function(){
    var session = 25;       //这个是默认工作时间,用在设置那儿显示的,这里以分钟为单位,且超过60也是分钟
    var breaklength = 5;            //设置break时长——休息时长,细节同session
    var flag = 1;           //设置工作状态,1是工作的暂停,2是正在休息的暂停,3是在工作中,4是休息中
    var sec = session*60;   //用来记录变化中的时间,单位为秒
    var percent = 0;    //记录背景颜色显示的高度,0-100,是百分比

    $("#break-minus").on("click",function(){
        if(flag !== 1 && flag !== 2){
            return;         //如果非暂停状态,点击无效
        }
        breaklength--;
        if(breaklength < 1){
            breaklength = 1;
        }
        $("#break-length").html(breaklength);
        if(flag === 2){
            //如果是休息的暂停,一旦改了,就又对sec产生了修改
            sec = breaklength*60;
        }
        showHMS(breaklength,2);
    });
    $("#break-plus").on("click",function(){
        if(flag !== 1 && flag !== 2){
            return;         //如果非暂停状态,点击无效
        }
        breaklength++;
        $("#break-length").html(breaklength);
        if(flag === 2){
            //如果是休息的暂停,一旦改了,就又对sec产生了修改
            sec = breaklength*60;
        }
        showHMS(breaklength,2);
    });
    $("#session-minus").on("click",function(){
        if(flag !== 1 && flag !== 2){
            return;         //如果非暂停状态,点击无效
        }
        session--;
        if(session < 1){
            session = 1;
        }
        $("#session-length").html(session);
        if(flag === 1){
            //如果是工作的暂停,一旦改了,就又对sec产生了修改
            sec = session*60;
        }
        showHMS(session,1);
    });
    $("#session-plus").on("click",function(){
        if(flag !== 1 && flag !== 2){
            return;         //如果非暂停状态,点击无效
        }
        session++;
        $("#session-length").html(session);
        if(flag === 1){
            //如果是工作的暂停,一旦改了,就又对sec产生了修改
            sec = session*60;
        }
        showHMS(session,1);
    });

    //在时钟上显示时分秒,传两个参数,一个是分钟,一个是状态。
    //如果在工作的暂停中,修改休息的时长,不改变时钟上的显示,state有两个取值,取1时表示修改工作时长,取2表示修改休息时长
    var showHMS = function(min,state){
        if(state  !== flag){
            return;         //如果不是在对应的暂停状态,就不改变时钟上显示的值
        }
        var show = "";
        if(min >= 60){
            show += parseInt(min/60)+":";
            min = min%60;
        }
        if(min<10){
            show+="0";
        }
        show+=min+":00";
        $("#show-time").html(show);
    };




    //开始后时间的变化,参数是剩下的秒数
    function timeChange(){
        var temp = sec;
        if(flag === 1 || flag === 2){
            //如果是暂停中,就不变时间
            return;
        }
        if(sec === 0){
            if(flag === 3){
                flag = 4;
                sec = breaklength*60;
                $("#show-title").html("Break");
            }else{
                flag = 3;
                sec = session*60;
                $("#show-title").html("Session");
            }

        }

        var showHMS = "";
        if(temp>=3600){
            showHMS+=parseInt(second/360)+":";
            temp = temp%360;
        }
        if(temp<70){
            showHMS+="0";
        }
        showHMS+=parseInt(temp/60)+":";
        temp = temp%60;
        if(temp<10){
            showHMS+="0";
        }
        showHMS+=temp;


        //console.log(showHMS);
        $("#show-time").html(showHMS);
        if(flag === 3){
            //工作中
            $("#per").css('background-color','#b5caa0');
            if(sec === 0){
                percent = 100;
            }else{
                percent = (session*60-sec)/session/60*100;
            }
            $("#per").css('height',percent+'%');
        }
        if(flag === 4){
            //休息中
            $("#per").css('background-color',"#3f2b36");
            if(sec === 0){
                percent = 100;
            }else{
                percent = (breaklength*60-sec)/breaklength/60*100;
            }
            $("#per").css('height',percent+'%');
        }
        sec--;
        setTimeout(timeChange,1000);
    };



    //时钟点击事件——开始与暂停的转换,及开始后时间的变化
    $(".clock").on("click",function(){
        if(flag === 1){
            flag = 3;
        }else if(flag === 3){
            flag = 1;
        }else if(flag === 2){
            flag = 4;
        }else if(flag === 4){
            flag = 2;
        }

        //console.log(sec);
        timeChange();
    });




});



欢迎大家加入QQ群一起交流讨论,「吟游」程序人生——YinyouPoet

posted @ 2017-08-12 23:21  _吟游诗人  阅读(946)  评论(0编辑  收藏  举报