jQuery Marquee

I shopped around for a plugin but couldn't find what i was looking for so i knocked one up. welcome to the year 2000

by Nick Clarkson

HTML

<link rel="stylesheet" href="http://yui.yahooapis.com/3.12.0/build/cssreset/cssreset-min.css">
<div class="marquee">
    <ul>
        <li>One</li>
        <li>Two</li>
        <li>Three</li>
        <li>Four</li>
        <li>Five</li>
        <li>Six</li>
        <li>Seven</li>
        <li>Eight</li>
        <li>Nine</li>
        <li>Ten</li>
        <li>Eleven</li>
        <li>Twelve</li>
        <li>Thirteen</li>
        <li>Fourteen</li>
        <li>Fifteen</li>
        <li>Sixteen</li>
        <li>Seventeen</li>
        <li>Eighteen</li>
        <li>Nineteen</li>
        <li>Twenty</li>
    </ul>
</div>

CSS

body{
    text-align: center;
    padding: 20px;
}

.marquee{
    margin: auto;
    position: relative;
    overflow: hidden;
    background: #eee;
    height: 20px;
    max-width: 550px;
}

.marquee ul li{
    position: absolute;
}

JavaScript

var off = 10,
        l = off,
        $As = $('.marquee li'), 
        speed = 2,
        stack = [],
        pause = false;

    $.each($As, function(){
      var W = $(this).css({
        left: l
      }).width()+off;
      l+=W; 
      stack.push($(this));
    });

    var tick = setInterval(function(){
      if(!pause){
        $.each($As, function(){
          var ml = parseFloat($(this).css('left'))-speed;
          $(this).css({
            left: ml
          });
          if((ml+$(this).width()) < 0){
            var $first = stack.shift(),
                $last = stack[stack.length-1];
            $(this).css({
              left: (parseFloat($last.css('left'))+parseFloat($last.width()))+off
            });
            stack.push($first);
          }
        });
      }
    }, 1000/25);

    $('.marquee').on('mouseover', function(){
      pause = true;
    }).on('mouseout', function(){
      pause = false;
    });