Spella
Spella

Reputation: 139

Javascript focus element on class active

I have lines text which able the user to push the next arrow (on keyboard) to change / move active word, so the user can focus on the 'red color word'.

The problem is, the height of the element have limit (in this case is 200px) and I want to make the user focus on active word (when the active word reach the middle of element) on the middle of element.

Please help me.. Thank you

document.onkeydown = pressKey;
function pressKey(e) {
    e = e || window.event;
    if (e.keyCode == '39') {
        var word = $('pre span.active');
        if($(word).next('span').length){
            $(word).next().addClass('active');
            $(word).removeClass('active');
        }
        
        // THIS is the line of the problem 
        $('pre').animate({ scrollTop: $('span.active').offset().top - ( $(window).height() - $('span.active').outerHeight(true) ) / 2  }, 10);
    }
    if (e.keyCode == '37') {
        var word = $('pre span.active');
        if($(word).prev('span').length){
            $(word).prev().addClass('active');
            $(word).removeClass('active');
        }
        
        // THIS is the line of the problem
        $('pre').animate({ scrollTop: $('span.active').offset().top - ( $(window).height() - $('span.active').outerHeight(true) ) / 2  }, 10);
    }
}
pre {max-height:200px;}
span.active {color:red}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="text">
  <span class="active">click this element then push arrow next (keyboard)</span>
  <span>All</span> <span>I</span> <span>want</span>
  <span>is</span> <span>when</span>
  <span>user</span> <span>push</span> <span>next</span> <span>arrow</span>
  <span>until</span> <span>the</span> <span>active</span>
  <span>class</span> <span>reach</span> <span>the</span> <span>middle</span>
  <span>of</span> <span>this</span> <span>element</span> <span>then</span>
  <span>automatically</span> <span>move</span> <span>the</span> <span>scroll</span>
  <span>to</span> <span>keep</span> <span>the</span>
  <span>active</span> <span>class</span> <span>on</span>
  <span>the</span> <span>middle</span> <span>of</span>
  <span>element</span> <span>so</span>
  <span>the</span> <span>user</span> <span>have</span>
  <span>focus</span> <span>on</span> <span>the</span>
  <span>middle</span> <span>of</span> <span>this</span> <span>element</span>
  <span>also</span> <span>when</span> <span>the</span> <span>user</span>
  <span>push</span> <span>prev</span> <span>arrow</span> <span>minim</span>
  <span>veniam</span> <span>quis</span> <span>nostrud</span>
  <span>excertitation</span> <span>ullaco</span> <span>laboris</span>
  <span>lorem</span> <span>ipsum</span> <span>dolor</span>
  <span>sit</span> <span>amet</span>
  <span>consectetur</span> <span>adispicing</span> <span>elit</span>
  <span>sed</span> <span>do</span> <span>eiusmod</span>
  <span>tempor</span> <span>incididunt</span> <span>ut</span> <span>labore</span>
  <span>et</span> <span>dolore</span> <span>magna</span> <span>aliqua</span>
  <span>ut</span> <span>enim</span> <span>ad</span> <span>minim</span>
  <span>veniam</span> <span>quis</span> <span>nostrud</span>
  <span>excertitation</span> <span>ullaco</span> <span>laboris</span>
  <span>lorem</span> <span>ipsum</span> <span>dolor</span>
  <span>sit</span> <span>amet</span>
  <span>consectetur</span> <span>adispicing</span> <span>elit</span>
  <span>sed</span> <span>do</span> <span>eiusmod</span>
  <span>tempor</span> <span>incididunt</span> <span>ut</span> <span>labore</span>
  <span>et</span> <span>dolore</span> <span>magna</span> <span>aliqua</span>
  <span>ut</span> <span>enim</span> <span>ad</span> <span>minim</span>
  <span>veniam</span> <span>quis</span> <span>nostrud</span>
  <span>excertitation</span> <span>ullaco</span> <span>laboris</span>
</pre>

Upvotes: 4

Views: 221

Answers (1)

Brandon Hill
Brandon Hill

Reputation: 1890

You should use position not offset, and add the existing scrollTop property (since it affects the position):

document.onkeydown = pressKey;
var pre = $('pre');
function pressKey(e) {
    e = e || window.event;
    if (e.keyCode == '39') {
        var word = $('pre span.active');
        if($(word).next('span').length){
            $(word).next().addClass('active');
            $(word).removeClass('active');
        }
        
        var scrollTop = pre[0].scrollTop + $('span.active').position().top - pre.height() / 2;
        pre.animate({ scrollTop: scrollTop }, 10);
    }
    if (e.keyCode == '37') {
        var word = $('pre span.active');
        if($(word).prev('span').length){
            $(word).prev().addClass('active');
            $(word).removeClass('active');
        }
        
        var scrollTop = pre[0].scrollTop + $('span.active').position().top - pre.height() / 2;
        pre.animate({ scrollTop: scrollTop }, 10);
    }
}
pre {max-height:200px}
span.active {color:red}
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<pre id="text">
  <span class="active">click this element then push arrow next (keyboard)</span>
  <span>All</span> <span>I</span> <span>want</span>
  <span>is</span> <span>when</span>
  <span>user</span> <span>push</span> <span>next</span> <span>arrow</span>
  <span>until</span> <span>the</span> <span>active</span>
  <span>class</span> <span>reach</span> <span>the</span> <span>middle</span>
  <span>of</span> <span>this</span> <span>element</span> <span>then</span>
  <span>automatically</span> <span>move</span> <span>the</span> <span>scroll</span>
  <span>to</span> <span>keep</span> <span>the</span>
  <span>active</span> <span>class</span> <span>on</span>
  <span>the</span> <span>middle</span> <span>of</span>
  <span>element</span> <span>so</span>
  <span>the</span> <span>user</span> <span>have</span>
  <span>focus</span> <span>on</span> <span>the</span>
  <span>middle</span> <span>of</span> <span>this</span> <span>element</span>
  <span>also</span> <span>when</span> <span>the</span> <span>user</span>
  <span>push</span> <span>prev</span> <span>arrow</span> <span>minim</span>
  <span>veniam</span> <span>quis</span> <span>nostrud</span>
  <span>excertitation</span> <span>ullaco</span> <span>laboris</span>
  <span>lorem</span> <span>ipsum</span> <span>dolor</span>
  <span>sit</span> <span>amet</span>
  <span>consectetur</span> <span>adispicing</span> <span>elit</span>
  <span>sed</span> <span>do</span> <span>eiusmod</span>
  <span>tempor</span> <span>incididunt</span> <span>ut</span> <span>labore</span>
  <span>et</span> <span>dolore</span> <span>magna</span> <span>aliqua</span>
  <span>ut</span> <span>enim</span> <span>ad</span> <span>minim</span>
  <span>veniam</span> <span>quis</span> <span>nostrud</span>
  <span>excertitation</span> <span>ullaco</span> <span>laboris</span>
  <span>lorem</span> <span>ipsum</span> <span>dolor</span>
  <span>sit</span> <span>amet</span>
  <span>consectetur</span> <span>adispicing</span> <span>elit</span>
  <span>sed</span> <span>do</span> <span>eiusmod</span>
  <span>tempor</span> <span>incididunt</span> <span>ut</span> <span>labore</span>
  <span>et</span> <span>dolore</span> <span>magna</span> <span>aliqua</span>
  <span>ut</span> <span>enim</span> <span>ad</span> <span>minim</span>
  <span>veniam</span> <span>quis</span> <span>nostrud</span>
  <span>excertitation</span> <span>ullaco</span> <span>laboris</span>
</pre>

Upvotes: 5

Related Questions