Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Scrolling text which is too long with jquery

I am trying to create a music player/centre online.

I have a player that plays the music and displays the current track:

The Player

As you can see from th title of the song it is too long for the div. What i would like to do is scroll the text and reset it an rescroll etc.

I have attempted this with the below code:

html:

<div id="top-bar">
<div id="player-container">
        <div id="player">
          <div id="level1">
            <div class="current-track"><h1><span id="title">Party All Night (Sleep All Day) -</span> Sean Kingston</h1></div>
            <div class="add-to-playlist"></div>
            <div class="share"></div>
          </div>
          <div class="clearfix"></div>
          <div id="level2">
            <div class="current-time">0:00</div>
            <div class="progress"><span id="slider"></span></div>
            <div class="total-time">3:43</div>
          </div>
        </div>
  </div>
</div>

Jquery:

$(function() {
    var scroll_text;
    $('div.current-track').hover(

    function() {
        var $elmt = $(this);
        scroll_text = setInterval(function() {
            scrollText($elmt);
        }, 5);
    }, function() {
        clearInterval(scroll_text);
        $(this).find('div.current-track h1').css({
            left: 0
        });
    });

    var scrollText = function($elmt) {
        var left = $elmt.find('div.current-track h1').position().left - 1;
        left = -left > $elmt.find('div.current-track h1').width() ? $elmt.find('div.current-track').width() : left;
        $elmt.find('div.current-track h1').css({
            left: left
        });
    };

});​​

Any pointer would be appriciated

Here is a jsfiddle for you guys: JSfiddle

UPDATE

Could anybody tell me:

  1. How to make this happen automatically? Done
  2. How to slow the scrolling? Done

Here is the updated jsfiddle for you guys: JSfiddle

like image 712
David Passmore Avatar asked Oct 28 '25 17:10

David Passmore


2 Answers

I think you are misunderstanding how jquery .find() works:

$elmt.find('div.current-track h1')

should be:

$elmt.find('h1')

http://jsfiddle.net/Dn6jx/5/

edit: updated fiddle for comments

http://jsfiddle.net/Dn6jx/15/

like image 122
jbabey Avatar answered Oct 31 '25 07:10

jbabey


Added check to see if text is long enough to require scrolling, removed the clear interval, and wrapped in plugin.

JSFiddle update

$.fn.scrolltxt = function() {
    var options = $.extend({
        speed : 28
    }, arguments[0] || {});

    return this.each(function() {
        var el = $(this);

        if( el.find('span').width() > el.parent().width() ) {
            var scroll_text = setInterval(function() {
                scrollText();
            }, options.speed);
        };      

        var scrollText = function() {
            var width = el.width(),                
                left = el.position().left - 1;
            left = -left > width ? width : left;
            el.css({left: left});
        };
    });    };

$('.current-track h1').scrolltxt();
like image 24
Holiday Mat Avatar answered Oct 31 '25 07:10

Holiday Mat