RE: 球体波浪倒计时

背景:

移动端需要做一个倒计时球体水波的效果。主要用到了CSS的SVG瞄点动画和JS的计时器。该动画原型来自于 使用球体水面波动显示进度动画 http://wow.techbrood.com/fiddle/27745

效果展示:

<div class="homepage">
 <div class="timeboxout  ball">
   <div class="timeboxmiddle ball">
      <div class="timeboxin">
          <div class="box">
             <div class="percent">
                 <p id="prompt1">第<span id="nw"></span>周</p>
                 <p id="prompt2">本周剩余时间</p>
                  <p id="prompt3">
                    //JS获取时间信息

                    <span id="days"></span>
                    <span id="hours"></span>
                    <span id="minutes"></span>
                     <span id="seconds"></span>
                   </p>
                </div>
            <div id="water" class="water ball"> //最底层水量
             //后面的水波

            <svg viewBox="0 0 560 20" class="water_wave water_wave_back ball">
                 <use xlink:href="#wave"></use>
              </svg>
              //水波前面的波浪

             <svg viewBox="0 0 560 20" class="water_wave water_wave_front ball">
                 <use xlink:href="#wave"></use>
              </svg>
              </div>
         </div>
     </div>
 </div>
 </div>
//SVG波浪瞄点

    <svg version="1.1" xmlns="[http://www.w3.org/2000/svg"](http://www.w3.org/2000/svg%22); 
xmlns:xlink="[http://www.w3.org/1999/xlink"](http://www.w3.org/1999/xlink%22);
 x="0px" y="0px" style="display: none;">
            <symbol id="wave">
                <path d="M420,20c21.5-0.4,38.8-2.5,51.1-4.5c13.4-2.2,26.5-5.2,
                                27.3-5.4C514,6.5,518,4.7,528.5,2.7c7.1-1.3,17.9-2.8,
                                31.5-2.7c0,0,0,0,0,0v20H420z"></path>
                <path d="M420,20c-21.5-0.4-38.8-2.5-51.1-4.5c-13.4-2.2-26.5-5.2-27.3-5.4C326,
                                6.5,322,4.7,311.5,2.7C304.3,1.4,293.6-0.1,280,0c0,0,0,0,0,0v20H420z"></path>
                <path d="M140,20c21.5-0.4,38.8-2.5,51.1-4.5c13.4-2.2,26.5-5.2,
                                27.3-5.4C234,6.5,238,4.7,248.5,2.7c7.1-1.3,17.9-2.8,
                                31.5-2.7c0,0,0,0,0,0v20H140z"></path>
                <path d="M140,20c-21.5-0.4-38.8-2.5-51.1-4.5c-13.4-2.2-26.5-5.2-27.3-5.4C46,
                                6.5,42,4.7,31.5,2.7C24.3,1.4,13.6-0.1,0,0c0,0,0,0,0,0l0,20H140z"></path>
            </symbol>
      </svg>
</div>
.homepage .box{
      width: 56%;
      height: 100%;
      /*ackground-color: #f2f2f2;*/  /*球体内部背景色*/
}
      
      
.homepage .timeboxout{
      width: 11.5625rem;
      height: 11.5625rem;
      box-sizing: border-box;
      border: 1px solid #2edb75;
      border-radius: 50%;
      position: relative;
      margin-left: auto;margin-right: auto;
      margin-bottom: 1rem;
}

.homepage .timeboxmiddle{
      width: 10.9375rem;height: 10.9375rem;
      box-sizing: border-box;
      background: -webkit-linear-gradient(top,#ffffff,#f8cd51);
      border-radius: 50%;
      position: absolute;
      top: 50%;left: 50%;
      transform: translate(-50%, -50%);
      overflow: hidden;
}

.homepage .timeboxin{
      background-color: #ffffff;
      width: 10.875rem;height: 10.875rem;
      box-sizing: border-box;
      border-radius: 50%;
      position: absolute;
      top: 50%;left: 50%;
      transform: translate(-50%, -50%);
      overflow: hidden;
}
     

.homepage .box {
    height: 10.875rem;
    width: 10.875rem;
    position: absolute;
    top: 50%;
    left: 50%;
    -webkit-transform: translate(-50%, -50%);
    transform: translate(-50%, -50%);
    border-radius: 100%;
    overflow: hidden;
}
.homepage .box .percent {
   text-align: center;
   color: black;
   margin-top: 2.03125rem;
   z-index: 3;
   position: absolute;
   left: 50%;
   transform: translateX(-50%);
   height: 100%;width: 100%;
}
/*.homepage p{margin-bottom: 0.5625rem;}*/
#prompt1{
      font-size: 1.1875rem;
}
#prompt2{
      font-size: 0.8125rem;
}
#prompt3{
      font-size: 1.125rem;
}
.homepage .box .water {
      position: absolute;
      left: 0;
      top: 0;
      z-index: 2;
      width: 100%;
      height: 100%;
      -webkit-transform: translate(0, 100%);
      transform: translate(0, 100%);
      background: #2edb75;
}

.homepage .box .water_wave {
      width: 200%;
      position: absolute;
      bottom: 100%;
}
.homepage .box .water_wave_back {               /*后面的波纹*/
      right: 0;
      fill: #7befaa;
      -webkit-animation: wave-back 1.4s infinite linear;
      animation: wave-back 1.4s infinite linear;
}
.homepage .box .water_wave_front {              /*前面的波纹*/
      left: 0;
      fill: #2edb75;
      margin-bottom: -1px;
      -webkit-animation: wave-front .7s infinite linear;
      animation: wave-front .7s infinite linear;
}

/*是波浪匀速移动*/

@-webkit-keyframes wave-front {
      100% {
            -webkit-transform: translate(-50%, 0);
            transform: translate(-50%, 0);
      }
}
@keyframes wave-front {
      100% {
            -webkit-transform: translate(-50%, 0);
            transform: translate(-50%, 0);
      }
}
@-webkit-keyframes wave-back {
      100% {
            -webkit-transform: translate(50%, 0);
            transform: translate(50%, 0);
      }
}
@keyframes wave-back {
      100% {
            -webkit-transform: translate(50%, 0);
            transform: translate(50%, 0);
      }
}
var days = document.getElementById("days"),
hour = document.getElementById("hours"),
minutes = document.getElementById("minutes"),
seconds = document.getElementById("seconds");
var nwweek = document.getElementById("prompt1");
var countdown = document.getElementById("prompt3");
var water = document.getElementById("water");
var ballchange = document.getElementsByClassName("ball");
                  
var timeRate;
var interval;
                  
//计算累积第几周

function weeknum(){
      var nw = document.getElementById("nw");
      // 获取当前时间
      var currentTime = new Date();
      // 这里写的是2015年11月2日0时0分0秒   Javascript中月份是实际数字减1,故指定日期月份减一,另获取到毫秒。
      var targetTime = (new Date(2015, 10, 2, 0, 0, 0)).getTime();
      var offsetTime =currentTime - targetTime;
 
      // 将时间转位天数
      var offsetDays =Math.floor((offsetTime / (3600 * 24 * 1000))/7);
      nw.innerHTML=offsetDays+1;
}               
                  
//计算剩余的时间并更新
function residueTime () {
    var newtime = new Date();
    var day = newtime.getDay(); //得到今天周几
    var hours = newtime.getHours(); //得到现在时间的小时
    var minuter = newtime.getMinutes(); //得到现在时间的分数
    var second = newtime.getSeconds(); //得到现在时间的秒数
                        
    day = 7 - (day ? day : 7);
    hours = 23 - hours;
    minuter = 59 - minuter;
    second = 59 - second;
    if (day==0) {
        countdown.innerHTML = hours  + "时" + minuter + "分" + second + "秒" ;
    } else{
        countdown.innerHTML =  day + "天" + hours  + "时" + minuter + "分" + second + "秒" ;
                              
    }
                        
                        
    return (day * 24 * 60 * 60 + hours * 60 * 60 + minuter * 60 + second) / 604800 * 100;
                  
}     
                        

//球面颜色变化

interval = setInterval(function () {
    timeRate = residueTime();
    water.style.transform = 'translate(0' + ',' + (100 - timeRate) + '%)';
    if (timeRate == 0) {
        document.getElementsByTagName("svg")[0].innerHTML = "";
        document.getElementsByTagName("svg")[1].innerHTML = "";
        clearInterval(interval);
    }
    else if(timeRate >50) {
        ballchange[0].style.border = "1px solid #2edb75";
        ballchange[1].style.background = "-webkit-linear-gradient(top,#ffffff,#2edb75)";
        ballchange[2].style.background = "#2edb75";
        ballchange[3].style.fill = "#7befaa";
        ballchange[4].style.fill = "#2edb75";
     }
     else if(timeRate <= 50 && timeRate > 20) {
        ballchange[0].style.border = "1px solid #fbbc05";
        ballchange[1].style.background = "-webkit-linear-gradient(top,#ffffff,#fbbc05)";
        ballchange[2].style.background = "#fbbc05";
        ballchange[3].style.fill = "#ffd762";
        ballchange[4].style.fill = "#fbbc05";
     }
     else{
        ballchange[0].style.border = "1px solid #fe6c0d";
        ballchange[1].style.background = "-webkit-linear-gradient(top,#ffffff,#fe6c0d)";
        ballchange[2].style.background = "#fe6c0d";
        ballchange[3].style.fill = "#ff9753";
        ballchange[4].style.fill = "#fe6c0d";
      }
},500);

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

推荐阅读更多精彩内容