基于图像的倒计时时钟

时间:2013-11-06 22:01:33

标签: javascript jquery

我有一个倒计时钟,工作得非常好。现在问题是我可以将图像显示为数字而不是html。我似乎无法弄清楚我将如何处理它的逻辑。我真的不想为此使用插件,所以这真的不是一个选项。

时钟的JS就是这个

setInterval(function(){
    var future = new Date("Jan 20 2014 21:15:00 GMT+0200");
    var now = new Date();
    var difference = Math.floor((future.getTime() - now.getTime()) / 1000);

    var seconds = fixIntegers(difference % 60);
    difference = Math.floor(difference / 60);

    var minutes = fixIntegers(difference % 60);
    difference = Math.floor(difference / 60);

    var hours = fixIntegers(difference % 24);
    difference = Math.floor(difference / 24);

    var days = difference;

    $(".seconds").text(seconds + "s");
    $(".minutes").text(minutes + "m");
    $(".hours").text(hours + "h");
    $(".days").text(days + "d");
}, 1000);

function fixIntegers(integer)
{
    if (integer < 0)
        integer = 0;
    if (integer < 10)
        return "0" + integer;
    return "" + integer;
}

我已将图像存储在此

的数组中
var linkCons = 'http://soumghosh.com/otherProjects/Numbers/'

var num = [];
var linkCons = "http://soumghosh.com/otherProjects/Numbers/";
for(var i = 0; i < 10; i++) {
    num.push(linkCons + "nw" + i + ".png");
}

感谢堆栈溢出帮助我清理阵列。真的很喜欢它

这是工作小提琴 http://jsfiddle.net/sghoush1/wvbPq/3/

2 个答案:

答案 0 :(得分:2)

你只能使用一个精灵图像和我创建的这段代码来实现:

<强> LIVE DEMO

enter image description here

jQuery( function($) {

    var fut = new Date("Jan 20 2014 21:15:00 GMT+0200").getTime(),
        obj = {};

    // Number splitter
    function intSpl( i ){
      i = Math.floor(i);
      return [~~(i/10), i%10]; // 37=[3,7] // 5=[0,5] // 0=[0,0] 
    }

    function drawTime(){  
      var now = new Date().getTime(),   
          dif = now<fut ? Math.floor( (fut-now)/1000) : 0;
      obj.s = intSpl(dif % 60);
      obj.m = intSpl(dif/60 % 60);
      obj.h = intSpl(dif/60/60 % 24);
      obj.d = intSpl(dif/60/60/24);  

      for(var key in obj){    
         if(obj.hasOwnProperty(key)){
            for(var i=0; i<2; i++){ // get el ID number (0,1)
                $('#'+ key+i).css({backgroundPosition: -obj[key][i]*50 });
            }
         }    
      }  
    }
    drawTime(); 
    setInterval(drawTime, 1000);

});

这个简单的 HTML

<div id="clock">   
  <span id="d0"></span>  
  <span id="d1"></span>  

  <span id="h0"></span>  
  <span id="h1"></span>

  <span id="m0"></span>  
  <span id="m1"></span>

  <span id="s0"></span>  
  <span id="s1"></span>  
</div>

CSS

#clock span{
  display:inline-block;
  width:50px;
  height:85px;
  background:url('http://i.imgur.com/uBTxTTD.jpg');
  background-position:0 0;
}
#clock span:nth-child(even){
  margin-right:15px;
}

解释这个想法:

  • 创建元素,每个元素将保留当前2位数值的一位数;
  • 将常用的bg图像设置为CSS中的所有span
  • 每隔一秒移动-(witdh * number) px
  • 留下的每个元素的背景图像

虽然上面列出的似乎是逻辑,但你可以在这里看到的第一个问题是如何单独检索一个JS时间数字(1或2位数),如果需要保持领先,并引用每个数字到在HTML中定位正确的元素?

让我们从分割数字开始:

35 == 3, 5 /// 0 == 0, 0 // this is an example of what we need.

var n  = 35;        // Set any 1 or 2 digit number.
var n1 = ~~(n/10);  // 3 //// ~~ "Double Bitwise NOT"
                                 // just instead of parseInt(time/10, 10).
var n2 = n%10;      // 5 //// %  "Mudulus operator" (reminder).

Example playground

JS分组

现在,如何分组这两个分开的数字然后说:“嘿,你们两个是我的时钟秒!” ?
只需将它们放入阵列即可! [3, 5],因为我们还有几分钟,几小时和一天 - 让我们简单地将所有这些数组放入Object并分配键名,这将导致对象如:

obj = {d:[7,4], h:[1,9], m:[2,9], s:[0,7]}

参考HTML

拥有该Object并知道在for...in循环中我们可以检索Key名称和数组值,例如:obj['d'][0] === 7 obj['d'][5] === 4

表示我们需要for循环来检索01以获取数组位置[pos0, pos1]中的值。 所有这些都在for...in循环中,它将获得KEY名称:d, h, m, s

2pos x 4keyNames = 8个元素迭代/秒

表示现在我们可以定位ID元素,例如:#s0#s1
我们现在需要的是通过
检索值并为该元素背景设置动画  -width * digit

答案 1 :(得分:0)

嗯,还有另一种方法可以用来解决同样的问题。这是步骤。首先,我为每个图像位置编写了一个CSS类选择器。

.list-group-item .digit-display{
  display:inline-block;
  width:50px;
  height:85px;
  background:url('http://i.imgur.com/uBTxTTD.jpg');
}

.position-0 {
  background-position: 0 0;
}

.position-1 {
  background-position: -50px 0px !important;
}

然后我写了一个JavaScript函数,它接受一个数字作为输入并返回该数字的CSS类选择器,如下所示。

  displayDigit(digit) {
    const baseSelector = "digit-display position-";
    return `${baseSelector}${digit}`;
  }

最后在JSX元素中调用此函数,如下所示。

<span className = {this.displayDigit(remainingTime["h"].charAt(0))}></span>

这解决了这个问题。

但是,如果某人确实需要使用上面指定的基于jquery的方法,我们仍然可以压缩相同的代码,如下所示。

  secondsToTime(secs) {
    let hours = `${constants.ZERO}${Math.floor(secs / (60 * 60))}`.slice(-2);

    let divisorForMinutes = secs % (60 * 60);
    let minutes = `${constants.ZERO}${Math.floor(divisorForMinutes / 60)}`.slice(-2);

    let divisorForSeconds = divisorForMinutes % 60;
    let seconds = `${constants.ZERO}${Math.ceil(divisorForSeconds)}`.slice(-2);

    let obj = {
      "h": hours,
      "m": minutes,
      "s": seconds
    };
    return obj;
  }

handleFlipClockImage = () => {
     var myObj = this.secondsToTime(seconds);

     Object.keys(myObj).forEach(key => {
     let obj = myObj[key];
     var digits = obj.split(constants.EMPTY_SPACE_CHAR);
     digits.forEach((digit, index) => {
        jquery(`#${this.state.label}${key}${index}`).css({backgroundPosition: -digit*50 });
        });
     });
}