Pra minha alegria, lembrei que eu já tinha brincado com isso na época do velho Mwords, daí fui lá atrás das funções e re-adaptei. Mostrar-lhes-ei agora:
Os códigos são tão simples que acho que não precisa de explicação detalhada. Só explico que os '?' que tem são para contornar as diferenças entre os navegadores (principalmente IE).
Pegando a posição atual do scroll e retornando em um objeto com as propriedades X e Y:
var w=window, d=document; //pega a posição atual do scroll mov.getScroll= function(){ return { x: (w.pageXOffset ? w.pageXOffset : de.scrollLeft ? de.scrollLeft : d.body.scrollLeft) || 0, y: (w.pageYOffset ? w.pageYOffset : de.scrollTop ? de.scrollTop : d.body.scrollTop) || 0 }; }; //exemplo de uso alert('Posição Y do scroll: ' + mov.getScroll().y);
Pegando a posição de determinado elemento na tela:
var w=window, d=document; //pega a posição correta do elemento na tela mov.objPos = function(obj) { var curl =0, curt = 0; if (obj.offsetParent) { do { curl += obj.offsetLeft; curt += obj.offsetTop; } while ((obj = obj.offsetParent)); return {x: curl, y: curt}; }else{ return {x: obj.offsetLeft, y:obj.offsetTop}; } }; //exemplo de uso alert('Posição real do elemento "viva" na tela: ' + mov.objPos(d.getElementById('viva') ) );
Fazendo a barra de rolagem se movimentar gradativamente
//variaveis var micox_mov_height= 50; //de quanto em quanto o scroll se moverá var micox_mov_fps = 20; //velocidade que o scroll se moverá //faz o slide mov.slide = function(ini,end){ if(!mov.sliding){ mov.sliding = true; //setando posição inicial var atual = mov.getScroll(); w.scrollTo(atual.x , ini); mov.inter = setInterval(function(){ var novoY, atual = mov.getScroll(); if(atual.y < end){ w.scrollTo(atual.x , atual.y + micox_mov_heigth); }else{ mov.sliding = false; clearInterval(mov.inter); } },1000/micox_mov_fps); } }
Em caso de dúvidas é só me perguntar.
Fonte: Meu blog ElMicox