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"; xmlns:xlink="http://www.w3.org/1999/xlink"; 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);
时间: 2024-10-26 15:00:24

RE : 球体波浪倒计时的相关文章

android采用MVP漫画APP、适配刘海屏、小黄车主界面、录音波浪动画、综合APP等源码

Android精选源码 一款采用MVP架构的仿完整漫画APP源码 Android适配刘海屏幕 基于Xmpp协议的即时通讯社交软件(客户端+服务端) Android小黄车(ofo)app主页菜单效果 一款mvp开发框架 RxJava+Retrofit+MVP打造高颜值App源码 Android MVP架构开发的综合App源码 android搜索框,推荐搜索,历史搜索源码 Android自定义录音实现播放波浪效果动画View 实现android价格修改器效果源码 Android优质博客 Androi

canvas制作倒计时炫丽效果

<!DOCTYPE html> <head> <title>canvas倒计时</title> <style> .canvas{ display: block; border: 1px solid #000; margin: 50px auto; } </style> </head> <body> <canvas class="canvas" id="canvas"

浅谈android中仅仅使用一个TextView实现高仿京东,淘宝各种倒计时

今天给大家带来的是仅仅使用一个TextView实现一个高仿京东.淘宝.唯品会等各种电商APP的活动倒计时.最近公司一直加班也没来得及时间去整理,今天难得休息想把这个分享给大家,只求共同学习,以及自己后续的复习.为什么会想到使用一个TextView来实现呢?因为最近公司在做一些优化的工作,其中就有一个倒计时样式,原来开发的这个控件的同事使用了多个TextView拼接在一起的,实现的代码冗余比较大,故此项目经理就说:小宏这个就交给你来优化了,并且还要保证有一定的扩展性,当时就懵逼了.不知道从何处开始

JS倒计时,不会重复执行

直接上代码,亲自测试了的,没问题咯 <html> <head> <title>点击获取验证码按钮后按钮变灰,倒计时一段时间后又可重复点击</title> <script type="text/javascript" src="http://apps.bdimg.com/libs/jquery/1.6.4/jquery.js"></script> </head> <body>

项目需求:自定义倒计时的TextView

现在这么一个需求: 我有一个ListView,每一个列表项 布局如上图,顶部一个大图片展示,中部一个音频播放,底部一个描述文字. 在这个界面,一次只能点击一个列表项的播放按钮,那么我直接在ListView所属的activity创建了唯一的一个MediaPlayer,然而,这不是问题,所有的音频方面的播放冲突都解决了 问题就在中部的音频播放,我需要点击左边的播放按钮,然后右边有一个剩余时间要跟随着变化,当然点击暂停的时候,剩余时间也要暂停 首先,这里运用了购物车功能的原理实现按钮的操作.Andro

WdatePicker设置时间与倒计时

之前苦于jQuery的datetimepicker插件不知道如何设置秒数,用了同学推荐的WdatePicker,真心好用. 相关文档用法可以上http://www.my97.net/dp/index.asp看详细介绍. 页面显示只需要<input type="text" id="datetimepicker1" onfocus="WdatePicker({dateFmt:'yyyy-MM-dd HH:mm:ss'})" class=&quo

倒计时时间控件

在做一些电商或购物的app时,我们经常会看到倒计时抢购的标示,今天恰有时间把项目中用到的该控件提取出来,有需要的可以参考下 ====================================================================================================== 版权所有,如需转载请标明出处:http://blog.csdn.net/you4580 =========================================

PHP+HTML实现登出界面倒计时效果

在WAMP(Windows+Apache+MySQL+PHP)做网站时,通常需要使用Session记录表单登陆用户名和密码等变量,而在登出时需要清除Session.通常我想实现的登出是通过alert提示用户然后header跳转,但下面的代码是通过JavaScript实现的时间倒计时并跳转到主页的效果,主要是看到学校的BT网站等都是这个效果. PS:参考 C# 系统应用之Cookie\Session基础知识及php读取Cookie\Session 代码如下: <?php session_start

如何消除 sql server 2008 查询语句的红色波浪线

近来学习sql的时候,所以就用上了sql server 2008 ,这个版本有个很好的地方就是会智能提示,但是这种智能提示有些时候这是很烦人,比如说新建一张数据表之后,表名为 Person当使用结构化查询语句的时候,输入Person 总是会出现红色波浪线(红色波浪线一般是提示有错误,但是这里并没错)百度上有个很好的解释:这个表的字段列表,让你选择.但是,当你新建了一个对象的时候, 例如表, 或者你的那个例子,是新建存储过程abc这个时候,数据库那里,已经有存储过程abc 了.但是客户端的缓存里面