2010-02-11 87 views

回答

0

jQuery愛好者,雷米夏普,有自己的跑馬燈插件,可以實現很容易地。您可以通過his blog或訪問demo page來收集更詳細的信息。

對於MooTools的用戶,有Mooquee

您還可以在線查看此示例的實際代碼http://track.dc.gov/Resource/Script/ - 搜索「uiEndless」以查找目標腳本。

+0

感謝喬納森。我看看演示。這並不那麼順利。但它比選取標記更好。 – 2010-02-11 00:46:51

+0

@Vivek:平滑度將由您設置的選項決定。如果你做得很快,跳躍很多像素,它會出現生澀。如果你使它慢點,逐像素,它將是平穩的。 – Sampson 2010-02-11 00:48:55

+0

lemme嘗試一個真正的快速,看看 – 2010-02-11 00:50:27

1

他們的代碼是個非常好的格式塊,你可以學習。當您訪問網站時打開您最喜愛的JS調試器,等待所有內容移動,然後在調試器中按「全部中斷」或等效。你會看到如下內容:

Dashboard.UI.EndlessLine = function() { 
    var me = this; 
    me.jq = $(me); 
    me.classNames = { CONTAINER: "uiEndless", VIEW: "uiEndlessView", CANVAS: "uiEndlessCanvas", TILE: "uiEndlessTile" }; 
    var canvas = null; 
    var view = null; 
    var tiles = null; 
    var x = 0; 
    var xx = 0; 
    var canvasWidth = 0; 
    var step = 1; 
    var delay = 40; 
    me.initialize = function(container, data, handler) { 
     required(container, "container"); 
     required(data, "data"); 
     required(handler, "handler"); 
     container.addClass(me.classNames.CONTAINER); 
     view = newDiv(me.classNames.VIEW); 
     canvas = newDiv(me.classNames.CANVAS); 
     view.append(canvas); 
     container.append(view); 
     x = 0; 
     xx = 0; 
     canvasWidth = 0; 
     tiles = me.populateTiles(data, handler); 
     container.click(function() { 
      if (me.started()) me.stop(); else me.start(); 
     }); 
    }; 
    me._resize = function(size) { 
    }; 
    var moveId = 0; 
    me.start = function() { 
     me.stop(); 
     me.tick(); 
    } 
    me.stop = function() { 
     if (moveId > 0) clearTimeout(moveId); 
     moveId = 0; 
    } 
    me.started = function() { 
     return moveId > 0; 
    }; 
    me.tick = function() { 
     var tile = tiles.current(); 
     var width = tile.calculatedWidth; 
     if (x < width - step) { 
      x += step; 
     } else { 
      x = 0; 
      tile.css("left", canvasWidth + "px"); 
      if (tiles.advance()) { 
       xx = 0; 
       canvasWidth = 0; 
       do { 
        current = tiles.current(); 
        width = current.calculatedWidth; 
        current[0].style.left = canvasWidth + "px"; 
        canvasWidth += width; 
       } while (!tiles.advance()); 
      } else { 
       canvasWidth += width; 
      } 
     } 
     canvas[0].style.left = -(xx) + "px"; 
     xx += step; 
     moveId = setTimeout(me.tick, delay); 
    } 
    me.populateTiles = function(data, handler) { 
     var tiles = new Dashboard.Core.List(); 
     var viewWidth = view.contentWidth(); 
     var maxHeight = 0; 
     each(data, function() { 
      var tile = newDiv(me.classNames.TILE); 
      handler.call(this, tile); 
      tile.css({ left: canvasWidth + "px", top: 0 }); 
      canvas.append(tile); 
      var width = tile.outerWidth(); 
      var height = tile.outerHeight(); 
      if (maxHeight < height) maxHeight = height; 
      tile.calculatedWidth = width; 
      canvasWidth += width; // getting width may only be done after the element is attached to DOM 
      tiles.append(tile); 
      view.height(height); 
     }); 
     return tiles.createCycle(); 
    } 
} 

我留下了深刻的印象 - 一切都看起來專業和很好的命名空間。

更新:如果要解釋它是如何工作的,請關注上面定義的tick方法。粉飾所有的細節(因爲我還沒有真正研究過它自己),它計算的步長,在一定量的消息元素向左移動,並調度下一個節拍呼籲在未來40毫秒。

+0

非常令人印象深刻。你能告訴我如何輕鬆獲得這些代碼。即時通訊使用Firefox與螢火蟲。我沒有看到一個選項打破所有。非常感謝 – 2010-02-11 01:02:05

+0

@Vivek我其實更喜歡IE8進行調試。在IE8和Chrome中,有一個內置的調試器,提供了我提到的全部功能。在Firefox中,你需要Firebug(你有)。打開Firebug並點擊腳本標籤。確保它已啓用(您應該看到一堆源代碼)。在track.dc.gov標題下選擇「控制檯」(其中有一個下拉菜單,可讓您選擇您正在查看的腳本)下的「腳本」。然後點擊「||」 (看起來像一個暫停按鈕)在「控制檯」的左側。 – 2010-02-11 01:09:47

+0

非常感謝喬納森。我現在明白了。 – 2010-02-11 01:18:45