的問題是,你必須運行不完全同步兩個獨立的動畫,你想到兩人的總百分比始終低於100%。當你同時啓動它們時,有時候這種情況不會發生,只要總數超過100%,最後一個就會被推到下一行。
最簡單的解決方法是稍微延遲一個正在增長的人,因此總數總是小於100%。您可以看到添加到第二個動畫的.delay(50),以確保增長的元素始終位於收縮元素的後面,因此總數始終小於100%。工作演示:http://jsfiddle.net/jfriend00/Fkb5K/。
的代碼段,其中的溶液中加入.delay(50)
:
if (!$el.hasClass('current'))
{
// Animate other columns to smaller size
$otherItems
.removeClass('curCol')
.stop(true)
.animate({ 'width': $closedItemsWidth }, 500, 'linear')
.css({"cursor":"pointer"});
// Animate current column to larger size
$el
.addClass('curCol')
.stop(true)
.delay(50)
.animate({ 'width' : $openItemWidth }, 500, 'linear')
.css({'cursor' : 'default'});
// Make sure the correct column is current
$otherItems.removeClass('curCol');
$el.addClass('curCol');
}
也許是最好的解決方案是一個自定義動畫改變在完全相同的動畫兩個寬度百分比(只有一個動畫,而不是兩個),所以它們總是在完美同步。
這是一個自定義動畫。它將刪除正在增長的元素的動畫,而是在所有較短的元素上添加一個步驟函數回調。任何時候,step函數都會調用其中一個元素更改動畫中的大小。在該步驟函數中,它將該時間點的較短元素的寬度相加,並設置較長的元素以每次完全追蹤100%的總和。
// On click
$grid.delegate('#grid > .col', 'click', function() {
// Settings
var $el = $(this);
var $allItems = $grid.children('.col');
var $otherItems = $allItems.not($el);
if (!$el.hasClass('current')) {
// Animate other columns to smaller size
$otherItems.stop(true)
.removeClass('curCol')
.animate({ 'width': $closedItemsWidth}, {step: function(prop, fx) {
var cumWidth = 0;
var item = this;
$otherItems.each(function() {
// haven't changed the width of this item yet, so use new width
if (this == item) {
cumWidth += fx.now;
} else {
cumWidth += parseFloat(this.style.width);
}
});
$el.css({width: (100 - cumWidth) + '%'});
}, duration: 500 }, 'linear')
.css({"cursor":"pointer"});
// Animate current column to larger size
$el.addClass('curCol').css({'cursor' : 'default'});
}
})
工作演示在這裏:http://jsfiddle.net/jfriend00/7zubL/
爲了幫助我們會非常需要看到你的代碼和HTML。你可以發佈[演示](http://jsfiddle.net/)嗎? –
我的小提琴鏈接不起作用? [測試鏈接](http://jsfiddle.net/DcuqW/)。嘗試不同大小的窗口來查看問題。感謝:-) – Piccolina