2017-09-13 13 views
0

私がスパンとして持っているボックスに、テキストを完全に水平に表示できるように幅をautoにします。私がそれをautoに変更すると、私のアニメーションが損なわれます。デフォルトでは幅の値は50ピクセルなので、うまく動作します。固定幅を 'auto'に変更するとアニメーションが歪んでいます

http://jsfiddle.net/31n7r699/

#horizontalScroller > span { 
position:absolute; 


width:50px; 
__width:auto; 

height:50px; 
left: -50px; 
border: 1px solid blue; 
overflow:hidden; 
display:inline-block; 
background:red; 

} 
+0

このようなもの[JSFIddle](http://jsfiddle.net/qjoxdquh/)の高さも調整できますが、これを 'auto'に設定することもできます –

+0

それは私のためにうまくいきます –

+0

@Risa__B変更幅:50px幅:自動 – yavg

答えて

2

あなたは自分のCSSでの簡単な変更を必要としています。

#horizontalScroller > span { 
    position:absolute; 
    // make it width auto 
    width:auto; 
    // put it far far far away from the view to prevent the blink thingy at start 
    left: 999px; 
    border: 1px solid blue; 
    background:red; 
    // make it nowrap, this will prevent the span from forcing the text from being displayed in the container 
    white-space: nowrap; 
    // remove this, <span> are inline-block by default 
    // this do not work also as this is position: absolute; 
    // display: inline-block; 
} 

更新日:

あなたのソリューションであるだけ関与の要素は、一貫性の幅を持っているので、それはいくつかの文章が短く、それ本当の意味なければならないときに他の人が長くなっているとして、彼らは一貫性のない幅を持っている場合、それが壊れる作業。あなたは彼らのそれぞれの幅を適切に配置する上で考慮に入れる必要があり、この問題解決するには:

$elem.animate({ left: (parseInt(left)-60) }, 900, function() { 
    var currentLeft = parseInt($(this).css("left")); 
    var width  = $(this).width(); 
    var container = $(this).parent("#horizontalScroller"); 
    var containerWidth = $(container).width(); 

    if ((currentLeft + width) <= 0) 
    { 
    // instead of putting it at the end of the container 
    // $(this).css("left", (containerWidth + width) + "px"); 

    // we need to put it beside the last element in the list 
    var children = $(container).children(); 
    // get the last item 
    var lastChild = children[children.length - 1]; 
    // get the lastChild X and W 
    var lastChildX = parseInt($(lastChild).css("left")); 
    var lastChildW = $(lastChild).width(); 
    var padding = 20; 
    var X   = lastChildX + lastChildW + padding; 

    // position this element beside the last item 
    $(this).css("left", X + "px"); 
    // move this element beside the last item 
    // literally moving the element beside the last item in the DOM to make this solution fully functional 
    $(this).insertAfter(lastChild); 
} 

    window.horizontalScroller($(this)) 
}); 

working fiddle

:アニメーションのコールバックで、その後

$(document).ready(function() { 
    var container = $("#horizontalScroller"); 
    var children = $(container).children(); 
    var containerW = $(container).width(); 
    // simply the space between them 
    var padding = 10; 

    for (var i = 0; i < children.length; i++) 
    { 
     var item = children[i]; 
     var itemW = $(item).width(); 
     // position the first item with X = container width + padding 
     var X  = containerW + padding; 

     // we need to properly position the elements beside each other 
     // specially if they have different widths 
     // i > 0 because there is no sibling on 0 
     if (i > 0) 
     { 
     // get the element before this 
     var sibling = children[i - 1]; 
     // get the siblings X and W 
     var siblingX = parseInt($(sibling).css("left")); 
     var siblingW = $(sibling).width(); 
     // position this element beside the sibling by: 
     // X = sibling X + sibling W + padding 
     X = siblingX + siblingW + padding; 
     } 

     $(item).css("left", X + "px"); 
     window.horizontalScroller($(item)); 
    } 
}); 

を、あなたもこのソリューションを行う必要があります

ほんとに助けてください

+0

もう一度おねがいしますが、第4スパンを終えたときに。https://i.imgur.com/K8uk9jm.jpg :( – yavg

+0

私は事前に教えてくれる、これは一貫した幅を持っているためです。なぜですか?ビューの外に既に現れているテキストを考えてみましょう_X + item W <0_ 'BUT'しかし、まだ表示されていないスーパーの長いテキストがあります_X + item W> container W_何が起こりますか移動した要素が重なってしまうので、完成した要素を未完成の要素の最後に配置することを考慮する必要があります。そのため、この問題が発生します。 – masterpreenz

+0

あなたの知性は不思議です。これを回避するには – yavg

関連する問題