2012-03-28 29 views
2

問題我在IE中正在旋轉一個圖像(時鐘指針)。下面的腳本在一定程度上工作(實際上有動畫正在進行),但它完全離軸旋轉。IE8中的Javascript/css

我決不是一個使用JavaScript/Jquery的智力遊戲,當談到如何在IE8中正確地做到這一點時,我有點失落。

代碼如下:

(function(jQuery) 
{ 
    jQuery.fn.clock = function(options) 
    { 
    var defaults = { 
     offset: '+0', 
     type: 'analog' 
    }; 
    var _this = this; 
    var opts = jQuery.extend(defaults, options); 

    setInterval(function() { 
     var seconds = jQuery.calcTime(opts.offset).getSeconds(); 
     if(opts.type=='analog') 
     { 
     var sdegree = seconds * 6; 
     var srotate = "rotate(" + sdegree + "deg)"; 
     var rad = Math.PI/180 * sdegree, 
      cos = Math.cos(rad), 
      sin = Math.sin(rad); 
     jQuery(_this).find(".sec").css({"-moz-transform" : srotate, "-webkit-transform" : srotate, "-ms-transform" : srotate, 
             'filter': "progid:DXImageTransform.Microsoft.Matrix(M11="+cos+", M12="+(-sin)+", M21="+sin+", M22="+cos+", SizingMethod='auto expand')"}); 
     } 
     else 
     { 
     jQuery(_this).find(".sec").html(seconds); 
     } 
    }, 1000); 

    setInterval(function() { 
     var hours = jQuery.calcTime(opts.offset).getHours(); 
     var mins = jQuery.calcTime(opts.offset).getMinutes(); 
     if(opts.type=='analog') 
     { 
     var hdegree = hours * 30 + (mins/2); 
     var hrotate = "rotate(" + hdegree + "deg)"; 
     var rad = Math.PI/180 * hdegree, 
      cos = Math.cos(rad), 
      sin = Math.sin(rad); 
     jQuery(_this).find(".hour").css({"-moz-transform" : hrotate, "-webkit-transform" : hrotate, "-ms-transform" : hrotate, 
             'filter': "progid:DXImageTransform.Microsoft.Matrix(M11="+cos+", M12="+(-sin)+", M21="+sin+", M22="+cos+", SizingMethod='auto expand')"}); 
     } 
     else 
     { 
     jQuery(_this).find(".hour").html(hours+':'); 
     } 
     var meridiem = hours<12?'AM':'PM'; 
     jQuery(_this).find('.meridiem').html(meridiem); 
    }, 1000); 

    setInterval(function() { 
     var mins = jQuery.calcTime(opts.offset).getMinutes(); 
     if(opts.type=='analog') 
     { 
     var mdegree = mins * 6; 
     var mrotate = "rotate(" + mdegree + "deg)"; 
     var rad = Math.PI/180 * mdegree, 
      cos = Math.cos(rad), 
      sin = Math.sin(rad); 
     jQuery(_this).find(".min").css({"-moz-transform" : mrotate, "-webkit-transform" : mrotate, "-ms-transform" : mrotate, 
             'filter': "progid:DXImageTransform.Microsoft.Matrix(M11="+cos+", M12="+(-sin)+", M21="+sin+", M22="+cos+", SizingMethod='auto expand')"});     
     } 
     else 
     { 
     jQuery(_this).find(".min").html(mins+':'); 
     } 
    }, 1000); 
    } 
})(jQuery); 


jQuery.calcTime = function(offset) { 
    d = new Date(); 
    utc = d.getTime() + (d.getTimezoneOffset() * 60000); 
    nd = new Date(utc + (3600000*offset)); 
    return nd; 
}; 
+1

你能再做一些特別的嗎? FIC?另外,試試拉斐爾。它在IE瀏覽器中工作,看起來很棒:http://raphaeljs.com/polar-clock.html – Blender 2012-03-28 16:06:29

+0

恐怕「不吉利」沒有描述代碼的確切問題... – Pointy 2012-03-28 16:20:21

+0

@Pointy更新了這個問題。雙手完全離開軸線旋轉。 – Plastika 2012-03-28 16:34:22

回答

0

檢查這個例子: 這是工作在IE瀏覽器...

createLine: function(x1, y1, x2, y2, options){ 

       // Check if browser is Internet Exploder ;) 
       var isIE = navigator.userAgent.indexOf("MSIE") > -1; 
       if (x2 < x1){ 
       var temp = x1; 
       x1 = x2; 
       x2 = temp; 
       temp = y1; 
       y1 = y2; 
       y2 = temp; 
       } 
       var line = document.createElement("div"); 
       line.className = "global_dashboard_line"; 

       // Formula for the distance between two points 
       // http://www.mathopenref.com/coorddist.html 
       var length = Math.sqrt((x1-x2)*(x1-x2) + (y1-y2)*(y1-y2)); 

       line.style.width = length + "px"; 
       line.style.borderColor = options.color; 
       line.style.zIndex = options.zindex; 
       line.style.borderWidth = options.stroke + " 0px 0px 0px"; 

       if(isIE){ 
       line.style.top = (y2 > y1) ? y1 + "px" : y2 + "px"; 
       line.style.left = x1 + "px"; 
       var nCos = (x2-x1)/length; 
       var nSin = (y2-y1)/length; 
       line.style.filter = "progid:DXImageTransform.Microsoft.Matrix(sizingMethod='auto expand', M11=" + nCos + ", M12=" + -1*nSin + ", M21=" + nSin + ", M22=" + nCos + ")"; 
       }else{ 
       var angle = Math.atan((y2-y1)/(x2-x1)); 
       line.style.top = y1 + 0.5*length*Math.sin(angle) + "px"; 
       line.style.left = x1 - 0.5*length*(1 - Math.cos(angle)) + "px"; 
       line.style.MozTransform = line.style.WebkitTransform = line.style.OTransform= "rotate(" + angle + "rad)"; 
       } 
       return line; 
      } 
    } 

這是一個插件的功能,我在HTML畫線做元素...它使用斜線進行旋轉。如果要檢查整個插件去: https://github.com/tbem/jquery.line

0

這應該在所有的瀏覽器,包括IE8工作:http://jsfiddle.net/SrSus/26/show/

HTML

<ul id="analog-clock" class="analog"> 
    <li class="hour"></li> 
    <li class="min"></li> 
    <li class="sec"></li> 
    <li class="meridiem"></li> 
</ul> 

的Javascript

(function ($) { 
    $.fn.clock = function (options) { 
     var self = this, 
      el, 
      msie8 = (/(msie) ([\w.]+)/i).test(navigator.userAgent), 
      defaults = { 
       offset: "+0" 
      }, 
      opts = $.extend(defaults, options), 
      calcTime = function (offset) { 
       var d = new Date(), 
        utc = d.getTime() + (d.getTimezoneOffset() * 60000), 
        nd = new Date(utc + (3600000 * offset)); 
       return nd; 
      }, 
      rotate = function (o, degree) { 
       var rotate = "rotate(" + degree + "deg)", 
        rad, cos, sin, w, h; 

       if (o.cur === degree) { 
        return; 
       } 
       o.cur = degree; 

       if (msie8) { 
        rad = (degree * Math.PI)/180; 
        cos = Math.cos(rad); 
        sin = Math.sin(rad); 

        o.el.css({ 
         'filter': 'progid:DXImageTransform.Microsoft.Matrix(sizingMethod="auto expand", M11 = ' + cos + ', M12 = ' + (-sin) + ', M21 = ' + sin + ', M22 = ' + cos + ')' 
        }); 

        w = o.el.width(); // obtain element sizes again 
        h = o.el.height(); 
        o.el.css({ 
         "marginLeft": -Math.round((w - o.w)/2), 
         "marginTop": -Math.round((h - o.h)/2) 
        }); 
       } 
       else { 
        o.el.css({ 
         "-moz-transform": rotate, 
         "-webkit-transform": rotate, 
         "-ms-transform": rotate, 
         "-sand-transform": rotate 
        }); 
       } 
      }; 


     // store elements and sizes 
     el = $(self).children(".sec"); 
     opts.sec = { el: el, w: el.width(), h: el.height(), cur: null }; 
     el = $(self).children(".hour"); 
     opts.hour = { el: el, w: el.width(), h: el.height(), cur: null }; 
     el = $(self).children(".min"); 
     opts.min = { el: el, w: el.width(), h: el.height(), cur: null }; 

     setInterval(function() { 
      var time = calcTime(opts.offset), 
       hours = time.getHours(), 
       mins = time.getMinutes(), 
       seconds = time.getSeconds(), 
       degree; 

      // hours 
      degree = hours * 30 + (mins/2); 
      rotate(opts.hour, degree); 

      // minutes 
      degree = mins * 6; 
      rotate(opts.min, degree); 

      // seconds 
      degree = seconds * 6; 
      rotate(opts.sec, degree); 
     }, 1000); 
    }; 
})($); 


$("#analog-clock").clock();