Voici une façon assez simple de le faire. Tout d'abord, mettre en place un div contenant votre texte long:
<div id="container">
Here is the long content, long long content. So long. Too long.
</div>
Vous pouvez utiliser du code CSS pour gérer automatiquement la troncature et points de suspension:
div#container {
/* among other settings: see fiddle */
width: 200px;
overflow: hidden;
white-space: nowrap;
text-overflow: ellipsis;
}
Si vous déterminez ensuite la largeur native, non tronquée du contenu , vous pouvez utiliser le .animate()
de jQuery pour déplacer ce contenu à une vitesse constante - même si vous ne connaissez pas la longueur du texte avant l'exécution (comme ce serait le cas avec un fil Twitter). Voici une manière un peu mécanique d'obtenir la mesure:
var true_width = (function(){
var $tempobj = $('#container') // starting with truncated text div container
.clone().contents() // duplicate the text
.wrap('<div id="content"/>') // wrap it in a container
.parent().appendTo('body') // add this to the dom
.css('left','-1000px'); // but put it far off-screen
var result = $tempobj.width(); // measure it
$tempobj.remove(); // clean up
return result;
})();
Enfin, une animation:
$('#container').one('mouseenter', function(){ // perhaps trigger once only
var shift_distance = true_width - $(this).width(); // how far to move
var time_normalized = parseInt(shift_distance/100, 10) * 1000; // speed
$(this).contents().wrap('<div id="content">').parent() // wrap in div
.animate({
left: -shift_distance,
right: 0
}, time_normalized, 'linear'); // and move the div within its "viewport"
});
Quelle que soit la longueur du texte, vous obtiendrez une vitesse constante d'environ une seconde par 100 pixels (ajuster comme désiré). Réinitialiser ou rembobiner le contenu sur mouseleave est laissé comme un exercice. Cette approche a quelques bits naïfs, mais peut vous donner quelques idées.
Voici un exemple de travail: http://jsfiddle.net/redler/zdvyj/
merci pour le violon :) et le grand expl commentaires anatif – Purefan